在unix下可用的5種i/o模型為:
柱塞i/o模型
非柱塞i/o模型
i/o復用(select和poll)
訊號驅動式i/o(sigio)
非同步i/o
柱塞式i/o模型
最流行的i/o模型是柱塞式i/o模型,預設情況下所有套接字都是用柱塞的,以資料報套接字為例子,如圖:
程序呼叫recvfrom,其系統呼叫指導資料報到達且被複製到應用程序的緩衝區中或發生錯誤才返回,最常見的錯誤是系統呼叫被訊號中斷,程序在從呼叫recvfrom開始到它開始返回的整段時間是被柱塞的,recvfrom成功返回後,應用程式開始處理資料報。
非柱塞式i/o模型
程序把乙個套接字設定成非柱塞是在通知核心:當所請求的i/o操作非得把程序投入睡眠才能完成時,不要把程序投入睡眠,而是返回乙個錯誤,如圖:
前三次呼叫recvfrom時沒有資料返回,因此核心轉而立即返回乙個ewouldblock錯誤,第四次呼叫recvfrom時,已有資料報準備好,它被複製到應用程序緩衝區,於是recvfrom成功返回,然後接著處理資料。當乙個應用程式像這樣對乙個非柱塞描述符迴圈呼叫recvfrom時,我們稱之為輪詢(poll)。
i/o復用模型
有了i/o復用,我們就可以呼叫select或poll,柱塞在這兩個系統呼叫中的某乙個之上,而不是柱塞在真正的i/o系統呼叫上如圖所示:
我們柱塞於select呼叫,等待資料報套接字變為可讀,當select返回套接字可讀這一條件時,我們呼叫recvfrom把所有資料報複製到應用程序緩衝區
訊號驅動式i/o模型
我們也可以用訊號,讓核心在描述符就緒時傳送sigio訊號通知我們,我們稱這種模型為訊號驅動式i/o。如圖所示:
首先開啟套接字的訊號驅動式i/o功能,並通過sigaction系統呼叫安裝乙個訊號處理函式,該系統呼叫將立即返回,然後程序繼續工作,也就是說它沒有被阻塞。當資料報準備好讀取時,核心就為程序產生乙個sigio訊號,隨後既可以在訊號處理函式中呼叫recvfrom讀取資料報,並通知主迴圈,讓它讀取資料報。
無論如何處理sigio訊號,這種模式的優勢在於等待資料報到達期間程序不被阻塞。主迴圈可以繼續執行,只要等待來自訊號處理函式的通知:既可以是資料已準備好唄處理,也可以是資料報已準備好被讀取。
非同步i/o模型
訊號驅動式i/o是由核心通知我們何時可以啟動乙個i/o操作,而非同步i/o模型是由核心通知i/o操作何時完成,如圖所示:
呼叫aio_read函式,給核心傳遞描述符、緩衝區指標、緩衝區大小和檔案偏移,並告訴核心當整個操作完成時如何通知我們。該系統呼叫立即返回,而且在等待i/o完成期間,我們的程序不被阻塞。
套接字i o模型
當套接字建立時,預設情況下是工作在阻塞模式。在阻塞模式下,執行i o的winsock呼叫 如send 和recv 一直到操作完成時才返回。比如呼叫recv 函式,如果對應的緩衝區沒有資料到來。呼叫者將會一直等待下去,直到有資料到達為止。1 阻塞 blocking 模型 對於以下函式呼叫 int ir...
Windows套接字I O模型
兩中模式執行i o操作 阻塞模式 執行i o的winsock呼叫 如send和recv 一直到操作完成才返回。非阻塞模式 winsock函式會立即返回 1.select 選擇 模型 1 增加乙個套接字集合fd 2 設定乙個可讀或者可寫的套接字集合fd1 3 使用select函式 可設定等待的時長 獲...
套接字之重疊I O模型
剛剛把重疊i o套接字理解了一點,於是在此做個筆記,給出乙個重疊i o處理單個套接字的程式。這個程式是tcp的伺服器端程式。該程式只能接收乙個客戶端的連線,迴圈傳送資訊,以及該客戶端退出時伺服器端得到響應。套接字型檔初始化等 省略了,只包含乙個監聽部分和乙個處理i o部分的 如下 開始進行重疊i o...