日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

I/O多路复用——select

發布時間:2025/4/16 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 I/O多路复用——select 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????????系統提供select函數來實現多路復用I/O模型,select系統調用是用來讓我們的程序監視多個文件句柄的狀態變化的。程序會停在select這里等待,直到被監視的文件句柄有一個或多個發生了狀態改變。


select API:

1)nfds參數指定被監聽的文件描述符的總數。它通常被設置為select監聽的所有文件描述符中的最大值加1,因為文件描述符是從0開始計數的。

2)readfds、writefds和exceptfds參數都是輸入輸出型參數,分別指向可讀、可寫和異常等事件對應的文件描述符集合。作為輸入型參數,應用程序調用select參數時,通過這三個參數傳入自己感興趣的文件描述符。作為輸出型參數,select調用返回時,內核將修改它們來通知應用程序哪些文件描述符已經就緒。

? ? ??fd_set結構體僅包含一個整型數組,該數組的每個元素的每一位(bit)標記一個文件描述符。fd_set能容納的文件描述符數量由FD_SETSIZE指定,這就限制了select能同時處理的文件描述符的數量。

系統提供了一系列宏來訪問fd_set結構體中的位:


3)timeout參數用來設置select函數的超時時間。它是一個timeval結構類型的指針,采用指針參數是將它設置為輸入輸出型參數,內核將修改它以告訴應用程序select等待了多久。

select給我們提供了一個微秒級的定時方式。如果給timeout變量的tv_sec和tv_usec都傳0,則select將立即返回。如果給timeout傳遞NULL,則select將一直阻塞,直到某個文件描述符就緒。


select成功時返回就緒(可讀、可寫和異常)文件描述符的總數。

如果在超時時間內沒有任何文件描述符就緒,select將返回0。

select失敗時返回-1并設置errno。如果在select等待期間,程序接收到信號,則select立即返回-1并設置errno為EINTER。


理解select

select模型的關鍵在于理解fd_set,假如取fd_set為一字節,fd_set中的每一bit可以對應一個文件描述符fd,則1字節長的fd_set最大可以對應8個fd。

(1)執行?

fd_set?set; FD_ZERO(&set);

? ?則set用位表示是0000 0000。

(2)若fd=5,執行

FD_SET(fd,?&set);

? ?后set變為 0001 0000(第5位設置為1)。

(3)若再加入fd = 2,fd = 1則set變為 0001 0011。

(4)執行

select(6,?&set,?NULL,?NULL,?NULL);

? ?阻塞等待。

(5)若fd = 1, fd = 2上都發生可讀事件,則select返回,此時set變為0000 0011。

? ?注意:沒有事件發生的fd = 5被清空。


select模型的特點:

(1)可監控的文件描述符個數取決于sizeof(fd_set)的值,一般為512或1024。假如服務器上sizeof(fd_set)的值為512,每個bit表示一個文件描述符,則服務器上支持的最大文件描述符是512 * 8 = 4096。如果想要調整fd_set的大小,可以通過編譯內核或其他方法。

(2)將fd加入select監控的同時,還要再使用一個數組Array保存放到select監控集中的fd,一是用于在select返回后,Array作為原數據和fd_set進行FD_ISSET判斷。二是select返回后會把以前加入的但并無事件發生的fd清空,所以每次開始select前都要重新從Array取得fd逐一加入(FD_ZERO最先),掃描Array的同時取得fd的最大值max_fd,用于select的第一個參數。

(3)select模型必須在select前遍歷Array(加fd,取max_fd),select返回后遍歷Array(FD_ISSET判斷是否有事件發生)。



select的優點:

?????????select的性能遠遠高于多進程、多線程。

select的缺點:

(1)select監視的文件描述符數量是有限的

(2)每次調用select,都需要把fd集合從用戶態拷貝到內核態,這個開銷在fd很多時會很大,導致服務器性能下降。

(3)每次調用都要在內核遍歷傳遞進來的所有fd,這個開銷在fd很多時也很大。



使用select 的TCP服務器

轉載于:https://blog.51cto.com/zgw285763054/1856237

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的I/O多路复用——select的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。