8

特定の時点で open(2)、stat(2) ファイルを使用してファイルを開くか、opendir(2) を使用してディレクトリを開く必要があるノンブロッキング プログラム (複数のソケットを処理する) を作成する場合、システム コールが確実に実行されるようにするにはどうすればよいですか?ブロックしない?

私には、threads または fork(2) を使用する以外に選択肢がないように思えます。

4

3 に答える 3

4

Mel Nicholson が答えたように、すべてのファイル記述子ベースでselect / poll / epollを使用できます。それ以外の場合は、アイテムごとのプロキシ スレッド (またはスレッド プール) を使用して、(カーネル スケジューラを使用して) 同期ブロッキング待機を変換する小さなスタックを使用して、 eventfdを使用して選択/ポーリング/epoll 可能な非同期イベントを待機させることができます。またはUNIX パイプ(移植性が必要な場合)。

プロキシ スレッドは、操作が完了するまでブロックし、次に eventfd またはパイプに書き込み、select/poll/epoll を起動します。

于 2013-01-08T08:21:06.523 に答える
2

実際、他の方法はありません。

実際には、スレッド以外では処理できない別の種類のブロッキングがあり、それがページ フォールトです。これらは、プログラム コード、プログラム データ、メモリ割り当て、またはファイルからマップされたデータで発生する可能性があります。それらを回避することはほとんど不可能です (実際、いくつかのページをメモリにロックすることはできますが、これは特権操作であり、カーネルが別の場所で不適切なメモリ管理を行うことでおそらく裏目に出るでしょう)。そう:

  1. 特定のクライアントをブロックする最後のチャンスをすべて取り除くことは実際にはできないため、 や などを気にしないでopenくださいstat。とにかく、ネットワークはおそらくこれらの機能よりも大きな遅延を追加します。
  2. 最適なパフォーマンスを得るには、ページ フォールトまたは同様の困難なブロック ポイントで他のスレッドがブロックされた場合に一部のスレッドをスケジュールできるように、十分な数のスレッドが必要です。

また、ネットワーク リクエストの処理中にデータの読み取りと処理、または処理と書き込みを行う必要がある場合は、メモリ マッピングを使用してファイルにアクセスする方が高速ですが、これはブロッキングであり、ノンブロッキングにすることはできません。そのため、最新のネットワーク サーバーは、ほとんどのものに対するブロッキング コールに固執し、他のスレッドが I/O を待機している間、CPU をビジー状態に保つのに十分な数のスレッドを保持する傾向があります。

最新のサーバーのほとんどがマルチコアであるという事実は、とにかく複数のスレッドが必要なもう 1 つの理由です。

于 2013-01-08T08:30:03.737 に答える
0

このpoll( )コマンドを使用すると、単一のスレッドを使用して任意の数のソケットのデータをチェックできます。

Linux の詳細については、こちらを参照man pollしてください。システムの詳細については、こちらを参照してください。

open( )stat( )非同期戦術を介して呼び出されない限り、すべてのPOSIX準拠システムで呼び出されたスレッドでブロックされます( a のようにfork

于 2013-01-08T08:14:12.560 に答える