Rector模式和同步IO模拟Reactor模式,proactor模式和异步IO模拟proactor模式

Reactor模式本身就是一种同步IO模式
Reactor模式的流程如下:
1、应用程序注册socket的读写就绪事件,和事件处理器
2、事件分类器等待读写就绪事件
3、当事件分离器监听到读写就绪事件后。会调用注册的事件处理器。
4、事件处理器首先会执行IO读写操作,然后将数据根据读取的内容进行进一步的处理
在这里插入图片描述
使用同步IO来模拟Reactor模式的流程如下:
1、主线程首先将socket的读就绪事件注册到epoll内核注册表中,
2、主线程调用epoll等待socket的读就绪事件
3、epoll返回就绪的socket(socket上有数据可读)并通知主线程,主线程将该socket读就绪事件放入到请求队列中
4、睡眠在请求队列的某个工作线程被唤醒,处理该socket读就绪事件,处理完成后,将该socket的写就绪事件注册到epoll内核注册表中
5、主线程调用epoll等待socket的写就绪事件
6、epoll返回socket写就绪事件,主线程将写就绪socket放入请求队列,
7、睡眠在请求队列的工作线程被唤醒,处理该socket写事件
画张图更直观
在这里插入图片描述
Proactor模式的流程如下:
1、应用程序初始化一个异步读取操作,然后注册事件处理器,该事件处理器并不负责IO数据的读取,而只负责操作已经被读取的数据
2、事件分离器等待读完成事件
3、事件分离器在等待读取完成操作的时候,操作系统的内核负责IO读取,并将读取的数据传入到用户的缓冲区
4、事件分离器监听到读事件完成后调用事件处理器
5.事件处理器负责操作用户缓冲区数据,并进一步处理
在这里插入图片描述
异步IO模拟Proactor
aio_read和aio_write函数可以获取更多的异步I/O的数据,并可以更好地控制异步I/O。虽然大多数字符设备都不使用aio_read和aio_write函数

1、主线程调用aio_read想epoll的内核注册表中注册socket的读完成事件,并告诉内核,用户的缓冲区地址以及读操作完成后如何通知应用程序
2、主线程去处理其他逻辑
3、socket的数据被内核读取到用户缓冲区后,内核发送一个信号到通知应用程序数据已经可用
4、应用程序在在预先定义好的信号处理函数中接受到该信号,并且负责调用一个工作线程来负责处客户端的请求(操作读取到的缓冲区数据),处理完成后,调用aio_write函数向epoll注册socket上的写完成事件,并告知内核用户写缓冲区的位置,写完成事件后,如何通知应用
5、主线程负转向去处理其他的逻辑,
6、当用户缓冲区的数据被写到socket中后,内核向应用程序发送一个信号,通知应用程序写完毕
7、应用程序在信号函数中,调用一个工作线程来做善后处理,
在这里插入图片描述
通过上述对比我们可以发现, Reactor和Proactor的本质区别在于究竟由谁来负责IO,reactor的IO是由事件处理器负责,在同步模拟中是由工作线程负责读取,而在Proactor中由内核负责,事件处理器只负责操作被读取到的数据,在异步模拟中,也是由内核负责读取,由工作线程来负责操作读取到的数据,

在同步和异步模拟中,epoll就相当于事件分离器,工作线程相当于事件处理器

发布了1 篇原创文章 · 获赞 6 · 访问量 2747

猜你喜欢

转载自blog.csdn.net/weixin_38054045/article/details/103498854