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);
だから私の質問は:
複数のプロセス/スレッドが fcntl() でファイルをロックしようとしている場合、どれがロックを取得しますか?
複数のプロセスがすべて同じソケット fd から accept() を実行している場合 (可能ですよね?)、どのプロセスがそれを取得しますか?
繰り返しますが、nginx ソース コードでは、フォークされたプロセスが同じソケット fd で epoll イベントを設定していることがわかります。イベントが発生すると、どちらがそれを取得しますか?
ランダム?ラウンドロビン?フィフォ?ル?...
実際、私はこれらのモデルの負荷分散戦略を理解しようとしています。