通俗易懂說多路復用(1)select

2021-09-17 19:40:58 字數 2021 閱讀 2573

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是非面向連線的,沒有乙個客戶端可以老是佔住服務端.只要處理過程不是死迴圈,伺服器對於...