Linux I/O網絡模型

Linux內核將所有外部設備都看作一個文件來操作,而對一個一個文件的讀寫操作會調用內核提供的系統命令,
返回一個file descriptor(即fd,文件描述符)。
描述符是一個數字,它指向內核中的一個結構體(文件路徑、數據區等屬性)

因此對socket的讀寫操作,會返回一個socketfd(socket描述符)

Unix提供5種I/O模型
1. 阻塞I/O模型:默認條件下,所有文件操作都是阻塞的。
   以socket爲例,在進程中調用recvfrom,直到數據包到達並且複製到應用的緩衝區或者報錯,
   recvfrom函數纔會返回,否則會一直等待。
   進程在調用recvfrom時,從開始到返回結果整段時間進程都是阻塞的,一直等待幹不了別的。

在這裏插入圖片描述

2.非阻塞I/O模型:對內核緩衝區進行輪詢,直到有數據。
  調用recvfrom從應用層到內核時,若緩衝區沒有數據,就直接返回一個EWOULDBLOCK錯誤,
  並且一般都對非阻塞I/O模型進行輪詢檢查這個狀態,查看內核緩衝區中數據來了沒。

在這裏插入圖片描述

3.I/O複用模型:基於Linux的select/epoll,掃描fd是否就緒。
  Linux提供 select/epoll(epoll是基於事件驅動,即fd就緒將就立刻返回,而poll是順序掃描),
  進程將一個或多個fd傳遞給select或epoll系統調用,並阻塞在select操作上,這樣select/epoll
  就可以幫我們偵測多個fd是否就緒,即是否這個fd有數據。就緒時立刻回調函數rollback。

在這裏插入圖片描述

4.信號驅動I/O模型:使用信號來通知進程數據已就緒,不用阻塞進程。
  1.先開啓套接口信號驅動I/O功能
  2.並通過系統調用sigaction執行一個信號處理函數(該系統調用立刻返回,非阻塞)
  3.當數據準備就緒,爲該進程生成一個SIGIO信號,通過信號通知進程調用recvfrom函數。

在這裏插入圖片描述

5.異步I/O:通知內核將整個流程完成後通知進程。
  1.告知內核啓動某個操作,並讓內核將整個操作完成(包括將數據從內核複製到用戶自己的緩衝區),再通知進程。
  2.與信號驅動I/O模型對比:
    信號驅動是由內核通知進程何時開始I/O操作;
    異步I/O是由內核通知進程何時完成I/O操作;

在這裏插入圖片描述

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