1. IOモデルをブロック
これは、条件が満たされない場合は、最も簡単なI / Oモデル、いくつかの条件を待っているプロセスやスレッドの一般的な性能である、そして永遠に待ちます。
カーネルが報告されたデータのコピーが終了するまでは、アプリケーション・プロセスは、ブロックされた状態を終了します。
このモデルは、時間の少ない厳しい状況歳、低並行処理のためにかかるものです。
2.非ブロックIOモデル
私たちは、データの準備ができていないカーネルを依頼する随時、ポーリングによって何かを行うことができ、待っています。
データの準備ができていることを世論調査場合は、ユーザ空間にデータをコピーします。
3.ドライブ信号IOモデル
カーネルは自動的に、後に我々はそれのアプリケーションの通知に報告されたデータのコピーが完了することができますか?
これは、IOを駆動するための信号です。
アプリケーションプロセスは、カーネル指定されたシグナルハンドラに信号を受信しSIGIO
、自動的にハンドラ。
だから、どのように我々はいくつかのより多くに対処しますio
か?私たちは、記述子の複数の監視モデルを下げることができます。
4. IO多重化パターン
IOは、多重化記述子には、複数の監視されてもよい記述子回レディ(準備一般読み取りまたは書き込みレディ)、プログラムは、読み取りおよび書き込み操作に応じて通知することができます。
select()
登録はすべての良いに耳を傾けますIO
。
- IOを監視するために必要なすべてのデータが準備されていない場合は、
select()
呼び出し元のプロセスがブロックされます。 - 説明記述は、シンボルの数は準備ができて返しする準備ができています。
- タイムアウトリターン0内の準備が説明なし。
- 失敗すると-1を返します。
int select(
int maxfd,
fd_set *rdset,
fd_set *wrest,
fd_set *exset,
struct timeval *timeout);
ことに注意してくださいIO
シグナルハンドラをカーネルに登録されていないため、再利用モデルは、ノンブロッキングではありません。
5.非同期IOモデル
データのコピーが同期されるので、4つのモデルの目の前で通過、同期されrecvfrom
たデータのコピー動作。
信号ドライバモデルは、データ準備フェーズは非同期であると考えられ、データは動作が同期しているコピー。
非同期的に、あなたはカーネルに追加のタスクを指定する必要があります。
ユーザプロセスを開始aio_read()
カーネル記述子バッファポインタ、バッファサイズを渡し、操作後に、カーネルは、受信aio_read
後、すぐに戻り、その後、カーネルがデータの準備を開始するのを待つだろう。
データを直接ユーザ空間にデータをコピーする準備ができたら、保存recvfrom()
し、この通知プロセスがIO
完了しています。
非同期モデルは明らかに最も簡単であり、その結果を制御することはできません。