~からman select
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
nfds は、3 セットのうち最も高い番号のファイル記述子に 1 を加えたものです。
nfds
ファイル記述子を決定することができます、およびが既にあるときreadfds
、およびwritefds
の目的は何ですか?exceptfds
ベストアンサー1
存在する「UNIX環境の高度なプログラミング」、W. Richard Stevensは、これがパフォーマンスの最適化であると述べています。
関心のある最高の記述子を指定することにより、カーネルは、開いているビットを見つけるために、3つの記述子セットで未使用の数百のビットを探索するのを防ぎます。
(初版、399ページ)
どのタイプのUNIXシステムプログラミングをしている場合は、APUEブックを強くお勧めします。
修正する
Anはfd_set
通常、最大1024のファイル記述子を追跡できます。
fds
どの設定が何であるかを追跡する0
最も効率的な方法1
はビットセットなので、各fd_set
設定は1024ビットで構成されています。
32ビットシステムでは、long int(または「単語」)は32ビットなので、各単語が1024/32 = 32単語であることを意味しfd_set
ます
。
多くのアプリケーションのように、8や16などの小さな数字の場合はnfds
、最初の単語を見るだけでよく、32の単語をすべて見るよりもはるかに高速です。
(プラットフォームの価値を確認してFD_SETSIZE
学び__NFDBITS
ます。)/usr/include/sys/select.h
アップデート2
関数署名ではない理由は
int select(fd_set *readfds, int nreadfds,
fd_set *writefds, int nwritefds,
fd_set *exceptfds, int nexceptfds,
struct timeval *timeout);
私の考えでは、コードがすべてのパラメータを保持しようとしているためです。登録する、CPUがより迅速に処理できるように、追加の2つの変数を追跡する必要がある場合、CPUに十分なレジスタがない可能性があります。
言い換えれば、select
実装の詳細を公開してより高速にします。
- BSD 4.4 Lite 選択ソースコード(スキャン機能の選択と選択)
- Linux 2.6.37 ソースコードの選択(do_selectおよびmax_select_fd関数)