2. 什麼是select?
2.4 select偽**
3. 參考:
多路復用系列:
通俗易懂說多路復用(1)select
通俗易懂說多路復用(2)epoll
通俗易懂說多路復用(3)eventfd 事件通知
通俗易懂說多路復用(4)fcntl
復用技術 multiplexing 並不是新技術而是一種設計思想,在通訊和硬體設計中存在頻分復用、時分復用、波分復用、碼分復用等,在日常生活中復用的場景也非常多,因此不要被專業術語所迷惑。
從本質上來說,復用就是為了解決有限資源和過多使用者的不平衡問題,從而實現最大的利用率,處理更多的問題。
多路復用就是通過一種機制,可以監聽多個描述符,一旦某個描述符就緒(可以讀/寫),就通過某種方法通知相應程式進行相應操作。
(其中,**檔案描述符(fd)**是乙個整數,起到乙個索引的作用。程序通過fd找到fd指向的檔案指標,從而對檔案進行操作。)
假設你在家一邊玩遊戲過程中,水壺正在燒水,洗衣機同時在洗衣服。不久,遊戲過程中,水壺響了,你就去倒水;洗衣機洗好了,你就去晾衣服。你通過聽它們的響聲「滴滴滴」來判斷事情有沒有完成,然後進行下一步操作。
在這裡水壺燒水,洗衣機洗衣服就分別是乙個檔案描述符;
他們任務完成了,發出「滴滴滴」的響聲,就是描述符就緒了,通知你可以進行操作了。
多路復用在這裡就是有許多家務在進行著,其中你對多項任務進行監聽,通過某種方法來判斷它們有沒有完成,從而進行下一步操作。
多路復用的方法有:select,poll,epoll
1. 原始處理方式:
在select,poll,epoll出現之前,最初處理多路復用的方法是:通過非阻塞忙輪詢i/o的方式處理多個描述符(流)
2. 特點:不停的從頭到尾地輪詢所有描述符/流
3. 缺點:如果所有的流都沒有資料,cpu空轉,浪費cpu資源
4. 偽**:
while true
}
select 是 2023年左右出現的,對外的介面定義:
/* according to posix.1-2001 */
#include /* according to earlier standards */
#include #include #include int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
void fd_clr(int fd, fd_set *set);
int fd_isset(int fd, fd_set *set);
void fd_set(int fd, fd_set *set);
void fd_zero(fd_set *set);
參考:
1. 定義:
為了解決原始處理方式的cpu空轉浪費資源問題,引入了乙個**叫做select。select 通過同時監聽多個描述符/流,在空閒的時候,把當前處理執行緒阻塞掉,當有乙個或多個描述符/流就緒的時候,就從阻塞狀態中醒來進行處理。
select作為先驅對io復用有巨大的推動,並且指明了後續的優化方向
只需要輪詢一遍流,就知道有描述符就緒;
可協調fd數量和數值都不超過1024 無法實現高併發
使用o(n)複雜度遍歷fd陣列檢視fd的可讀寫性 效率低
涉及大量kernel和使用者態拷貝 消耗大
每次完成監控需要再次重新傳入並且分事件傳入 操作冗餘
1. 偽**:
int fds = 存放需要監聽的socket
while(1)
}}
我讀過的最好的epoll講解 -知乎 Linux IO多路復用
一.select 函式 include include include int select int n,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout fd clr int fd,fd set set f...
I O多路復用
一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...
Linux C Socket多路復用
1.迴圈伺服器 udp伺服器 udp迴圈伺服器的實現非常簡單 udp伺服器每次從套接字上讀取乙個客戶端的請求,處理,然後將結果返回給客戶機.可以用下面的演算法來實現.socket bind while 1 因為udp是非面向連線的,沒有乙個客戶端可以老是佔住服務端.只要處理過程不是死迴圈,伺服器對於...