1

私はIOCPについて読んでいますが、これまでのところ、非同期書き込みはファイルへの書き込みのコンテキストでのみ適用されます。「ファイル」とは、ディスクファイルだけではなく、Windowsの「ファイル」タイプの出力デバイスを意味します。

クライアントからメッセージを受け取り、それらのメッセージをデータベース(MySQLまたはSQLite)に非同期で書き込むサーバーの実装にIOCPを何らかの方法で使用することを計画しています。しかし、私が理解していることから、IOCPでの非同期書き込みには、書き込まれるデータをデバイスドライバーに渡すことが含まれます。「デバイスドライバー」についての言及は、データベースでIOCPと非同期書き込みを使用する可能性を排除しているようです。アプリケーション作成者の観点から、データベースへの書き込みに関与する「デバイスドライバ」はありません。

では、IOCPは、データベースに書き込むサーバーの実装に実際に役立つのでしょうか。何かを誤解しているようなしつこい感じがします。

この場合、IOCPが役に立たない場合、Windows上のデータベースに非同期書き込みを行うサーバーを実装するために何を調べる必要があるかについての推奨事項はありますか?

4

4 に答える 4

2

通常、データベースは、データベースへの書き込みに使用する API を提供します。これは通常、それが行うすべての複雑なことを隠します。その API は汎用的で、OLE-DB や ODBC などの多くのデータベースで動作する場合もあれば、データベース固有の API である場合もあります。

IOCP を内部的に使用する可能性はありますが、使用するデータベースが IOCP を使用するのに十分な低レベルの API を公開する可能性は低いです。

おそらく質問したいのは、非同期書き込みを使用してデータベースに書き込むことができるか、つまり、「起動」を行っているスレッドをブロックせずに db 書き込みを起動できるかということです。

サーバーの残りの部分がIOCPを使用して独自のログファイルと通信し、ソケットの読み取り/書き込みを行う場合、IOCPに「フレンドリーな」データベースAPIが適していますが、スレッドプールを使用して、サーバーが行う残りの作業をブロックすることなく、データベース API が必要とする呼び出しをブロックします。私はこれを「ビジネス ロジック スレッド プール」と呼ぶ傾向があり、すべての非ブロッキング I/O に使用する IOCP スレッド プールとは別のものです。

データベースへの書き込みにこのような設計を使用するサーバーを構築するためのいくつかの記事を書きました。記事へのコードとリンクはここにあります。

于 2010-08-15T06:24:28.847 に答える
1

Io Completion Ports は、スケーラビリティを実現するためにさまざまな方法で使用できる汎用メカニズムです。

「最良の」ケースでは、Io Completion Port は、オーバーラップした Io で使用されている OS ハンドルに関連付けられています。しかし、これは実際にはまったく要件ではありません。Io Completion Port メカニズムは、使用されるすべての API がブロックされていたり、必要なハンドルを公開していない場合でも、スケーラビリティを提供するのに十分な汎用性を備えています。

非常に単純なモデルでは、ユーザー定義の「ジョブ」を作成するためCreateIoCompletionPortの呼び出しを使用できます。PostQueuedCompletionStatusすべてループしているワーカー スレッドのプールを作成しGetQueuedCompletionStatus、キューに入れられたジョブを処理するときにワーカー スレッド内でブロッキング Io ルーチンを呼び出すだけです。ワーカー スレッドの 1 つがカーネル関数でブロックされるたびに、Io Completion Port メカニズムは同時実行数が少ないことを確認し、別のワーカー スレッドを解放します。

明らかに、このように使用すると、アクティブなワーカー スレッドの数が同時実行数を超える可能性がありますが、ジョブが対称的であると仮定すると、スレッドがその「GetQueuedCompletionStatus」呼び出しに戻ると、それは非常に迅速に解決されるはずです。

于 2010-08-15T18:18:17.523 に答える
0

それらは、ファイルに書き込むときにどこでも役立ち、そのいずれかが発生している間はブロックしたくありません。整合性が実際には重要ではないテキストログファイルを書き込む場合を除いて、データベースがそれを望んでいることを想像するのは難しいです。

于 2010-08-15T03:30:25.283 に答える
0

IOCP は、データベースを実装する際に大いに役立ちます。

IOCP を FILE_FLAG_NO_BUFFERING および FILE_FLAG_WRITE_THROUGH と組み合わせ、正しく配置されたブロックを使用すると、データベース エンジンはキャッシュの動作を制御し、不要な重複キャッシュとブロック コピーを回避し、正しい順序で書き込みを取得し、どの書き込みを同時に実行できるかを制御できます。

もちろん、これらの機能を使用するにはデータベースを実装する必要がありますが、SQLite と Mysql を使用すると、別の機能が得られます。

これがデータベースの実装にどのように役立つかの詳細については、Gray と Reuter による「Transaction Processing: Concepts and Techniques」が優れたリファレンスです。

于 2010-08-15T04:24:51.240 に答える