我正在阅读 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 事件,当一个事件到来时,哪个会得到它?
随机的?循环赛?先进先出?鲁?...
其实我只是想弄清楚这些模型的负载平衡策略。