高性能网络模式:Reactor 和 Proactor

高效进行IO操作的方案,不外乎这二种。

说明

Reactor 是非阻塞同步网络模式,感知的是就绪可读写事件。 在每次感知到有事件发生(比如可读就绪事件)后,就需要应用进程主动调用 read 方法来完成数据的读取,也就是要应用进程主动将 socket 接收缓存中的数据读到应用进程内存中,这个过程是同步的,读取完数据后应用进程才能处理数据。

Proactor 是异步网络模式, 感知的是已完成的读写事件。 在发起异步读写请求时,需要传入数据缓冲区的地址(用来存放结果数据)等信息,这样系统内核才可以自动帮我们把数据的读写工作完成,这里的读写工作全程由操作系统来做,并不需要像 Reactor 那样还需要应用进程主动发起 read/write 来读写数据,操作系统完成读写工作后,就会通知应用进程直接处理数据。

说白了,IO操作需要等待数据传输,而传输时间太慢,远慢于内存读写速度,更别说CPU运行速度了。

为此提出了非阻塞异步的概念,与之对应的就是同步阻塞

  • 阻塞和非阻塞就是发起请求后,需不需要等待完成,不需要等待就是非阻塞。

    例如你去餐馆吃饭,下单就是发出请求,阻塞就是你一直等上菜,期间什么都不做;非阻塞就是你等菜时刷刷手机、跟朋友聊聊天,最后上菜了,等待过程也不那么无聊。

  • 同步和异步就是任务完成时,需要你去询问还是等待通知,你去询问就是在同步状态。

    还是以下馆子举例,你去下馆子,上座后,你左顾右盼有没有服务员上菜,就是在同步上菜状态,期间你可以一直观望(阻塞),也可以玩玩手机然后再观望一下(非阻塞)。

    原本你可以用这段时间去逛逛商场,去到处逛逛,但是这样就无法及时吃到饭。所以你还可以选择打电话订一桌菜,菜好了餐馆打电话通知你过去吃,这就是异步,异步一般是非阻塞的。

引用