UNIX網絡編程——網絡I/O模型

在學習UNIX網絡編程的時候。一開始分不清 同步 和 異步,因此仍是總結一下,理清下他們的差異比較好。編程

IO分類

IO依據對IO的調度方式可分爲堵塞IO、非堵塞IO、IO複用、信號驅動IO、異步IO。markdown

IO操做整個流程分爲 可操做推斷 和 實際IO操做 兩個區間,咱們可以稱之爲兩個半程,前半程推斷是否可操做,後半程進行實際操做。網絡

當中堵塞IO、非堵塞IO、IO複用、信號驅動IO因爲其【實際的IO操做是同步堵塞】的,因此通常把他們歸爲同步IO,異步IO的實際IO操做是在獨立的線程中完畢的,因此稱爲異步IO。異步

可以看出,所謂同步異步。針對的是後半程的實際IO。在同步IO中,系統並不主動告訴咱們不論什麼信息,需要咱們去詢問。而在異步IO中,系統將主動告訴咱們IO已經完畢了。函數

數據流向

數據是怎樣從用戶程序傳到網絡上的呢?post

如下以一個進程從內核接收數據到響應再到對方收到響應的過程爲例:學習

內核讀數據
->
推數據到用戶態
->
切換到用戶態
->
應用程序處理數據並構造響應數據
->
推數據到內核態
->
內核打包數據
->
發送數據
->
對方內核對數據拆包
->
推數據到用戶態線程

IO模型介紹

堵塞IO:服務堵塞在數據接收操做上。直到client數據到達並複製到本地進程數據區。比方調用系統調用read以後。假設沒數據,則一直停留在內核的系統調用中,直到有數據了纔將數據從內核複製到用戶空間以後返回用戶態。進程

這裏寫圖片描寫敘述

非堵塞IO:服務不斷地往返於用戶態和內核態直接。輪詢數據是否可讀。一旦可讀則堵塞的讀取數據到本地進程數據區,屬於前半程輪詢,後半程堵塞模式。事件

這裏寫圖片描寫敘述

IO複用:前半程堵塞(select堵塞),但僅僅要有一個IO套接字可用則啓動後半程讀取進程。

這裏寫圖片描寫敘述

信號驅動IO:前半程是一個異步機制,註冊一個信號驅動事件,在數據可讀的時候經過SIGIO信號驅動後半程的觸發,其和IO複用的差異在於前半程是一個信號驅動機制。

異步IO:調用IO時提供回調函數。IO做爲獨立線程完畢實際讀取及準備工做,到數據複製到本地數據區後經過回調函數調用原調用者進行處理。

這裏寫圖片描寫敘述

相關文章
相關標籤/搜索