軟件架構設計中的同步與異步問題_第1頁
軟件架構設計中的同步與異步問題_第2頁
軟件架構設計中的同步與異步問題_第3頁
軟件架構設計中的同步與異步問題_第4頁
軟件架構設計中的同步與異步問題_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

軟件架構設計中的同步與異步問題BLOGLIOU內(nèi)容概要:本文分析了大型程序系統(tǒng)設計中經(jīng)常需要面對的同步和異步結(jié)構問題。列舉異步結(jié)構模式實現(xiàn)手段,論證異步模式效率遠遠優(yōu)越于同步模式,證明在硬件資源理想情況下,對同步模式而言并發(fā)量對計算機系統(tǒng)的平均交易處理時間沒有影響,對異步模式而言平均交易處理時間會隨著并發(fā)量的增大而急劇下降,最終也趨向一個恒定值。在實際有限計算機資源情況下,程序設計必須設置最大并發(fā)量以控制并發(fā)程度,否則過多并發(fā)量會形成交易對硬件資源的競爭,造成交易的擁塞。關鍵詞:同步,異步,消息隊列,效率,并發(fā)基本概念同步和異步問題是大型程序設計中需要慎重等待的問題,但目前這方面的討論很少,本文就試圖進行有關方面討論。一個大型的程序系統(tǒng)常常是由很多不能功能模塊組成的。程序系統(tǒng)運行時不同功能模塊要按一定順序執(zhí)行,以協(xié)同完成一件任務。功能模塊協(xié)作運行完成一件任務存在同步和異步兩種方式。如果在某一時間段,這個程序系統(tǒng)的所有功能模塊都在為完成相同的一件任務而服務,某一個功能模塊在完成一件任務的子任務后,需要等待其他功能模塊完成子任務,這樣只有當全部功能模塊按順序完成一件任務后,程序系統(tǒng)才能接收下一個任務,功能模塊是串行運行,這稱之為同步模式。反之,在某一時間段,這個程序系統(tǒng)的不同功能模塊可以獨立運行完成一件任務的子任務,無須等待其他功能模塊完成子任務就可以繼續(xù)處理下一件任務的子任務,功能模塊是并行運行,這稱之為異步模式。打個比方,在一個生產(chǎn)流水線上有A和B兩道工序,如果工位A完成自己任務,把任務傳遞給工位B后,需要等待工位B完成工序后,工位A才能開始下一件產(chǎn)品工作,這就是同步模式。如果工位A在把任務傳遞給工位B后,工位A不等待工位B是否完成任務,就開始下一件產(chǎn)品的任務處理,這就是異步模式。又比如,現(xiàn)代戰(zhàn)斗機發(fā)射導彈過程也經(jīng)歷了從"同步”走向"異步”的過程。早期的導彈性能還不太完善,戰(zhàn)斗機發(fā)射導彈后,需要飛行員照顧導彈飛行,直到導彈命中目標,這就是"同步”過程。后來,導彈性能越來越先進,出現(xiàn)了"發(fā)射后不管”導彈,即戰(zhàn)斗機發(fā)射完導彈后,導彈會自動尋找并擊中目標,飛行員發(fā)射導彈后可以不再管導彈飛行過程,不再理會導彈是否會命中目標,而可以開始捕捉下一個目標,這就是"異步”過程。反映在OLTP程序系統(tǒng)中,一個交易就是一個任務。如程序系統(tǒng)一次只完成一個交易,在這個交易沒有完成前,程序系統(tǒng)不接受其他交易,這就是同步模式。如程序系統(tǒng)把交易任務分拆成幾個獨立的子進程,每個子進程獨立完成交易的一個子任務,幾個子進程同時運行,這就是異步模式。由于交易在模塊之間是按照一定順序運行的,所以對一個具體交易而言,模塊之間任務執(zhí)行時并不表現(xiàn)為并行運行,但對大批量交易的宏觀效果而言,模塊之間卻是表現(xiàn)為并行運行。實現(xiàn)問題在多功能模塊的程序系統(tǒng)設計中,最重要的是要考慮模塊之間的通信或數(shù)據(jù)傳遞。同步結(jié)構的程序?qū)崿F(xiàn)很簡單,常見情況是把所有功能模塊編譯在同一個程序中,這樣實現(xiàn)數(shù)據(jù)共享不難,有些情況是利用函數(shù)參數(shù)傳遞共享數(shù)據(jù),通過CALL調(diào)用,來執(zhí)行下一個功能模塊,所以同步結(jié)構的功能模塊一般是不能獨立運行的,但通信模塊除外,因為同步的通信模塊本身就可以通過SOCKET等通信機制來傳遞共享數(shù)據(jù),所以是可以獨立運行的。異步結(jié)構的實現(xiàn)稍微復雜一些。因為要求異步結(jié)構程序系統(tǒng)的不同功能模塊作為獨立進程能夠獨立運行,但在非通信進程模塊之間,在進程間就存在共享數(shù)據(jù)鴻溝,每個獨立進程就象一個個信息孤島,這就要求進程間能夠?qū)崿F(xiàn)通信以在進程間傳遞數(shù)據(jù)。在UNIX系統(tǒng)平臺上,提供了進程間通信(InterprocessCommunications)即IPC機制。IPC種類很多,有:帶鎖機制的規(guī)則文件(Regularfileswithlocking)--可以對規(guī)則文件使用適當?shù)逆i機制,用文件作為共享數(shù)據(jù)載體來實現(xiàn)進程間通信、管道(PIPES)、SOCKETS、信號(Signals)等。以上幾種IPC方式在普通進程間通信是有缺陷的。使用帶鎖機制的規(guī)則文件,因為要讀寫硬盤文件,所以效率低,而且文件要上鎖以保證多個進程不能同時修改一個文件,所以會造成進程等待而影響效率。SOCKETS主要是用來進行通信程序設計,管道和信號不能共享大量數(shù)據(jù)。在普通進程間要實現(xiàn)數(shù)據(jù)共享,實際有效通信的常用IPC工具是這三種:消息隊列(MessageQueue)、共享內(nèi)存(SharedMemory)信號燈(Semaphores)在實際應用系統(tǒng)開發(fā)中,消息隊列使用得最多。消息隊列實際上就是一個可以讀寫應用數(shù)據(jù)的內(nèi)存塊。它可以被不同的進程讀寫。比如下圖表示有三個進程向一個消息隊列寫信息,有一個進程從該隊列中讀取信息。圖1消息隊列示意圖在消息隊列的基礎上,一些廠商提供了性能更好、功能更多的"消息隊列”產(chǎn)品,即MessageQ,簡稱MQ,如IBM公司的MQSeries(現(xiàn)在叫webSphereMQ)、BEA公司的MQ,國內(nèi)有的軟件公司也開發(fā)了自己的MQ產(chǎn)品。這些MQ的出現(xiàn)為大型異步結(jié)構程序的進程間通信設計提供了強有力的開發(fā)工具。在AS/400系統(tǒng)平臺上,OS/400操作系統(tǒng)提供了DataQueue(DTAQ)目標對象,DTAQ與消息隊列類似,從而為AS/400上的異步結(jié)構程序開發(fā)提供了良好實現(xiàn)工具。效率問題這里的效率狹義講就是程序系統(tǒng)運行快慢問題。異步模式在速度上遠遠快于同步模式,這是一個軟件設計和生活常識。但有些人卻認為同步結(jié)構的程序效率要優(yōu)于異步結(jié)構的程序,有的人也難以理解異步模式為什么會比同步模式效率高,那么我們就來具體分析同步結(jié)構程序和異步結(jié)構程序的效率優(yōu)劣。以OLTP系統(tǒng)為例,完成一個交易平均所需時間是評價OLTP程序系統(tǒng)性能的最重要指標。假設某種典型交易需要A、B、C三個順序任務來完成,相應地有A、B、C三個功能模塊。假設A、B、C三個模塊完成各自任務所需時間分別是Ta、Tb、Tc。對于同步結(jié)構程序來說,系統(tǒng)完成一個交易所需時間理所當然應該為三個模塊的簡單累加,即Ta+Tb+Tc。但對于異步結(jié)構程序來說,由于程序系統(tǒng)被分成了幾個獨立進程,每個進程需要增加額外的時間s來處理進程間通信,這樣異步程序完成這樣一個交易所需時間應該是(Ta+s)+(Tb+s)+(Tc+s)。因為(Ta+s)+(Tb+s)+(Tc+s)>;Ta+Tb+Tc據(jù)此一些人所以認為同步程序所以比異步程序效率高。然而,他們卻忽視了一個重要問題,就是在實際業(yè)務運行時往往是大批量交易同時運行。假設現(xiàn)在有N筆交易需要程序系統(tǒng)來處理,在同步程序未進行并發(fā)機制處理條件下,由于同步程序一次只能做一個交易,交易是串行完成,所以完成N筆交易時間應該是一次交易時間的N次簡單累加,即N*(Ta+Tb+Tc),從宏觀看,同步模式完成N筆交易,處理總的時間是N*(Ta+Tb+Tc),所以平均交易處理時間也就是一個交易的執(zhí)行時間:Ta+Tb+Tc。如果從用戶的角度來看,每個人在等待時并不理會別人是否在等待,因為他等待的時間都是屬于他自己的,這樣每個人的平均等待時間就是(1+2+3+..+n)*(Ta+Tb+Tc)/N=(N+1)/2*(Ta+Tb+Tc)但是這個時間并不是系統(tǒng)處理交易的平均執(zhí)行時間。所以在理想計算機系統(tǒng)同步模式下,并發(fā)量對交易平均處理時間沒有影響,并不會隨著并發(fā)量的增大而增大。對于異步程序來說,首先假設在多CPU計算機系統(tǒng)理想情況下,由于多個CPU完全能夠支持各個進程同時獨立運行,假設A、B、C三個進程同時接到N筆任務,就象一條生產(chǎn)流水線上三個工位同時處理N筆任務,由于三個進程同時運行處理,這樣從宏觀結(jié)果來看,程序系統(tǒng)平均完成一個交易所需時間只相當于那個最慢的進程所需時間,比如生產(chǎn)流水線上最慢的那個工位完成了N筆任務,那么實際上整個流水線也就完成了N筆任務,因為其他工位的任務早已經(jīng)完成了。所費時間最大相差誤差也就是一個交易或一個任務的時間,這個時間也就是流水線上最慢那個工位之前的工位在處理第一個交易的時間加上最慢那個工位之后的工位在處理最后一個交易時的時間,加起來正好是一個交易的時間。而這一個交易或一個任務的時間相對于N筆任務所費時間是可以完全忽略不計的。簡單地說,兩個人同時吃飯,甲吃飯花了1個小時,乙吃飯花了2個小時,那么他們都吃完飯的時間應該是2小時,而不是1+2=3小時。實際上一個餐廳工作模式就是一個異步模式,因為一個餐廳同一時間能夠供許多人就餐,而不是只容許一個人吃完了才容許下一個人就餐。圖2異步結(jié)構程序工作示意圖假設C進程最慢,這樣一來異步程序完成這N筆交易所需時間約接近于(N+1)*(Tc+s),平均處理時間約等于(N+1)/N*(Tc+s)。即交易平均處理時間與并發(fā)量的關系類似于y=a+b/x。所以在多CPU計算機系統(tǒng)理想情況異步模式下,交易平均處理時間會隨著并發(fā)量的增大而急劇下降,最終也趨向一個恒定值。但大批量情況下異步結(jié)構程序平均單筆交易處理時間顯然要遠遠小于同步結(jié)構的程序。圖3多CPU理想情況下交易平均交易處理時間與并發(fā)量關系那么在單CPU計算機系統(tǒng)下結(jié)果又如何呢?表面上看單CPU需要分片處理多任務,似乎完成同步結(jié)構的交易要比異步結(jié)構的交易要快,但實際上在絕大多數(shù)應用系統(tǒng)中,CPU利用率是很低的,通常是在百分之十幾以下,這是因為應用程序通常都要花費大量時間與其他外設打交道,比如讀寫文件,有的應用程序自身還有額外的其他等待時間等等,這些過程是不占用CPU時間的。以此考慮,異步結(jié)構程序與在多CPU理想情況下的運行情況很相似。但畢竟受限于單CPU的處理能力,所以異步結(jié)構程序會隨著自身進程數(shù)的多少和進程復雜度,其運行效率會相應下降。在有限并發(fā)量情況下,平均交易處理時間與并發(fā)量關系曲線與在多CPU理想情況下相似。所以如果只運行一個或幾個簡單交易,同步結(jié)構的程序也許要比異步結(jié)構的程序快,但實際情況卻是應用系統(tǒng)要在短時間內(nèi)處理大批量的交易,所以顯然異步結(jié)構的程序效率要遠遠快于同步結(jié)構的程序。異步結(jié)構的程序能夠最大限度地利用CPU的處理能力,而同步結(jié)構的程序則在CPU處理能力的利用上造成極大浪費。尤其是在多CPU計算機系統(tǒng)上,每增加一個CPU,異步結(jié)構程序效率就能提高一大臺階,而同步結(jié)構程序因無法利用多CPU處理能力,所以對其效率幾乎沒有影響。在商業(yè)應用計算機系統(tǒng)中,絕大多數(shù)都是多CPU的系統(tǒng),所以異步和同步結(jié)構的應用程序孰優(yōu)孰劣一目了然。就象在規(guī)模大、人數(shù)多的公司內(nèi),如果再增加一個新餐廳,那么就餐效率就會大大提高一樣。現(xiàn)在許多大型商業(yè)軟件都采用異步模式的程序設計結(jié)構,為滿足異步程序開發(fā)的需求,IBM、BEA等公司推出的專門用于進程間通信的MQ中間件產(chǎn)品就是很好的異步結(jié)構程序開發(fā)工具。并發(fā)問題上節(jié)已經(jīng)證明,在理想情況下,對于同步模式來說并發(fā)量實際上對交易平均處理時間沒有什么影響。相反,在異步模式下交易平均處理時間會隨著并發(fā)量的增大而急劇下降,即處理速度越來越快,最終也趨向一個恒定值。而我們常常說到的"軟件能夠支持最大并發(fā)量”實際上并不是效率問題,而是程序設計利用硬件資源問題!即程序設計結(jié)構和硬件資源共同限制了并發(fā)量。在大批量業(yè)務處理情況下,同步結(jié)構的程序必須使用并發(fā)機制才能保證程序系統(tǒng)的處理速度,否則系統(tǒng)一次只能處理一個交易,要等待該交易完成后才能接受下一個交易,在大量交易并發(fā)情況下前臺客戶等待時間就會很長,即客戶平均等待時間等于(N+1)/2*單筆交易處理時間,這樣的系統(tǒng)速度在大批量交易并發(fā)情況下常常是不能被接受的。異步結(jié)構的程序由于已經(jīng)分成多個進程,每個進程都不等待地處理自己的任務,所以異步結(jié)構的程序一般情況下甚至無需進行并發(fā)處理,就可以滿足大批量交易處理要求。當然異步結(jié)構的程序每個進程都可以再進行并發(fā)處理,這樣每個進程的處理速度都能大大得到提高。所謂并發(fā)處理一般是通過fork函數(shù)調(diào)用,來復制自己,產(chǎn)生許多個與自己一模一樣的子進程來同時并行處理進入程序系統(tǒng)的多個交易。所以說并發(fā)程序設計實際上是一種特殊的異步結(jié)構程序設計。而所謂最大并發(fā)量往往是由系統(tǒng)可使用內(nèi)存、MQ容量等來限制的。在同步程序結(jié)構設計中,由于多個功能模塊常常編譯在一個程序內(nèi),這樣在進行并發(fā)處理時,程序必須復制自身全部代碼。而程序代碼是要占用內(nèi)存空間的。假設程序系統(tǒng)有A、B、C三個功能模塊組成,每個模塊的代碼量為Ma、Mb、Mc,假設同時有N個交易申請任務,如果同步結(jié)構程序采取并發(fā)機制,則程序必須同時復制N個自身,這樣就有N*(Ma+Mb+Mc)代碼量需要占據(jù)內(nèi)存,這是相當可觀的,往往交易量一大就會突破內(nèi)存可使用容量。而異步結(jié)構程序通常情況下甚至無需fork自身就可滿足需求,即使需要fork進程,也可以靈活地有選擇地對那些速度慢的瓶頸進程進行fork,所以占用內(nèi)存代碼量相對較小,且代碼利用率高,不象同步結(jié)構程序的許多代碼處于白占內(nèi)存的等待閑置狀態(tài),所以在同樣的計算機系統(tǒng)環(huán)境下,異步結(jié)構的程序往往比同步結(jié)構的程序具有更大的容許并發(fā)量。所以異步結(jié)構的程序能夠更有效率利用硬件資源,而同步結(jié)構的程序則對硬件資源造成很大的浪費(過度浪費CPU,過度占用內(nèi)存)。在采用并發(fā)機制的程序中,應該根據(jù)程序代碼量和內(nèi)存、MQ等大小以及CPU處理能力等來估算最大并發(fā)量,并在程序中設置參數(shù)來進行控制。如果不加控制,一旦并發(fā)進程數(shù)超過內(nèi)存或MQ的最大容許量,有可能引起如系統(tǒng)死機等不可預測結(jié)果。而且,并發(fā)進程如果過多,超過硬件資源允許度,則進程之間容易競爭系統(tǒng)資源,造成進程的擁塞,影響交易運行速度。這就象一個公司規(guī)模很大,就餐人數(shù)多,而餐廳規(guī)模小,不能同時供應這么多人就餐,那么只好限制同一時間就餐人數(shù),用延長就餐時間來彌補。比如在通信程序中,經(jīng)常需要考慮并發(fā)連接的問題,這就需要在SERVER端設置成并發(fā)機制的服務器,需要設置最大并發(fā)連接參數(shù)。在SOCKET接口函數(shù)中已經(jīng)提供了這個功能,這是通過在LISTEN函數(shù)的參數(shù)中進行設置來實現(xiàn)的。假設同步進程并發(fā)處理N筆交易,在理想情況下,就是說在一個交易時間內(nèi)系統(tǒng)處理了N筆交易,那么平均處理時間即為(Ta+Tb

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論