Linux網絡IO模型簡介

Linux網絡IO模型簡介


Linux的內核將所有外設看作一個文件來操作,對於一個文件的讀寫操作,會調用內核提供的系統命令,返回一個fd (file description 文件描述符),而對於一個socket的讀寫也會有相應的描述符,稱爲socketfd(socket 描述符),描述符就是一個數字,它指向內核中的一個結構體(文件路徑,數據區等一些屬性)。

一、阻塞IO模型

java進程讀取數據,調用recvfrom,其系統調用直到數據包到達(磁盤到內核緩衝區),且被複制(從內核緩衝區到進程緩衝區)或者發生錯誤,才返回,在此期間進程一致阻塞,因此稱爲阻塞IO模型。

eg:釣魚的時候,一直拿着魚竿,等魚兒咬鉤將魚兒拉上來。魚兒相當於數據包,釣魚者相當於進程。

二、非阻塞IO模型

recvfrom調用後,如果內核緩衝區沒有數據,則返回一個error,然後直接返回,等待一段時間再去看內核緩衝區有沒有數據,如此這般輪詢。

eg:釣魚的時候,可以去喝喝水,聊聊天,隔段時間看看魚竿有沒有動靜。

三、IO複用信號模型

Linux提供select/poll,進程通過將一個或多個fd傳遞個select或poll系統調用,阻塞在select操作上,這樣select/poll可以同時偵測多個fd是否處於就緒狀態,某個fd就緒就將內核緩衝區的數據拷貝到進程緩衝區。

eg:同時擺上多個魚竿,由垂釣者看着,某個有動靜就將某個拉上來。

、四、信號驅動IO模型

進程讀取數據時,系統調用recvfrom直接返回,此時進程是非阻塞的,當內核緩衝區數據準備好後,通知recvfrom進行數據的複製。(會註冊一個信號處理函數),

eg:買了一個帶有提醒功能的魚竿釣魚。

五、異步IO模型

進程讀取數據,在整個操作完成之後(磁盤到內核緩衝區,內核緩衝區到進程緩衝區)通知進程IO操作已經完成。

eg:魚竿具有自動釣魚功能,可以將魚兒收到魚簍中。

信號驅動與異步IO的比較

信號驅動的內核緩衝區到進程緩衝區這個過程依然是同步的,它的通知,僅是代表IO操作可以進行。

異步IO整個過程都是異步的,它的通知代表IO操作已經完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章