惊群现象与select冲突

什么是惊群现象?

在TCP服务器端预先派生子进程(创建子进程池)的时候,在每个子进程中进行accept,父进程等待捕获信号(处理僵死进程等操作)所以最开始每个进程都是睡眠状态,当有一个连接到达,所有子进程全都从accept被唤醒,这就是惊群现象,但是只有最先运行的那个子进程会获得那个客户连接(是以队列形式)。预先派生的子进程越多,惊群问题就会越严重,也就越耗时。

什么是select冲突?

其实就是如果有多个进程或者线程,每个进程/线程中都阻塞在select调用中等待一个套接字,那么如果客户端有一个套接字到达的话,就会唤醒未知个select。
当有多个进程在引用同一个套接字描述符上调用select时就会发生冲突,因为在socket结构中为存放本套接字就绪的时候应该唤醒哪些进程而分配的仅仅是一个进程ID的空间,如果有多个进程在等待同一个套接字,那么内核必须唤醒的是阻塞在select调用中的所有进程(唤醒多少个select是未知的,即有多少select返回是未知的),因为内核不知道哪些进程受刚变得就绪的这个套接字影响。(在多个线程中也会冲突)。所以,如果有多个进程阻塞在引用同一个实体(例如套接字或普通文件)的描述符上,那么最好直接阻塞在诸如accept之类的函数,而不是select中。

你可能感兴趣的:(惊群现象与select冲突)