Reactor
Reactor 采用I/O多路复用监听事件,收到事件后,根据事件类型分配给某个进程/线程。
实际应用中用到的模型:
单 Reactor 单进程
单 Reactor 多线程
优点:能充分利用多核CPU性能。
缺点:存在多线程竞争共享资源。(比如子线程处理完业务后,要把结果传递给主线程的Handler进行发送,这里涉及共享资源的竞争)
多 Reactor 多进程 / 线程
单 Reactor 模式存在的问题:一个 Reactor 对象承担所有事件的监听和响应,而且只在主线程运行,在面对瞬间高并发场景时,会出现性能瓶颈。
多 Reactor 多线程:
惊群现象
惊群现象是指在多进程或多线程的并发系统中,当某个资源或事件变得可用时,多个等待的进程或线程会同时被唤醒,导致它们竞争资源或进行相同的操作,从而引发系统的性能下降,甚至出现大量无效的工作。
如何避免惊群现象?
1.使用信号量或条件变量管理线程的唤醒,保证每次只有一个线程被唤醒。
2.将待处理的任务放入队列,唤醒的线程按照一定顺序依次处理任务,从而避免多个线程同时处理相同任务的情况。
3.采用延迟唤醒机制。比如,可以在满足条件时仅唤醒一个线程,或者通过短暂的延时来避免大量线程同时被唤醒。
4.采用负载均衡策略,将多个进程/线程分配到不同的资源池中,确保每个线程不会竞争同一个资源,降低资源冲突的可能性。
Proactor
Linux 网络编程中的 socket 不支持异步I/O,所以基于 Linux 的高性能网络程序都是使用 Reactor 方案;Windows 网络编程中的 socket 支持异步I/O,能实现效率更高的 Proactor 方案。