イベント駆動型と非同期は、同義語としてよく使用されます。 2つの間に違いはありますか?
また、epoll
とaio
の違いは何ですか?それらはどのように組み合わされますか?
最後に、LinuxのAIOがひどく壊れていることを何度も読みました。それはどのくらい正確に壊れていますか?
ありがとう。
イベントは、非同期実行を実現するためのパラダイムの1つです。ただし、すべての非同期システムがイベントを使用するわけではありません。これは、これら2つの意味的な意味についてです。1つはもう1つのスーパーエンティティです。
epollとaioは異なるメタファーを使用しています。
epollはブロック操作です(epoll_wait()
)-何らかのイベントが発生するまでスレッドをブロックしてから、コード内のさまざまなプロシージャ/関数/ブランチにイベントをディスパッチします。
AIOでは、コールバック関数(完了ルーチン)のアドレスをシステムに渡し、何かが発生するとシステムが関数を呼び出します。
AIOの問題は、コールバック関数コードがシステムスレッドなどでシステムスタックの最上位で実行されることです。あなたが想像できるようにそれに関するいくつかの問題。
それらは完全に異なるものです。
イベント駆動型パラダイムとは、何かが発生するたびに「イベント」と呼ばれるオブジェクトがプログラムに送信されることを意味します。その「何か」は、発生したかどうかを検出するために定期的にポーリングする必要はありません。その「イベント」は、同期または非同期のいずれかのアクション(つまり、「ハンドラー」)を実行するためにプログラムによってトラップされる場合があります。
したがって、イベントの処理は同期または非同期のいずれかになります。たとえば、JavaScriptは同期イベントシステムを使用します。
非同期とは、現在の「メイン」実行ストリームとは無関係にアクションが発生する可能性があることを意味します。念のために言っておきますが、[〜#〜] not [〜#〜]は「並列」または「異なるスレッド」を意味します。 「非同期」アクションが実際にメインスレッドで実行され、その間に「メイン」実行ストリームがブロックされる場合があります。したがって、「非同期」と「マルチスレッド」を混同しないでください。
技術的に言えば、非同期操作は自動的にイベントを想定-少なくとも「完了」、「障害」、または「中止/キャンセル」イベントと言うことができます(これらの1つ以上)は、操作の開始者(または基礎となるO/S自体)に送信され、操作が停止したことを通知します。したがって、非同期は常にイベント駆動型ですが、その逆ではありません。
イベントドリブンは、特定のシナリオでイベントが登録される単一のスレッドです。そのシナリオに直面すると、イベントが発生します。ただし、その時点でも、各イベントは順番に発生します。それについて非同期は何もありません。 Node.js(webserver)は、イベントを使用して複数のリクエストを処理します。
非同期は基本的にマルチタスクです。複数のスレッドまたはプロセスを生成して、特定の機能を実行できます。これは、各スレッドが独立していて、簡単に応答できる方法でメインスレッドとほとんど相互作用しないという意味で、イベント駆動型とはまったく異なります。 Apache(Webサーバー)は、複数のスレッドを使用して着信要求を処理します。