特定の時点で open(2)、stat(2) ファイルを使用してファイルを開くか、opendir(2) を使用してディレクトリを開く必要があるノンブロッキング プログラム (複数のソケットを処理する) を作成する場合、システム コールが確実に実行されるようにするにはどうすればよいですか?ブロックしない?
私には、threads または fork(2) を使用する以外に選択肢がないように思えます。
特定の時点で open(2)、stat(2) ファイルを使用してファイルを開くか、opendir(2) を使用してディレクトリを開く必要があるノンブロッキング プログラム (複数のソケットを処理する) を作成する場合、システム コールが確実に実行されるようにするにはどうすればよいですか?ブロックしない?
私には、threads または fork(2) を使用する以外に選択肢がないように思えます。
Mel Nicholson が答えたように、すべてのファイル記述子ベースでselect / poll / epollを使用できます。それ以外の場合は、アイテムごとのプロキシ スレッド (またはスレッド プール) を使用して、(カーネル スケジューラを使用して) 同期ブロッキング待機を変換する小さなスタックを使用して、 eventfdを使用して選択/ポーリング/epoll 可能な非同期イベントを待機させることができます。またはUNIX パイプ(移植性が必要な場合)。
プロキシ スレッドは、操作が完了するまでブロックし、次に eventfd またはパイプに書き込み、select/poll/epoll を起動します。
実際、他の方法はありません。
実際には、スレッド以外では処理できない別の種類のブロッキングがあり、それがページ フォールトです。これらは、プログラム コード、プログラム データ、メモリ割り当て、またはファイルからマップされたデータで発生する可能性があります。それらを回避することはほとんど不可能です (実際、いくつかのページをメモリにロックすることはできますが、これは特権操作であり、カーネルが別の場所で不適切なメモリ管理を行うことでおそらく裏目に出るでしょう)。そう:
open
くださいstat
。とにかく、ネットワークはおそらくこれらの機能よりも大きな遅延を追加します。また、ネットワーク リクエストの処理中にデータの読み取りと処理、または処理と書き込みを行う必要がある場合は、メモリ マッピングを使用してファイルにアクセスする方が高速ですが、これはブロッキングであり、ノンブロッキングにすることはできません。そのため、最新のネットワーク サーバーは、ほとんどのものに対するブロッキング コールに固執し、他のスレッドが I/O を待機している間、CPU をビジー状態に保つのに十分な数のスレッドを保持する傾向があります。
最新のサーバーのほとんどがマルチコアであるという事実は、とにかく複数のスレッドが必要なもう 1 つの理由です。
このpoll( )
コマンドを使用すると、単一のスレッドを使用して任意の数のソケットのデータをチェックできます。
Linux の詳細については、こちらを参照man poll
してください。システムの詳細については、こちらを参照してください。
open( )
stat( )
非同期戦術を介して呼び出されない限り、すべてのPOSIX準拠システムで呼び出されたスレッドでブロックされます( a のようにfork
)