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 网络编程第 1 卷中所读到的,它是有助于均匀地负载平衡事件的内核。但是内核如何做到这一点超出了我的理解,希望有人能澄清它并引用一些代码。另外我以后要阅读源代码,也许我可以自己找到答案。

于 2013-03-16T17:44:11.520 回答