1. 程式人生 > >程序同步和非同步--詳解

程序同步和非同步--詳解

程序同步用來實現程式併發執行時候的可再現性。

一.程序同步及非同步的概念

1.程序同步:就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事.就像早上起床後,先洗涮,然後才能吃飯,不能在洗涮沒有完成時,就開始吃飯.按照這個定義,其實絕大多數函式都是同步呼叫(例如sin,isdigit等)。但是一般而言,我們在說同步、非同步的時候,特指那些需要其他部件協作或者需要一定時間完成的任務。最常見的例子就是

sendmessage。該函式傳送一個訊息給某個視窗,在對方處理完訊息之前,這個函式不返回。當對方處理完畢以後,該函式才把訊息處理函式所返回的lresult值返回給呼叫者。

2.非同步

非同步的概念和同步相對。當一個非同步過程呼叫發出後,呼叫者不能立刻得到結果。實際處理這個呼叫的部件在完成後,通過狀態、通知和回撥來通知呼叫者。

以casycsocket類為例(注意,csocket從casyncsocket派生,但是其功能已經由非同步轉化為同步),當一個客戶端通過呼叫connect函式發出一個連線請求後,呼叫者執行緒立刻可以朝下執行。當連線真正建立起來以後,socket底層會發送一個訊息通知該物件。

這裡提到執行部件和呼叫者通過三種途徑返回結果:狀態、通知和回撥。可以使用哪一種依賴於執行部件的實現,除非執行部件提供多種選擇,否則不受呼叫者控制。如果執行部件用狀態來通知,那麼呼叫者就需要每隔一定時間檢查一次,效率就很低(有些初學多執行緒程式設計的人,總喜歡用一個迴圈去檢查某個變數的值,這其實是一種很嚴重的錯誤)。如果是使用通知的方式,效率則很高,因為執行部件幾乎不需要做額外的操作。至於回撥函式,其實和通知沒太多區別。

程序同步的基本概念

在計算機系統中,由於資源有限而導致了程序之間的資源競爭和共享,因此,程序的併發執行不僅僅是使用者程式的執行開始時間的隨機性和提高資源利用率的結果,也是資源有限性導致資源的競爭與共享對程序的執行過程進行制約所造成的。那麼,在程序的併發執行過程中存在哪些制約呢?

二.同步與非同步傳輸:

1.非同步傳輸

通常,非同步傳輸是以字元為傳輸單位,每個字元都要附加 1 位起始位和 1 位停止位,以標記一個字元的開始和結束,並以此實現資料傳輸同步。所謂非同步傳輸是指字元與字元(一個字元結束到下一個字元開始)之間的時間間隔是可變的,並不需要嚴格地限制它們的時間關係。起始位對應於二進位制值 0,以低電平表示,佔用 1 位寬度。停止位對應於二進位制值 1,以高電平表示,佔用 1~2 位寬度。一個字元佔用 5~8位,具體取決於資料所採用的字符集。例如,電報碼字元為 5 位、ASCII碼字元為 7 位、漢字碼則為8 位。此外,還要附加 1 位奇偶校驗位,可以選擇奇校驗或偶校驗方式對該字元實施簡單的差錯控制。傳送端與接收端除了採用相同的資料格式(字元的位數、停止位的位數、有無校驗位及校驗方式等)外,還應當採用相同的傳輸速率。典型的速率有:9 600 b/s、19.2kb/s、56kb/s等。

非同步傳輸又稱為起止式非同步通訊方式,其優點是簡單、可靠,適用於面向字元的、低速的非同步通訊場合。例如,計算機與Modem之間的通訊就是採用這種方式。它的缺點是通訊開銷大,每傳輸一個字元都要額外附加2~3位,通訊效率比較低。例如,在使用Modem上網時,普遍感覺速度很慢,除了傳輸速率低之外,與通訊開銷大、通訊效率低也密切相關。

2. 同步傳輸

通常,同步傳輸是以資料塊為傳輸單位。每個資料塊的頭部和尾部都要附加一個特殊的字元或位元序列,標記一個數據塊的開始和結束,一般還要附加一個校驗序列 (如16位或32位CRC校驗碼),以便對資料塊進行差錯控制。所謂同步傳輸是指資料塊與資料塊之間的時間間隔是固定的,必須嚴格地規定它們的時間關係。

三.同步阻塞與非同步阻塞:

同步是阻塞模式,非同步是非阻塞模式。 

我的理解:同步是指兩個執行緒的執行是相關的,其中一個執行緒要阻塞等待另外一個執行緒的執行。非同步的意思是兩個執行緒毫無相關,自己執行自己的。 

同步是指:傳送方發出資料後,等接收方發回響應以後才發下一個數據包的通訊方式。 

非同步是指:傳送方發出資料後,不等接收方發回響應,接著傳送下個數據包的通訊方式。 

舉個不太恰當的例子,就像: 

SendMessage(...) 

TRACE0("just  like  send"); 

PostMessage(...) 

TRACE0("just  like  WSASend  using  overlapped"); 

 SendMessage是呼叫的時候不返回,等訊息響應後才執行TRACE0,這就是同步. 

PostMessage是呼叫後馬上返回,不用訊息響應就執行TRACE0,這就是非同步.

四.其它解釋:

 同步和非同步的區別

 舉個例子:普通B/S模式(同步)AJAX技術(非同步)

同步:提交請求->等待伺服器處理->處理完畢返回 這個期間客戶端瀏覽器不能幹任何事

非同步: 請求通過事件觸發->伺服器處理(這是瀏覽器仍然可以作其他事情)->處理完畢

同步就是你叫我去吃飯,我聽到了就和你去吃飯;如果沒有聽到,你就不停的叫,直到我告訴你聽到了,才一起去吃飯。

非同步就是你叫我,然後自己去吃飯,我得到訊息後可能立即走,也可能等到下班才去吃飯。

所以,要我請你吃飯就用同步的方法,要請我吃飯就用非同步的方法,這樣你可以省錢。

舉個例子 打電話時同步 發訊息是非同步