IO多路復用的作用?並列舉實現機制以及區別?


I/O多路復用是用於提升效率,單個進程可以同時監聽多個網絡連接IO。

舉例:通過一種機制,可以監視多個文件描述符,一旦描述符就緒(讀就緒和寫就緒),能通知程序進行相應的讀寫操作,I/O多路復用避免阻塞在io上,原本為多進程或多線程來接收多個連接的消息變為單進程或單線程保存多個socket的狀態后輪詢處理 select是通過系統調用來監視一組由多個文件描述符組成的數組,通過調用select()返回結果,數組中就緒的文件描述符會被內核標記出來,然后進程就可以獲得這些文件描述符,然后進行相應的讀寫操作。 每次調用select,都需要把fd集合由用戶態拷貝到內核態,在fd多的時候開銷會很大,每次select都是線性遍歷整個列表,當fd很大的時候,遍歷的開銷也很大 poll本質上與select基本相同,只不過監控的最大連接數上相較於select沒有了限制,因為poll使用的數據結構是鏈表,而select使用的是數組,數組是要初始化長度大小的,且不能改變 Epoll:解決select和poll本身的缺陷 數組長度限制解決方案:fd上限是最大可以打開文件的數目,具體數目可以查看/proc/sys/fs/file-max。一般會和內存有關 需要每次輪詢將數組全部拷貝到內核態解決方案:每次注冊事件的時候,會把fd拷貝到內核態,而不是每次poll的時候拷貝,這樣就保證每個fd只需要拷貝一次。 每次遍歷都需要列表線性遍歷解決方案:不再采用遍歷的方案,給每個fd指定一個回調函數,fd就緒時,調用回調函數,這個回調函數會把fd加入到就緒的fd列表中,所以epoll只需要遍歷就緒的list即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM