什么是“惊群效应”?
举个例子,当你往一群鸽子中间扔一块食物,所有的鸽子都被惊动来抢夺这块食物,但是最终只能有一只鸽子可以抢到食物,没有抢到食物的鸽子只能回去继续睡觉,等待下一块食物的到来。这里我们可以将鸽子看做是进程(线程),食物就是等待处理的事件。
网络编程的时候经常会用到多进程或多线程模型,就是父进程创建socket,bind、listen后,通过fork创建多个子进程,每个子进程继承了父进程的socket,调用accpet开始监听等待网络连接。这个时候有多个进程(线程)同时等待网络的俩连接事件,当这个事件发生时,这些进程(线程)被同时唤醒,就是“惊群效应”。
惊群现象就是多进程(线程)在同时阻塞等待同一个事件时(即处于休眠状态),如果等待这个事件发生,那么就会唤醒等待的所有进程(线程),但是始终只能有一个进程(线程)获得这个时间的“控制权”,对该事件进行处理,而其他进程(线程)获取“控制权”失败,只能重新进入休眠状态,这种现象和性能浪费就叫做“惊群效应”。
那么,惊群现象会消耗什么?
1.系统对用户线程频繁的做无效的调度、上下文切换,系统性能降低。
2.为了确保只有一个线程得到资源,用户必须对资源进行加锁保护,进一步加大了系统开销。