socket编程的一些问题

多个进程监听一个socket

对于监听一个socket来说,多个进程同时在accept处阻塞,当有一个连接进入,多个进程同时被唤醒,但之间只有一个进程能成功accept,而不会同时有多个进程能拿到该连接对象,操作系统保证了进程操作这个连接的安全性。

扩展:上述过程,多个进程同时被唤醒,去抢占accept到的资源,这个现象叫“惊群”,而根据网上资料,Linux 内核2.6以下,accept响应时只有一个进程accept成功,其他都失败,重新阻塞,也就是说所有监听进程同时被内核调度唤醒,这当然会耗费一定的系统资源。 而2.6以上,则已经不存在惊群现象了,但是由于开发者开发程序时使用了如epoll等异步通知技术,仍然会造成惊群,如有需要更高性能要求,或许参考nginx的实现方案,这里就不详述了。

作者:云帆技术博客

这个方面可以从socket的accept函数的源码中得到解答,每个socket维护了一个deque来存储请求,可见是个FIFO的请求结构。

分享到