1. 程式人生 > >訊息傳遞機制(通訊)

訊息傳遞機制(通訊)

一 同步和非同步(執行緒)

在維基百科中的釋義是:在計算機程式設計中,非同步,指的是獨立於主程式流發生的事件,以及處理該事件的方式。這些可能是“外部”事件,例如訊號的到達,或由程式發起的操作,該操作與程式同時/併發的執行,而程式不需要阻塞的等待結果。非同步的輸入(input)/輸出(output)是導致非同步的一個例子,讓程式向儲存或網路裝置發出命令,而處理器繼續執行程式。這樣做提供了一定程度的並行性。

在一個程式設計介面中處理非同步的一種常見方法是提供子程式(方法、函式),這些子程式(方法、函式)返回給它們的呼叫者一個物件,有時稱為future或promise,用來表示正在進行的事件。這樣的物件通常會伴隨著一個同步操作,直到操作完成為止。一些程式語言,如Cilk,具有用於表示非同步過程呼叫的特殊語法。

當您同步執行某個操作時,您需要等待它完成,然後再執行另一個任務。當您非同步執行某個任務時,您可以在完成另一個任務之前繼續執行

也就是說,在計算機上下文中,這意味著在另外一個“執行緒”上執行一個過程或任務。執行緒是作為工作單元存在的一系列命令(程式碼塊)。作業系統可以管理多個執行緒,並在切換到另一個執行緒之前,為其分配一段處理器時間使它可以做一些工作。而在核心上(指的是CPU的核心),一個處理器可以簡單地執行一個命令,它不需要同時做兩件事。作業系統通過將時間片分配給不同的執行緒來模擬這個過程。 
現在,如果您使用多個核心/處理器的話,那麼事情實際上可能同時發生。作業系統可以將時間分配給第一個處理器上的一個執行緒,然後將同樣的時間塊分配給另一個處理器上的另一個執行緒。所有這些都是關於允許作業系統管理任務的完成,而您可以在程式碼中繼續執行其他任務。

同步(單執行緒):

1 thread ->   |<---A---->||<----B---------->||<------C----->|
  •  

同步(多執行緒):

thread A -> |<---A---->|   
                        \  
thread B ------------>   ->|<----B---------->|   
                                              \   
thread C ---------------------------------->   ->|<------C----->| 
  •  

非同步 (單執行緒):

         A-Start ------------------------------------------ A-End   
           | B-Start -----------------------------------------|--- B-End   
           |    |      C-Start ------------------- C-End      |      |   
           |    |       |                           |         |      |
           V    V       V                           V         V      V      
1 thread->|<-A-|<--B---|<-C-|-A-|-C-|--A--|-B-|--C-->|---A---->|--B-->| 
  • 比較難理解,可以理解為一個人邊吃放邊看電視,同時進行(個人觀點)

非同步 (多執行緒):

thread A ->     |<---A---->|
 thread B ----->     |<----B---------->| 
 thread C --------->     |<------C--------->|
  •  

1.上圖中的“|”標識的時間切片 
2.“<” 和 “>”標識的是過程或者任務的開始於結束

二 同步傳輸/非同步傳輸

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校驗碼),以便對資料塊進行差錯控制。所謂同步傳輸是指資料塊與資料塊之間的時間間隔是固定的,必須嚴格地規定它們的時間關係。

三 阻塞 與非阻塞

阻塞與非阻塞可以理解為“等待狀態”。 
阻塞就是在呼叫結果返回之前,執行緒一直在等待結果。 
非阻塞則是在不能立刻得到結果之前,執行緒不會一直等待結果。 
還是以逛淘寶為例,在等待客服回覆時,阻塞相當於你的精力一直放在與客服聊天的頁面上,客服不回覆爺爺就不走了。非阻塞就相當於你還是有一部分精力放在與客服聊天的頁面上,不過同時你也可以幹其他的事情(注意是可以,你也可以不幹其他任何事,就坐在那裡發呆)

阻塞與非阻塞與是否同步非同步無關。就上面淘寶的例子——同步阻塞:等待客服的同時,不幹任何事情,也就是說你坐在電腦面前發呆、浪費時間;同步非阻塞:先做一會兒其他的事情,再回頭看客服有沒有回覆,沒有的話再做一會兒其他的事情在回來看;非同步阻塞:在客服回覆之前,你明明可以離開聊天頁面去幹別的事情,但你丫非要等客服回覆,相當於在非同步等待。非同步非阻塞:在客服回覆之前,離開聊天頁面去幹別的事情,直到客服回覆你才回去繼續聊天。

從原理上講非同步也是可以有阻塞和非阻塞的,但實際上對非同步討論阻塞、非阻塞意義不大,一般阻塞和非阻塞是針對同步的。

四 訊息是透傳

1、透傳:指與傳輸網路的介質、調製解調方式、傳輸方式、傳輸協議無關的一種資料傳送方式

這就好比快遞郵件,郵件中間有可能通過自行車、汽車、火車、飛機的多種組合運輸方式到達您的手上,但您不用關心它們中間經歷了哪些。

 

2、為什麼要透傳呢?
透傳一般都是用來讀取遠端的串列埠資料。例如:網咖內每個上網者都要刷身份證才能上網,但身份證資料庫不可能放在每個網咖內。所以就將讀卡器的串列埠資料通過透傳回傳到公安局,在公安局的平臺上來比對身份證號碼。