非同步

設備需求簡單的通訊方式

非同步:一種通訊方式,對設備需求簡單。我們的PC機提供的標準通信介面都是非同步的。非同步雙方不需要共同的時鐘,也就是接收方不知道發送方什麼時候發送,所以在發送的信息中就要有提示接收方開始接收的信息,如開始位,同時在結束時有停止位。非同步的另外一種含義是計算機多線程的非同步處理。與同步處理相對,非同步處理不用阻塞當前線程來等待處理完成,而是允許後續操作,直至其它線程將處理完成,並回調通知此線程。但此處需要明確的是:非同步與多線程與并行不是同一個概念.

C#中的非同步


非同步的概念和同步相對。
非同步,線程,并行。三個概念是不同的.

線程

線程是進程中某個單一順序的控制流。也被稱為輕量進程(lightweight processes).計算機科學術語,指運行中的程序的調度單位.
當一個非同步過程調用發出后,調用者不能立刻得到結果。實際處理這個調用的部件在完成後,通過狀態、通知和回調來通知調用者。以CAsyncSocket類為例(注意,CSocket從CAsyncSocket派生,但是其功能已經由非同步轉化為同步),當一個客戶端通過調用Connect函數發出一個連接請求后,調用者線程立刻可以朝下運行。當連接真正建立起來以後,socket底層會發送一個消息通知該對象。這裡提到執行部件和調用者通過三種途徑返回結果:狀態、通知和回調。可以使用哪一種依賴於執行部件的實現,除非執行部件提供多種選擇,否則不受調用者控制。如果執行部件用狀態來通知,那麼調用者就需要每隔一定時間檢查一次,效率就很低(有些初學多線程編程的人,總喜歡用一個循環去檢查某個變數的值,這其實是一種很嚴重的錯誤)。如果是使用通知的方式,效率則很高,因為執行部件幾乎不需要做額外的操作。至於回調函數,其實和通知沒太多區別。

并行

一般指并行計算,是說同一時刻有多條指令同時被執行,這些指令可能執行於同一CPU的多核上,或者多個CPU上,或者多個物理主機甚至多個網路中.
非同步
與同步相對應,非同步指的是讓CPU暫時擱置當前請求的響應,處理下一個請求,當通過輪詢或其他方式得到回調通知后,開始運行。多線程將非同步操作放入另一線程中運行,通過輪詢或回調方法得到完成通知,但是完成埠,由操作系統接管非同步操作的調度,通過硬體中斷,在完成時觸發回調方法,此方式不需要佔用額外線程。

異同點


非同步和多線程兩者都可以達到避免調用線程阻塞的目的,從而提高軟體的可響應性。
非同步操作無須額外的線程負擔,並且使用回調的方式進行處理,在設計良好的情況下,處理函數可以不必使用共享變數(即使無法完全不用,最起碼可以減少 共享變數的數量),減少了死鎖的可能。當然非同步操作也並非完美無暇。編寫非同步操作的複雜程度較高,程序主要使用回調方式進行處理,與普通人的思維方式有些 出入,而且難以調試。當需要執行I/O操作時,使用非同步操作比使用線程+同步 I/O操作更合適。
多線程中的處理程序依然是順序執行,符合普通人的思維習慣,所以編程簡單。但是多線程的缺點也同樣明顯,線程的使用(濫用)會給系統帶來上下文切換的額外負擔。並且線程間的共享變數可能造成死鎖的出現。多線程的適用範圍則是那種需要長時間CPU運算的場合,例如耗時較長的圖形處理和演演算法執行。

通信


簡介

在通信中,“非同步通信”是一種很常用的通信方式。非同步通信在發送字元時,所發送的字元之間的時間間隔可以是任意的。當然,接收端必須時刻做好接收的準備(如果接收端主機的電源都沒有加上,那麼發送端發送字元就沒有意義,因為接收端根本無法接收)。發送端可以在任意時刻開始發送字元,因此必須在每一個字元的開始和結束的地方加上標誌,即加上開始位和停止位,以便使接收端能夠正確地將每一個字元接收下來。非同步通信的好處是通信設備簡單、便宜,但傳輸效率較低(因為開始位和停止位的開銷所佔比例較大)。
非同步通信也可以是以幀作為發送的單位。接收端必須隨時做好接收幀的準備。這時,幀的首部必須設有一些特殊的比特組合,使得接收端能夠找出一幀的開始。這也稱為幀定界。幀定界還包含確定幀的結束位置。這有兩種方法。一種是在幀的尾部設有某種特殊的比特組合來標誌幀的結束。或者在幀首部中設有幀長度的欄位。需要注意的是,在非同步發送幀時,並不是說發送端對幀中的每一個字元都必須加上開始位和停止位后再發送出去,而是說,發送端可以在任意時間發送一個幀,而幀與幀之間的時間間隔也可以是任意的。在一幀中的所有比特是連續發送的。發送端不需要在發送一幀之前和接收端進行協調(不需要先進行比特同步)。

差錯類型

非同步通信過程中,可能發生通信錯,一般有3種錯誤:
幀格式錯:在應該接收到停止位的時候,接收到邏輯的“0”,便產生幀格式錯誤。
奇偶錯:接收到的奇偶校驗位錯。
復蓋錯:通信介面接收到數據並存放到數據輸入寄存器中,但是CPU沒有及時來取,後面新接收的數據復蓋了前面收到的數據,叫做復蓋錯。
發生幀格式錯和奇偶錯的原因可能為下面幾種:
(1)發送和接收雙方採用了不同的傳輸率,或雖然雙方約定了相同的傳輸率,但傳輸率不可能絕對相等。在通信的速率比較高的情況下,如果雙方的傳輸率誤差達到一定的程度,也會造成通信出錯;
(2)通信雙方採用了不相同的幀格式;
(3)干擾。