次のコラム workerman の使い方チュートリアル では、Workerman について知っておくべきいくつかの概念を紹介します。困っている友人の役に立てば幸いです。
#Workerman は、純粋に PHP で開発されたオープンソースの高性能 PHP ソケット サービス フレームワークです。これは MVC フレームワークではなく、より低レベルでより一般的なソケット サービス フレームワークであり、tcp エージェント、ラダー エージェント、ゲーム サーバー、メール サーバー、および ftp サーバーの開発に使用できます。
実際、Workerman は nginx の PHP バージョンに似ており、コアもマルチプロセス Epoll ノンブロッキング IO です。各 Workerman プロセスは数万の同時接続を維持できます。メモリ上に常駐するため、Apache、nginx、php-fpmなどのコンテナに依存せず、超高性能です。
TCP、UDP、UNIXSOCKET、長時間接続、Websocket、HTTP、WSS、HTTPS およびその他の通信プロトコル、およびさまざまなカスタム プロトコルをサポートします。タイマー、非同期ソケット クライアント、非同期 Mysql、非同期 Redis、非同期 HTTP、非同期メッセージ キューなど、多くの高性能コンポーネントが含まれています。
まず、いくつかの核となる概念を理解する必要があります、1. マルチプロセス 2. Epoll 3. ノンブロッキング IO
1. マルチプロセス:
まず、プロセスとは何ですか? プロセスには、プロセスに割り当てられたコード、データ、リソース (メモリ) が含まれます。直感的に言えば、プロセスはコンピュータの PID です。システム。オペレーティング システムは、外部プロセスによる干渉からプロセス空間を保護します。つまり、あるプロセスが別のプロセスのメモリにアクセスすることはできません。
プロセス間で通信する必要がある場合、オペレーティング システムを使用してプロセス間通信メカニズムを提供できます。通常、実行可能ファイルを実行すると、オペレーティング システムはそのファイルを実行するためのプロセスを作成します。
ただし、実行ファイルがマルチプロセス設計に基づいている場合、オペレーティング システムは元のプロセス上に複数のプロセスを作成します。これらのプロセス間で実行されるコードは同じですが、実行結果は同じになる可能性があります。 . 違うかもしれません。
なぜ複数のプロセスが必要なのでしょうか? 最も直感的なアイデアは、オペレーティング システムがマルチコアをサポートしている場合、実行可能ファイルは、マルチコアでなくても、あるプロセスが I/O 操作を待機している間、別のコアで実行できるということです。プロセスは CPU 上でも実行できます。CPU 上で実行すると、CPU 使用率とプログラム効率が向上します。
Linux システムでは、fork() を使用して親プロセス内に子プロセスを作成できます。プロセスが fork() を呼び出した後、システムはまずストレージ データやコード スペースなどのリソースを新しいプロセスに割り当てます。その後、元のプロセスのすべての値とステータスが新しいプロセスにコピーされ、いくつかの値だけが元のプロセスと異なり、異なるプロセスを区別します。
fork() 関数は、親プロセスに 1 回 (子プロセスの PID またはフォーク失敗情報を返す)、子プロセスに 1 回 (0 を返す) の 2 回戻ります。この時点で、2 つのプロセスは分離され、それぞれがシステム内で実行されました。
2. ノンブロッキング IO:
まず IO とは何か、つまり入出力の動作です。ネットワーク IO の本質はソケットの読み取りであり、Linux システムではソケットはストリームとして抽象化されており、IO は対流操作として理解できます。 IO アクセス (例として読み取り) の場合、データはまずオペレーティング システム カーネルのバッファにコピーされ、次にオペレーティング システム カーネルのバッファからアプリケーション プログラムのアドレス空間にコピーされます。
したがって、読み取り操作が発生すると、次の 2 つの段階を経ます。
最初の段階 (データの待機): データの準備ができるのを待機します (データが準備されるのを待機します)。準備ができて)。
第 2 段階 (データのコピー): カーネルからプロセスへのデータのコピー(カーネルからプロセスへのデータのコピー)
ソケット ストリーム (つまり IO) の場合、
最初のステップ: 通常、データ パケットがネットワークに到着し、カーネル内のバッファにコピーされるのを待機します。
ステップ 2: カーネル バッファからアプリケーション プロセス バッファにデータをコピーします。
ネットワーク IO モデルは大まかに次のとおりです。
同期モデル (同期 IO)
ブロッキング IO (ブロッキング IO) ) リソースが利用できない場合、IO リクエストはフィードバック結果 (データまたはタイムアウト) が得られるまでブロックされます。 Linux では、デフォルトですべてのソケットがブロックされますが、IO ブロックの特徴は、IO 実行の両方の段階 (データの待機とデータのコピー) でブロックされることです。
ノンブロッキング IO (ノンブロッキング IO) リソースが利用できない場合、IO リクエストは終了して戻ります。戻りデータは、リソースが利用できないことを示します。 Linux では、データの準備ができていなくてもユーザー プロセスはブロックされず、カーネルはすぐにプロセスに戻り、このコマンドをすぐに満たすことができないことを示します (EAGAIN または EWOULDBLOCK)。したがって、ノンブロッキングはポーリングを使用して実現されます。
IO の多重化 (多重化 IO) IO の多重化は、select、poll、epoll と呼ばれるもので、この IO 方法はイベント駆動型 IO と呼ばれることもあります。 select/epoll の利点は、単一のプロセスで複数のネットワーク接続の IO を同時に処理できることです。
その基本原理は、select、poll、および epoll の関数が、担当するすべてのソケットを継続的にポーリングすることです。データが特定のソケットに到着すると、ユーザー プロセスに通知されます。 IO多重化モデルでは、実際には各ソケットはノンブロッキングに設定されるのが一般的です。
ただし、実際には、ユーザーのプロセス全体が常にブロックされます。プロセスがソケット IO によってブロックされるのではなく、select 関数によってブロックされるだけです。したがって、IO 多重化は、select や epoll などのシステム コールではブロックされますが、recvfrom などの実際の I/O システム コールではブロックされません。
シグナル駆動 IO (シグナル駆動 IO)
非同期 IO (非同期 IO) ユーザー プロセスは読み取り操作を開始した後、すぐに他の処理を開始できます。 。一方、カーネルの観点から見ると、非同期読み取りを受信するとすぐに返されるため、ユーザー プロセスにブロックが発生することはありません。
その後、カーネルはデータの準備が完了するのを待ち、データをユーザー メモリにコピーします。これがすべて完了すると、カーネルはユーザー プロセスにシグナルを送信して、次のことを伝えます。読み取り操作が完了します。
3. Epoll : epoll は理解しやすくなりました。epoll は、ファイル記述子の大きなバッチを処理するために Linux カーネルによって作成された改良されたポーリングです。Linux における多重化された IO です。インターフェイス選択/ポーリングの拡張バージョン。多数の同時接続のうち少数のアクティブな接続のみがアクティブである場合に、プログラムのシステム CPU 使用率を大幅に向上させることができます。
PS. いくつかの注意点:
1: IO 多重化は同期ブロッキング モデルですか、それとも非同期ブロッキング モデルですか?
同期ではメッセージ通知をアクティブに待機する必要がありますが、非同期ではメッセージ通知を受動的に受信し、コールバック、通知、ステータスなどを通じてメッセージを受動的に取得する必要があります。 IO が選択ステージまでブロックを多重化する場合、ユーザー プロセスはアクティブに待機し、選択関数を呼び出してデータ準備完了ステータス メッセージを取得し、そのプロセス ステータスはブロックされます。したがって、IO 多重化は同期ブロッキング モードとして分類されます。
2: 同時実行性とは何ですか? 同時実行性が高い状態とはどのような状態ですか?
高度な同時実行プログラムでは、通常、マルチスレッド同期ブロッキング方式ではなく、同期非ブロッキング方式が使用されます。これを理解するには、まず同時実行と並列処理の違いを見てください。つまり、同時実行数は同時に実行されるタスク (同時に処理される HTTP リクエストなど) の数を指し、並列数は同時に動作できる物理リソースの数を指します。同時に(CPU コアの数など)。
タスクのさまざまな段階を適切にスケジュールすることで、同時実行数が並列度よりもはるかに大きくなる可能性があります。これが、数個の CPU で数万のユーザーの同時リクエストをサポートできる秘密です。このように同時実行性が高い状況では、タスク (ユーザー要求) ごとにプロセスまたはスレッドを作成すると、非常にコストがかかります。同期ノンブロッキング方式では、複数の IO リクエストをバックグラウンドにスローできるため、1 つのプロセスで多数の同時 IO リクエストに対応できます。
以上がWorkerman で知っておくべきいくつかの概念の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。