から 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
から 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
回答:
で、「UNIX環境での高度なプログラミング」、W.リチャードスティーヴンスは、それがパフォーマンスの最適化であると言います。
カーネルは、関心のある最高の記述子を指定することで、3つの記述子セットの何百もの未使用ビットを調べて、オンになっているビットを探すことを回避できます。
(第1版、399ページ)
UNIXシステムのプログラミングを行う場合は、APUEブックを強くお勧めします。
更新
アンは、fd_set
通常、1024のファイルディスクリプタまで追跡することができます。
どれfds
が設定され0
、どれが設定される1
かを追跡する最も効率的な方法はfd_set
ビットセットであるため、それぞれが1024ビットで構成されます。
32ビットシステムでは、long int(または「ワード」)は32ビットであるため、それぞれfd_set
が
1024/32 = 32ワードであることを意味します。
nfds
多くのアプリケーションで使用される8や16などの小さなものの場合、最初の単語の内側を見るだけで済み、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
実装の詳細を公開することで、より高速になります。
私はselect()の設計者ではないので、よくわかりませんが、パフォーマンスの最適化だと思います。呼び出し関数は、読み取り、書き込み、およびFDを除くファイル記述子の数を知っているのに、なぜカーネルがそれを再び把握する必要があるのでしょうか?
80年代前半にselect()が導入されたとき、それらには動作するマルチギガヘルツ、マルチプロセッサがなかったことを思い出してください。25 MHz VAXは非常に高速でした。さらに、可能であればselect()を高速で動作させたいと考えていました。プロセスを待機しているI / Oがある場合、なぜプロセスを待機させるのですか?
nreadfds
だnwritefds
と言うでしょう。nexceptfds
nfds
nfds
は、より高速なアクセスのためにレジスターに入れられるようにするためです。他のすべての引数とともに3つの数値を追跡する必要がある場合、CPUに十分なレジスタがない可能性があります。もちろん、カーネルはnfds
仮想の3つの変数に基づいて独自に作成することもできます。したがって、効率を高めるために実装の詳細を公開しているのではないかと思います。
nfds
引数はほとんど利益をもたらさないでしょう。ほとんどの場合、プロセスはに比べて非常に少ないプロセスを開いていFD_SETSIZE
ます。典型的なケースでは、1024のうち(4,4,2)があります。カーネルチェック(4,4,4)を行うことは(1024,1024,1024)に対する大きな勝利ですが、(4,4,2)までの最適化はほとんど役に立ちません。
nfds
遅延してを呼び出すselect(FD_SETSIZE, ...)
必要があります。これは、より遅くなります。)