0

php-cgi のソース コードを読んでいると、フォークされた子プロセスが fcntl(fd, F_SETLKW, &lock) を使用してソケット fd のロックを待ってから、accept() を実行していることがわかります。

FCGI_LOCK(req->listen_socket);
req->fd = accept(listen_socket, (struct sockaddr *)&sa, &len);
FCGI_UNLOCK(req->listen_socket);

だから私の質問は:

  1. 複数のプロセス/スレッドが fcntl() でファイルをロックしようとしている場合、どれがロックを取得しますか?

  2. 複数のプロセスがすべて同じソケット fd から accept() を実行している場合 (可能ですよね?)、どのプロセスがそれを取得しますか?

  3. 繰り返しますが、nginx ソース コードでは、フォークされたプロセスが同じソケット fd で epoll イベントを設定していることがわかります。イベントが発生すると、どちらがそれを取得しますか?

ランダム?ラウンドロビン?フィフォ?ル?...

実際、私はこれらのモデルの負荷分散戦略を理解しようとしています。

4

1 に答える 1

0

UNIX Network Programming Volume 1 で読んだように、イベントを均等に負荷分散するのに役立つのはカーネルです。しかし、カーネルがどのようにそれを行うのかは私にはわかりません。誰かがそれを明確にしていくつかのコードを引用できることを願っています。また、今後ソースコードを読んでみますが、自分で答えを見つけられるかもしれません。

于 2013-03-16T17:44:11.520 に答える