目錄
unix下可用的5種i/o模型
阻塞式i/o模型
非阻塞式i/o模型
i/o復用模型
訊號驅動式i/o模型
非同步i/o模型
各種i/o模型的比較 參考
阻塞式i/o
非阻塞式i/o
i/o復用
訊號驅動式i/o(sigio)
非同步i/o(poxis的aio_系列函式)
比如乙個輸入操作通常包含兩個不同的階段
1.等待資料準備好
2.從核心向程序複製資料
對於乙個噁套接字上的輸入操作,第一步通常涉及等待資料從網路中到達,當所有等待分組到達時,它被複製到核心中的某個緩衝區,第二部就是把資料從核心緩衝區複製到應用程序緩衝區
最流行的i/o模型是阻塞式i/o(blocking i/o)模型,使用upd而不是tcp是因為udp概念簡單,而tcp要處理套接字低水位標記(low-water-mark)等額外變數會變得複雜
這裡的recvfrom函式是系統呼叫,這裡要區分應用程序和核心
一般都會在應用程序空間中執行切換到在核心空間彙總執行,一段時間之後再切換回來
程序呼叫recvfrom,其系統呼叫直到資料報到達且被複製到應用程序的緩衝區中或者發生錯誤才返回,最常見的錯誤是系統呼叫被訊號中斷,recvfrom成功返回後,應用程序開始處理資料報
程序把乙個套接字設定成非阻塞(nonblocking i/o)是在通知核心,當所有請求的i/o操作非得把本程序投入睡眠才能完成時,不要把本程序投入睡眠,而是返回乙個錯誤
前三次呼叫recvfrom時沒有資料可返回,因此核心轉而立即返回乙個weouldblock錯誤,第四次呼叫recvfrom時已有了乙個資料報準備好,它被複製到應用程序緩衝區,於是recvfrom成功返回,我們接著處理資料
當乙個應用程序像這樣對乙個非阻塞描述符迴圈呼叫recvfrom時,稱之為輪詢polling,應用程序持續輪詢核心,已檢視某個操作是否就緒,這麼做會消費大量cpu時間,不過這樣模型偶爾也會遇到,通常在專門提供某一種功能的系統中才有
有了i/o復用(i/o multiplexing)我們就可以呼叫select或poll,阻塞在這兩個系統呼叫中的某乙個之上,而不是阻塞在真正的i/o系統呼叫上
我們阻塞於select呼叫,等待資料報套接字變為可讀,當select返回套接字可讀這一條件時,我們呼叫recvfrom把所有資料報複製到應用程序緩衝區
i/o復用的優勢在於我們可以等待多個描述符就緒,與i/o復用相關的另一種i/o模型是在多執行緒中使用阻塞式i/o,這種模型與上述模型極為相似,但它沒有使用select阻塞在多個檔案描述符上,而是使用多個執行緒(每個檔案描述符乙個執行緒),這樣每個執行緒都可以自由的呼叫諸如recvfrom之類的阻塞式i/o系統呼叫了
我們也可以用訊號,讓核心在描述符就緒時傳送sigio訊號通知我們,這種模型稱為訊號驅動式i/o(signal-driven i/o)
首先開啟套接字的訊號驅動式i/o功能,並通過sigaction系統呼叫安裝乙個訊號處理函式,該系統呼叫將立即返回,我們的程序繼續工作,也就是會所它沒有被阻塞,當資料報準備好讀取時,核心就為該程序產生乙個sigio訊號,我們隨後即可以在訊號處理函式中呼叫recvfrom讀取資料報,並通知主迴圈資料已經準備好待處理,也可以激勵通知主迴圈,讓它讀取資料報
無論如何處理sigio訊號,這種模型的優勢在於等待資料報達到期間程序不被阻塞,主迴圈可以繼續執行,只要等待來自訊號處理函式的通知,即可以是資料已準備好被處理,也可以是資料報已準備好被讀取
非同步i/o(asynchronous i/o)由posix規範定義,演變成當前posix返回的各種早期標準所定義的實時函式中存在的差異已經取得一致,一般的說這些函式的工作機制是,告知核心啟動某個操作,並讓核心在整個操作(包括將資料從核心複製到我們自己的緩衝區)完成後通知我們,這種模型與前面介紹的訊號驅動模型的主要區別在於,訊號驅動式i/o是由核心通知我們何時可以啟動乙個i/o操作,而非同步i/o模型是由核心通知我們i/o操作何時完成
呼叫aio_read函式,給核心傳遞描述符,緩衝區指標,緩衝區大小(與read相同的三個函式)和檔案偏移(與lseek類似),並告訴核心當整個操作完成時如何通知我們,該系統呼叫立即返回,而且在等待i/o完成期間,我們的程序不被阻塞
前4種模型的主要區別在第一階段,因為他們的第二階段是一樣的,在資料從核心複製到呼叫者的緩衝區期間,程序阻塞於recvfrom呼叫,相反,非同步i/o模型在這兩個階段都要處理,從而不同於其他4種模型
同步i/o和非同步i/o對比
posix把這兩個術語定義如下
同步i/o操作(synchronous i/p operation)導致請求程序阻塞,直到i/o操作完成
非同步i/o操作(asynchronous i/o operation)不導致請求程序阻塞
根據上述定義,我們的前4種模型--阻塞式i/o模型,非阻塞式i/o模型,i/o復用模型和訊號驅動式i/o模型都是同步i/o模型,in為其中真正的i/o操作 recvfrom將阻塞程序,只有非同步i/o模型與posix定義的非同步i/o相匹配
解讀i/o多路復用技術
unix網路程式設計 I O多路復用之epoll
當程式進行io時,如果資料尚未準備好,那麼io將處於阻塞狀態。當某個程序有多個開啟的檔案,比如socket,那麼其後的所有準備好讀寫的檔案將受到阻塞的影響而不能操作。不借助執行緒,單一程序無法在同一時間服務多個檔案描述符。非阻擋式io可以作為乙個解決方案,但是效率並不高。首先程序需要不斷發io請求,...
《網路程式設計》I O 多路復用
在前面的文章中介紹了五種 i o 模型 i o 模型 這裡介紹 i o 模型中 i o 多路復用在 tcp 套接字程式設計中的使用。在 i o 多路復用中主要是 select 和 poll 函式的使用。該函式允許程序指示核心等待多個事件中的任何乙個發生,並只在乙個或多個事件發生或超過指定時間後才被喚...
併發程式設計 網路IO模型 IO多路復用
網路io模型 一 網路io 輸入 recv recvfrom accept 阻塞io 輸出 send sendto sendall connect 會等待一段時間,但是卻是非阻塞io,因為是乙個主動的過程 二 網路io模型 跟socket有關 blocking io 阻塞io 平時用的 tcp ud...