2013-10-09 65 views
0

據說select()不可伸縮,因爲它需要遍歷最大文件描述符(FD)大小的數組:複雜度O(max_num_FD)。並且據說poll()更好,因爲它只遍歷活動FD()的數量大小的數組:複雜度O(活動FD的數量)活動FD的含義是什麼?爲什麼poll()比select()更好?

poll()是一種大規模服務器一次使用多種可用數據的流行方式嗎?通常哪種套接字方式通常使用大型服務器?

+0

這是針對特定語言的嗎? –

+0

@Edgar這是原始的C使用原始的Unix系統調用。 – SzG

+1

@SzG不,它是使用Unix系統調用的任何語言。 'select'和'poll'可直接以多種語言提供。語言無關緊要,神奇的性能優勢和「活躍fd」的定義在內核中,而不是在語言中。 – delnan

回答

1

活動FD表示打開的文件描述符。 ()和poll()都適用於單線程單進程程序,以允許它們同時處理多個連接。例如OpenWRT的uhttpd網絡服務器就是這樣的。

select()和poll()在所有的Unices上都可用。 更好的擴展O(1)版本是Linux上的epoll和BSD上的kqueue。雖然便攜性較差。但是你可以在Debian Linux上安裝libkqueue0

許多程序使用其他方法。例如SSH守護進程sshd會爲每個連接產生一個子進程。其他人處理線程中的每個連接。

+0

你的意思是使用ssh作爲大型服務器嗎?像ssh http連接? – user389955

+0

不,我剛剛舉例說明了一些衆所周知的服務如何工作。 – SzG

+0

感謝您的回答。你聽說過put_getn嗎?我聽說它也是可擴展的。它與epoll()和kqueue相比如何? – user389955

相關問題