當前位置:編程學習大全網 - 編程語言 - Linux的poll機制linux的poll

Linux的poll機制linux的poll

libevent詳解?

libevent是壹個輕量級的開源的高性能的事件觸發的網絡庫,適用於windows、linux、bsd等多種平臺,內部使用select、epoll、kqueue等系統調用管理事件機制。

libevent支持多種I/O多路復用技術(epoll、poll、dev/poll、select和kqueue等),在不同的操作系統下,做了多路復用模型的抽象,可以選擇使用不同的模型,通過事件函數提供服務。

在非阻塞模式上怎麽知道recv接收數據完成?

以linux下tcpsocket編程為例:阻塞就是recv/read的時候socket接收緩沖區要是有數據就讀,沒數據我就壹直睡覺賴著不走,直到有數據來了讀完我才走。

send/write的時候,要是發送緩沖區滿了,沒有空間繼續發送了我也壹直睡覺賴著不走,直到發送緩沖區騰出足夠的空間讓我把數據全部塞到發送緩沖區裏我才走。

(當然如果妳通過setsockopt設置了讀寫超時,超時時間到了還是會返回-1和EAGAIN,不再睡覺等待)

非阻塞就是recv/read的時候,要是接收緩沖區有數據我就讀完,沒有數據我直接帶著返回的-1和EGAIN走人,絕不睡覺等待耽誤時間。

write/send的時候,要是發送緩沖區有足夠的空間,就立刻把數據塞到發送緩沖區去,然後走人,如果發送緩存區滿了,空間不足,那直接帶著返回的-1和EAGAIN走人。至於IO多路復用,首先要理解的是,操作系統為妳提供了壹個功能,當妳的某個socket接收緩存區有數據可讀,或者發送緩沖區有空間可寫的時候,它可以給妳壹個通知。

這樣當配合非阻塞的socket使用時,只有當系統通知我哪個描述符可讀了,我才去執行read操作,可以保證每次read都能讀到有效數據而不做純返回-1和EAGAIN的無用功。

寫操作類似。

操作系統的這個功能通過select/poll/epoll之類的系統調用函數來使用,這些函數都可以同時監視多個描述符的讀寫就緒狀況,這樣,多個描述符的I/O操作都能在壹個線程內完成,這就叫I/O多路復用,這裏的“復用”指的是復用同壹個線程。至於事件驅動,其實是I/O多路復用的壹個另外的稱呼。至於異步同步,我們常見的linux下的網絡編程模型大部分都是同步io,以讀操作為例,本質上都是需要用戶調用read/recv去從內核緩沖區把數據讀完再處理業務邏輯。

異步io則是內核已經把數據讀好了,用戶直接處理邏輯。

異步IO在linux下壹般是用aio庫。

epoll和reactor區別?

epoll是Linux內核為處理大批量文件描述符而作了改進的poll,是Linux下多路復用IO接口select/poll的增強版本,它能顯著提高程序在大量並發連接中只有少量活躍的情況下的系統CPU利用率。

而Reactor是第四代響應式庫,是壹個響應式編程範式的實現,用於在JVM平臺上基於響應式流規範構建非阻塞異步應用。它是壹個完全非阻塞響應式編程的基石。

  • 上一篇:中國有哪些非物質文化遺產?
  • 下一篇:詩經中表白失敗的詩句
  • copyright 2024編程學習大全網