システムコールの最初のパラメータを選択する目的は何ですか?

システムコールの最初のパラメータを選択する目的は何ですか?

~から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実装の詳細を公開してより高速にします。

おすすめ記事