Linux下開發-IO複用
select、pselect
int select(int n, fd_set *readfds,fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
int pselect(int n, fd_set *readfds,fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, constsigset_t *sigmask);
select和pselect都是等待一系列的檔案描述符(int)的狀態發生變化。
這兩個函式基本上是一致,但是有三個區別:
1、select函式用的timeout引數是timeval的結構體(包含秒和微秒),而pselect用的是timespec結構體(包含秒和納秒),更精確。
2、select函式可能會為了指示還剩多長時間而更新timeout引數,然而pselect不會改變timeout引數。
3、select函式沒有sigmask引數,當pselect的sigmask引數為null時,兩者行為時一致的。有sigmask的時候,pselect相當於如下的select()函式,在進入select()函式之前手動將訊號的掩碼改變,並儲存之前的掩碼值;select()函式執行之後,再恢復為之前的訊號掩碼值。
缺點:
1、同時監聽的fd數量有限(1024)
2、函式返回後,需要全量遍歷所有的fd,詢問是否有事件發生,在fd較多的時候效能較差。
poll
跟select差不多,只是API優化了。且沒有fd監聽數量的限制。
缺點:
1、函式返回後,需要全量遍歷所有的fd,詢問是否有事件發生,在fd較多的時候效能較差。
epoll
在poll的基礎上優化,函式直接返還發生事件的fd。
LT和ET
LT(level triggered 水平觸發)是預設的工作方式,並且同時支援block和no-blocksocket。在這種做法中,核心告訴你一個檔案描述符是否就緒了,然後你可以對這個就緒的fd進行IO操作。如果你不作任何操作,核心還是會繼續通知你的,所以,這種模式程式設計出錯誤可能性要小一點。傳統的select/poll都是這種模型的代表。
ET (edge-triggered 邊緣觸發)是高速工作方式,只支援no-block socket。在這種模式下,當描述符從未就緒變為就緒時,核心通過epoll告訴你。然後它會假設你知道檔案描述符已經就緒,並且不會再為那個檔案描述符傳送更多的就緒通知
EPOLLOUT事件
一、EPOLLOUT事件在連線時觸發一次,表示可寫。
二、其他時候想要觸發,那你要先準備好下面條件:
1.某次write,寫滿了傳送緩衝區,返回錯誤碼為EAGAIN。
2.對端讀取了一些資料,又重新可寫了,此時會觸發EPOLLOUT。
如果你真的想強制觸發一次,也是有辦法的,直接呼叫epoll_ctl重新設定一下event就可以了,event跟原來的設定一模一樣都行(但必須包含EPOLLOUT),關鍵是重新設定,就會馬上觸發一次EPOLLOUT事件。
相關文章
- [Java併發]IO多路複用Java
- Linux下套接字詳解(十)---epoll模式下的IO多路複用伺服器Linux模式伺服器
- 理解IO多路複用
- IO通訊模型(三)多路複用IO模型
- IO多路複用詳解
- Redis 和 IO 多路複用Redis
- IO多路複用原理剖析
- IO模式和IO多路複用(阻塞IO、非阻塞IO、同步IO、非同步IO等概念)模式非同步
- IO多路複用原理&場景
- BIO、NIO、多路複用IO、AIOAI
- 【IO】Linux下的五種IO模型Linux模型
- Linux下應用程式開發:QT開發簡介(轉)LinuxQT
- 【Linux】基礎IO(下)!!!Linux
- IO多路複用機制詳解
- IO多路複用技術總結
- 第十六篇:初探IO複用
- 【linux】全志T3從核心檢視IO複用屬性Linux
- 【網路IO系列】IO的五種模型,BIO、NIO、AIO、IO多路複用、 訊號驅動IO模型AI
- Linux下開發-alarmLinux
- Linux下開發-reallocLinux
- Linux下開發CLinux
- Linux 下的五種 IO 模型Linux模型
- 圖解 | 原來這就是 IO 多路複用圖解
- IO多路複用與epoll機制淺析
- 11、協程和io教程01 -- 併發 並行 同步 非同步 阻塞 非阻塞 以及 IO多路複用並行非同步
- 【死磕NIO】— 阻塞IO,非阻塞IO,IO複用,訊號驅動IO,非同步IO,這你真的分的清楚嗎?非同步
- 柳大的Linux遊記·基礎篇(5)select IO複用機制Linux
- C IO複用select, epoll 簡單總結
- 《Linux網路開發必學教程》4_嚐鮮 seclect 多路複用Linux
- Linux企業級專案實踐之網路爬蟲(27)——多路IO複用Linux爬蟲
- Linux下應用程式開發:使用QT製作Skin(轉)LinuxQT
- golang執行緒池在IO多路複用中的應用Golang執行緒
- 使用 Socket.io 和 React 開發一個聊天應用React
- Vue.js的複用元件開發流程Vue.js元件
- Java IO學習筆記六:NIO到多路複用Java筆記
- Java NIO SelectorProvider與IO多路複用JavaIDE
- golang中基於kevent的IO多路複用實踐Golang
- Linux上Oracle啟用非同步IOLinuxOracle非同步