我正在阅读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(他们可以,对吧?),哪一个会得到它?
再次,在nginx源代码中,我看到分叉的进程在相同的套接字fd上设置epoll事件,当一个事件来的时候,哪一个会得到它?
随机?循环?先进先出?lru吗?…
实际上我只是想弄清楚这些模型的负载平衡策略
正如我在《UNIX Network Programming Volume 1》中所读到的,是内核帮助均衡事件的负载。但是内核是如何做到的,我不知道,希望有人能澄清并引用一些代码。另外,我打算在将来阅读源代码,也许我可以自己找到答案。