同步執行模式:
所謂同步執行模式,是指語句在同步執行模式下,將始終保持對程式流的控制,直至 程式結束。如查詢操作,客戶機上的應用程式在向伺服器發出查詢操作的指令後,將 一直等待伺服器將查詢結果返回客戶機端,然後才繼續進行下一步操作。
眾所周知,應用程式要從一個大表中刪除所有的記錄將是非常耗時的,如果應用程式 採用的是單線程(thread)同步執行方式,某次刪除工作很可能耽誤其他重要工作的完 成。如果應用程式等待的是遠程任務,那麼遠程伺服器失敗或網路故障或一些無法預 知的情況都可能使應用程式無限期地等下去,這是同步執行最大的缺陷。
但是同步執行模式可以簡化程式編製的複雜性。程式員可以不用過多地瞭解比較複雜 的ODBC 2.0 API 的使用,而只需使用 ODBC 的同步執行模式或使用資料控制項和資料庫物件變數來編寫應用程式,可以提高開發效率,但程式運行速度比不上非同步執行 模式的速度。
非同步執行模式:
所謂非同步執行模式,是指語句在非同步執行模式下,各語句執行結 束的順序與語句執行開始的順序並不一定相同。例如 查詢操作,客戶機上的應用程式在向伺服器發出了查 詢操作的指令後,將立刻執行查詢語句指令的下一條 語句,而不需要等到伺服器將查詢結果返回客戶機端。 非同步執行方式使應用程式能擺 脫單個任務的牽制,提高了靈活性和應用程式的執行 效率。但非同步執行模式也存在一些問題,如它增加了 編程的複雜性,特別是編寫互用性(interoperable)要求較高 的程式。
在負荷很重的客戶/伺服器系 統中,適宜採用非同步執行模式。在這種環境下,時間 延遲頻繁且漫長,相比之下非同步執行的開銷微不足 道。但是,如果應用啟動並執行環境比較複雜,則必須建 立一套完整的機制,周期性地檢查函數執行的狀態, 以決定下一步執行方案。進行周期的檢查可以有多種方法,如在 應用中設定計時器並處理WM_TIMER資訊等。
雖然使用非同步執行模式在編程 序時十分複雜,但可以實現多任務並存執行,使執行的效率大大提高。
選擇並設定執行模式 在應用程式開發中選擇同步模式還是非同步模式,是一個比 較複雜的層次。當查詢或對資料庫的修改相對簡單時,同步執行模式是一種 很好的選擇,它能夠在幾秒 或更少的時間內返回結果資料。另外,在應用程式獲 得結果集前不能繼續執行時,根本不必要使用非同步執 行模式。在複雜查詢情況下,特別是複雜的多行資料 庫的UPDATE 或DELETE 操作,可能需要很長的時間才能完成, 需採用非同步執行模式,讓使用者可以同時對程式的其他 部分進行操作。
對於一般程式員來說,如果他對同步執行模式與非同步執行模式不瞭解, 他往往會在對伺服器發出一個動作陳述式(查詢或讀取一條記錄等 操作)後,立該引用伺服器返回的執行結果,或者對該 結果進行下一步操作,這是很危險的。因為,在非同步 執行模式下,客戶機上的後續語句是在該動作陳述式發 出後接著執行的,但由於各種原因,伺服器不一定能 執行完該動作陳述式,並在後續語句執行前將結果返回 客戶機。因此,後續語句在引用前一動作陳述式的執行 結果時,往往會因為該執行結果並不存在而引用了錯 誤的值,造成系統錯誤或死結,所以在實際應用中應
根據具體情況謹慎選擇執行模式。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
這是MSDN上的解釋:
在用戶端發出一個方法調用後,用戶端將被阻塞,直至調用返回為止,這種方式被稱為同步處理。也就是說,在用戶端等待期間它不能執行任何代碼。若使用非同步處理,就可以在等待期間讓用戶端做其它的事情。
多線程可認為是非同步.
單線程可認為是同步的!
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
轉載自:http://xmuzyq.iteye.com/blog/783218
在高效能的I/O設計中,有兩個比較著名的模式Reactor和Proactor模式,其中Reactor模式用於同步I/O,而Proactor運用於非同步I/O操作。
在比較這兩個模式之前,我們首先的搞明白幾個概念,什麼是阻塞和非阻塞,什麼是同步和非同步,同步和非同步是針對應用程式和核心的互動而言的,同步指的是使用者進程觸發IO操作並等待或者輪詢的去查看IO操作是否就緒,而非同步是指使用者進程觸發IO操作以後便開始做自己的事情,而當IO操作已經完成的時候會得到IO完成的通知。而阻塞和非阻塞是針對於進程在訪問資料的時候,根據IO操作的就緒狀態來採取的不同方式,說白了是一種讀取或者寫入操作函數的實現方式,阻塞方式下讀取或者寫入函數將一直等待,而非阻塞方式下,讀取或者寫入函數會立即返回一個狀態值。
一般來說I/O模型可以分為:同步阻塞,同步非阻塞,非同步阻塞,非同步非阻塞IO
同步阻塞IO:
在此種方式下,使用者進程在發起一個IO操作以後,必須等待IO操作的完成,只有當真正完成了IO操作以後,使用者進程才能運行。JAVA傳統的IO模型屬於此種方式!
同步非阻塞IO:
在此種方式下,使用者進程發起一個IO操作以後邊可返回做其它事情,但是使用者進程需要時不時的詢問IO操作是否就緒,這就要求使用者進程不停的去詢問,從而引入不必要的CPU資源浪費。其中目前JAVA的NIO就屬於同步非阻塞IO。
非同步阻塞IO:
此種方式下是指應用發起一個IO操作以後,不等待核心IO操作的完成,等核心完成IO操作以後會通知應用程式,這其實就是同步和非同步最關鍵的區別,同步必須等待或者主動的去詢問IO是否完成,那麼為什麼說是阻塞的呢?因為此時是通過select系統調用來完成的,而select函數本身的實現方式是阻塞的,而採用select函數有個好處就是它可以同時監聽多個檔案控制代碼,從而提高系統的並發性!
非同步非阻塞IO:
在此種模式下,使用者進程只需要發起一個IO操作然後立即返回,等IO操作真正的完成以後,應用程式會得到IO操作完成的通知,此時使用者進程只需要對資料進行處理就好了,不需要進行實際的IO讀寫操作,因為真正的IO讀取或者寫入操作已經由核心完成了。目前Java中還沒有支援此種IO模型。
搞清楚了以上概念以後,我們再回過頭來看看,Reactor模式和Proactor模式。
首先來看看Reactor模式,Reactor模式應用於同步I/O的情境。我們分別以讀操作和寫操作為例來看看Reactor中的具體步驟:
讀取操作:
1. 應用程式註冊讀就需事件和相關聯的事件處理器
2. 事件分離器等待事件的發生
3. 當發生讀就需事件的時候,事件分離器調用第一步註冊的事件處理器
4. 事件處理器首先執行實際的讀取操作,然後根據讀取到的內容進行進一步的處理
寫入操作類似於讀取操作,只不過第一步註冊的是寫就緒事件。
下面我們來看看Proactor模式中讀取操作和寫入操作的過程:
讀取操作:
1. 應用程式初始化一個非同步讀取操作,然後註冊相應的事件處理器,此時事件處理器不關注讀取就緒事件,而是關注讀取完成事件,這是區別於Reactor的關鍵。
2. 事件分離器等待讀取操作完成事件
3. 在事件分離器等待讀取操作完成的時候,作業系統調用核心線程完成讀取操作,並將讀取的內容放入使用者傳遞過來的緩衝區中。這也是區別於Reactor的一點,Proactor中,應用程式需要傳遞緩衝區。
4. 事件分離器捕獲到讀取完成事件後,啟用應用程式註冊的事件處理器,事件處理器直接從緩衝區讀取資料,而不需要進行實際的讀取操作。
Proactor中寫入操作和讀取操作,只不過感興趣的事件是寫入完成事件。
從上面可以看出,Reactor和Proactor模式的主要區別就是真正的讀取和寫入操作是有誰來完成的,Reactor中需要應用程式自己讀取或者寫入資料,而Proactor模式中,應用程式不需要進行實際的讀寫過程,它只需要從緩衝區讀取或者寫入即可,作業系統會讀取緩衝區或者寫入緩衝區到真正的IO裝置.
綜上所述,同步和非同步是相對於應用和核心的互動方式而言的,同步 需要主動去詢問,而非同步時候核心在IO事件發生的時候通知應用程式,而阻塞和非阻塞僅僅是系統在調用系統調用的時候函數的實現方式而已。