select() 関数を使用することはありますか?
私の(小さな)経験から、私はスレッドで十分だと考える傾向があります。
select() は、まだスレッドを知らない人のための教訓的なツールなのでしょうか?
select() 関数を使用することはありますか?
私の(小さな)経験から、私はスレッドで十分だと考える傾向があります。
select() は、まだスレッドを知らない人のための教訓的なツールなのでしょうか?
次の例を考えてみましょう。100K 接続程度の適度にビジーな Web サーバーがあります。あなたはそれを使用していないselect
ので、接続ごとに1つのスレッドがあり、すぐに問題になる100Kスレッドを意味します。
このような怪物ができるようになるまでシステムを微調整したとしても、ほとんどのスレッドはソケットで待機するだけです。ソケットが面白くなったときに通知する仕組みがあればもっといいと思いませんか?
別の言い方をすれば、スレッドと同様のselect
メカニズムは補完的です。ファイル記述子の監視threads
という単純なことを置き換えるために使用することはできません。select
シングルスレッドのポーリングは、使用、実装、および (最も重要な)理解がはるかに簡単です。並行プログラミングは、プロジェクトに多大な知的コストを追加します。データの同期はトリッキーでエラーが発生しやすく、ロックによりバグが発生する可能性が多くなり、ロックのないデータ構造によりパフォーマンスが低下し、プログラム フローを頭の中で視覚化 (または「シリアル化」) するのが難しくなります。多分)。
対照的に、シングルスレッドのポーリング (おそらくではなくepoll
/を使用) は、一般的に非常に優れたパフォーマンスを提供します (もちろん、データに応答して正確に何を行っているかによって異なります) 一方で、単純なままです。kqueue
select
特に Linux では、timerfds、eventfds、signalfds、inotify-fds、およびネストされた epoll-fds をすべてポーリング セットにまとめて配置できるため、あらゆる種類の「非同期」イベントを非常に均一に処理できます。 . 最終的にさらにパフォーマンスが必要になった場合、複数のポーラーを同時に実行することで単一の並列処理ポイントが得られ、データ同期の多くはカーネルによって行われます。これにより、準備が整った場合に 1 つのスレッドのみが成功したポーリングを受け取ることが保証されます。 .