目錄知識補給站對文件描述符集合操作的四個巨集操作伺服器IO多路復用中的select和poll的區別 知識補給站 對文件描述符集合操作的四個巨集操作 對文件描述符集合操作的四個巨集操作在select函數中起著關鍵的作用,它們用於初始化、添加、刪除和檢查文件描述符集合中的元素。這四個巨集為: FD_ZERO、F ...
目錄
知識補給站
對文件描述符集合操作的四個巨集操作
對文件描述符集合操作的四個巨集操作在select
函數中起著關鍵的作用,它們用於初始化、添加、刪除和檢查文件描述符集合中的元素。這四個巨集為: FD_ZERO、FD_SET、FD_CLR、FD_ISSET:
FD_ZERO(fd_set *fdset)
-
功能:清空文件描述符集合。
-
參數:一個指向
fd_set
類型變數的指針。 -
作用:將
fdset
指向的文件描述符集合中的所有位都設置為0,確保集合中沒有包含任何文件描述符。
FD_SET(int fd, fd_set *fdset)
- 功能:將一個文件描述符添加到文件描述符集合中。
- 參數:一個整數
fd
,代表要添加的文件描述符;一個指向fd_set
類型變數的指針。 - 作用:將
fdset
指向的文件描述符集合中對應於fd
的位設置為1,表示該集合包含文件描述符fd
。
FD_CLR(int fd, fd_set *fdset)
- 功能:從文件描述符集合中刪除一個文件描述符。
- 參數:一個整數
fd
,代表要刪除的文件描述符;一個指向fd_set
類型變數的指針。 - 作用:將
fdset
指向的文件描述符集合中對應於fd
的位設置為0,表示該集合不再包含文件描述符fd
。
FD_ISSET(int fd, fd_set *fdset)
- 功能:檢查文件描述符集合中是否包含某個文件描述符。
- 參數:一個整數
fd
,代表要檢查的文件描述符;一個指向fd_set
類型變數的指針。 - 返回值:如果
fdset
指向的文件描述符集合中包含fd
,則返回非零值(通常為1);否則返回0。 - 作用:用於在
select
函數返回後,檢查哪些文件描述符已經就緒(可讀、可寫或存在異常條件)。
伺服器IO多路復用中的select和poll的區別
- 數據結構差異:
(1)select:使用點陣圖(bitmap)數據結構來存儲被監聽的文件描述符集合。這種數據結構在文件描述符數量較少時效率較高,但受限於點陣圖的大小,通常能監聽的文件描述符數量有限(通常在1024個左右,取決於系統和庫的實現)。
(2)poll:使用結構體數組(如pollfd)來存儲被監聽的文件描述符及其相關事件。這種數據結構允許監聽更多的文件描述符,因為它不受點陣圖大小的限制。 - 事件綁定:
(1)select:沒有將文件描述符和事件進行綁定。每次調用select時,都需要通過三個獨立的文件描述符集合來指定要監聽的可讀、可寫和異常事件。
(2)poll:將文件描述符和事件直接綁定在pollfd結構體中,這使得編程介面更為簡潔。在調用poll時,只需傳遞一個包含所有監聽信息的pollfd數組即可。 - 數據拷貝:
(1)select:在每次調用時,都需要將文件描述符集合從用戶空間拷貝到內核空間,併在返回時將結果從內核空間拷貝回用戶空間。這種頻繁的數據拷貝在文件描述符數量較多時會導致性能下降。
(2)poll:同樣存在數據拷貝的問題,但由於poll使用結構體數組而不是點陣圖,因此在某些情況下可能具有更高的效率。 - 時間複雜度:
(1)select:在內核中無差別地遍歷每個文件描述符,時間複雜度為O(n)。當文件描述符數量較大時,性能會受到顯著影響。
(2)poll:與select類似,也需要在內核中遍歷每個文件描述符。但由於poll允許監聽更多的文件描述符,因此在某些情況下可能具有更好的性能。 - 可重用性:
(1)select:每次調用select時,都需要重新創建和設置文件描述符集合。這可能導致額外的編程開銷。
(2)poll:由於poll將文件描述符和事件綁定在結構體中,因此可以在多次調用之間重用相同的pollfd數組,從而減少了編程開銷。