阻塞方法,如fcntl()和accept(),哪一个请求者将获得它



我正在阅读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(他们可以,对吧?),哪一个会得到它?

  3. 再次,在nginx源代码中,我看到分叉的进程在相同的套接字fd上设置epoll事件,当一个事件来的时候,哪一个会得到它?

随机?循环?先进先出?lru吗?…

实际上我只是想弄清楚这些模型的负载平衡策略

正如我在《UNIX Network Programming Volume 1》中所读到的,是内核帮助均衡事件的负载。但是内核是如何做到的,我不知道,希望有人能澄清并引用一些代码。另外,我打算在将来阅读源代码,也许我可以自己找到答案。

最新更新