ホームページ >バックエンド開発 >PHP7 >PHP7カーネル解析のI/Oモデル

PHP7カーネル解析のI/Oモデル

藏色散人
藏色散人転載
2019-04-02 10:58:453146ブラウズ

1. 同期: クライアント (C 側の呼び出し元) には関数があり、関数が終了する前に結果を待ちます。

2. 非同期: 私 (C 側の呼び出し元) は関数を呼び出しますが、関数の結果はわかりません。関数が結果を取得した後に通知されます (つまり、コールバック通知)

3. ブロッキング: I (s 側の呼び出し先、関数) と呼ばれ、I (s 側の呼び出し先、関数) はデータを完全に受け入れるか結果を取得するまで戻りません。

#4. ノンブロッキング: me (s 側の呼び出し先、関数) を呼び出すことを意味し、I (s 側の呼び出し先、関数) はすぐに戻り、結果を取得した後に呼び出し元に通知します

5 つの I/O モデル

(1) ブロッキング I/O (Blocking I/O)

PHP7カーネル解析のI/Oモデル

ユーザー プロセスが実行されるときシステムコールが発行されると、カーネルはI/Oの第一段階を開始し、バッファにデータを準備します データが準備されると、データはカーネルバッファからユーザープロセスのメモリにコピーされます。ユーザー プロセスはブロック状態から解放され、再度実行されます。

(2) ノンブロッキング I/O

PHP7カーネル解析のI/Oモデル

ユーザープロセスは第 2 段階でのみブロックされ、第 1 段階ではブロックされません。ただし、最初の段階では、ユーザー プロセスはやみくもに待つ必要はなく、データの準備ができているかどうかを確認するためにカーネルを常にポーリングするため、このモデルではより多くの CPU が消費されます。

(3) I/O 多重化

PHP7カーネル解析のI/Oモデル

I/O 実行の両方のステージはユーザー プロセスによってブロックされますが、2 つのステージは独立しています。 I/O 操作が完了すると、ユーザー プロセスは 2 つのシステム コールを開始します。ブロッキング I/O とは異なり、最初のセグメントは複数の記述子の準備ができるまで待つことができます

#(4) 信号駆動型 I/O

#ユーザーのみプロセスは I/O 実行の第 2 段階でブロックされますが、第 1 段階ではブロックされません。 I/O 実行の最初の段階では、このモデルは、データの準備が完了した後、データが準備されたことをユーザー プロセスに積極的に通知します。つまり、ユーザー プロセスにコールバックを行います。通知には 2 種類あり、1 つは水平トリガー、つまりユーザー プロセスが応答しない場合に常に通知が送信され、もう 1 つは 1 回だけ通知されるエッジ トリガーです。 PHP7カーネル解析のI/Oモデル

(5) 非同期 I/O (非同期 I/O)

ユーザー プロセスがシステム コールを開始すると、すぐに他の処理を開始できます。その後、I/O 実行の両方の段階が完了するまで、カーネルはユーザー プロセスに通知を送信して、操作が完了したことをユーザー プロセスに伝えます。 PHP7カーネル解析のI/Oモデル

I/O多重化技術

select

(1) .select()の仕組みはfd_setのデータ構造を提供しており、各要素は開いているファイル ハンドル (ソケット ハンドル、他のファイル、名前付きパイプやデバイス ハンドルのいずれであっても) との接続を確立します。接続を確立する作業はプログラマによって完了します。select() が呼び出されると、カーネルが接続を決定します。 IO に従ってステータスは fd_set の内容を変更し、それによって select() を実行したプロセスにどのソケットまたはファイルが読み取り可能または書き込み可能であるかを通知します。主にソケット通信に使用されます。

(2). プログラムが select を実行した後、データ入力がない場合、プログラムはデータが存在するまで (ブロックされた場合) 待機します。つまり、プログラム内でループやスリープを行う必要はありません。 。

(3). select が呼び出されるたびに、fd_set コレクションをユーザー モードからカーネル モードにコピーする必要があります。fd_set が多数ある場合、このオーバーヘッドは非常に大きくなります。

(4 ). 同時に、select を呼び出すたびに、カーネル内で渡されたすべての fd_set をトラバースする必要があります。fd_set が多数ある場合、このオーバーヘッドも非常に大きくなります。

(5). によってサポートされるファイル記述子の数select が小さすぎます。デフォルトは 1024

poll

(1) です。poll の実装は、fd_set を記述する方法を除いて select と非常に似ています。コレクションが異なります。ポーリングは、select の fd_set 構造の代わりに、pollfd リンク リスト構造を使用します。その他はほぼ同じです。

(2). 監視記述子の数に上限なし;

epoll/kqueue

(1). 監視記述子の数に上限なし監視記述子の数 ;

(2). 効率が向上し、ポーリング方式ではないため、fd の数が増加しても効率が低下することはありません。アクティブで使用可能な fds のみがコールバック関数を呼び出します。つまり、epoll/kqueue の最大の利点は、「アクティブな」接続のみを考慮し、接続の総数とは関係がないことです。この環境では、epoll/kqueue の効率が select や Paul よりもはるかに高くなります。

(3). メモリ コピー。メモリをマッピングする mmap() ファイルを使用して、カーネル空間でのメッセージ パッシングを高速化します。

以上がPHP7カーネル解析のI/Oモデルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。