由《unix網路程式設計卷1》總結而來。
同時監視多個i/o條件,在其中任意乙個就緒時通知程序,這樣的能力稱為i/o復用。由select和poll函式支援,較新的還有posix中的pselect函式。(linux中還有epoll)。
i/o復用應用場合:
1)客戶同時處理多個描述符時,必須使用i/o復用。
2)客戶同時處理多個套接字時(比較少見)。
3)乙個tcp伺服器既要處理監聽套接字,又要處理已連線套接字。
4)乙個tcp伺服器既要處理tcp,又要處理udp。
5)乙個tcp伺服器要處理多個服務或多個協議。
unix可用的5種i/o模型:
1)阻塞式i/o;
2)非阻塞i/o;
3)i/o復用(select和poll);
4)訊號驅動式i/o(sigio);
5)非同步i/o(posix的aio_系列函式)。
乙個輸入操作一般包括兩個階段:
1)等待資料準備好
2)從核心向程序複製資料
預設情形下,所有套接字都是阻塞的。
應用程序呼叫i/o操作時阻塞,只有等待要操作的資料準備好,並複製到應用程序的緩衝區中才返回,或者發生錯誤(系統呼叫被訊號中斷)返回。
當應用程序要呼叫的i/o操作導致阻塞時,也就是核心中的資料並沒有準備好,直接返回乙個錯誤!!!!;當已有資料準備好時,執行複製,並成功返回。
簡言之,指在不能立刻得到結果之前,該函式不會阻塞當前程序,而會立刻返回。
一般情況下,應用程序需要利用輪詢(polling)的方式來檢測某個操作是否就緒。往往耗費大量的cpu時間。
阻塞發生在select/poll的系統呼叫上,而不是阻塞在實際的i/o系統呼叫上。select/poll發現有資料就緒後,通過實際的i/o操作將資料複製到應用程序的緩衝區中。
i/o復用與阻塞式i/o並不顯得有什麼優勢,且由於使用select需要兩個而不是乙個系統呼叫,i/o復用還稍顯劣勢。不過,使用select的優勢在於我們可以等待多個描述符就緒。
讓核心在描述符就緒時傳送sigio訊號通知我們。
它的優勢在於等待資料報到達期間程序不會被阻塞。
應用程序通知核心開始乙個非同步i/o操作,並讓核心在整個操作(包含將資料從核心複製到應該程序的緩衝區)完成後通知應用程序。
原理:呼叫aio_read函式告訴核心在操作完成時如何通知我們,然後系統呼叫立即返回。並且在等待i/o完成期間,我們的程序不會被阻塞。操作完成時,核心會產生訊號通知。
與訊號i/o的區別是:訊號i/o是核心通知何時可以啟動乙個操作,非同步i/o是由核心通知我們i/o操作何時完成。!!!!完成後會產生指定的訊號。
1)同步i/o操作導致請求程序阻塞,直到i/o操作完成;
2)非同步i/o操作不導致請求程序阻塞。
前4種模型都是同步i/o模型,因為其中真正的i/o操作將阻塞程序。 IO模型 IO多路復用
用socket 一定會用到accept recv recvfrom這些方法 正常情況下 accept recv recvfrom都是阻塞的 如果setblocking false 整個程式就變成乙個非阻塞的程式了非阻塞的特點 沒有併發程式設計的機制 是乙個同步的程式 程式不會在某乙個連線的recv或...
IO復用模型 epoll
參見 1.epoll模型簡介 epoll是linux多路服用io介面select poll的加強版,e對應的英文單詞就是enhancement,中文翻譯為增強,加強,提高,充實的意思。所以epoll模型會顯著提高程式在大量併發連線中只有少量活躍的情況下的系統cpu利用率。epoll把使用者關心的檔案...
IO模型 io多路復用(三)
兩者相互比較 1 如果只有乙個使用者連線server端,多路復用io還不如阻塞io效率高 2 相比阻塞io,多路復用io中間多了個反饋機制 3 多路復用io的 可以同時監控socket 多個socket物件coon1 coon2.recv 4 多路復用io可以識別有人連線某個coon3,然後告知有c...