[转]阻塞IO与非阻塞IO
https://blog.csdn.net/u010838785/article/details/104455173
reactor 模式
Reactor 是这样一种模式,他要求主线程(I/O 处理单元,下同)只负责舰艇文件描述符上是否有事件发生,有的话就立即将改时间通知给工作线程。除此之外主线程不做任何其他实质性的工作,读写数据,接受新的连接,以及处理客户请求均在工作线程中完成。
使用同步I/O 模型(以epoll_wait 为例)实现的Reactor 模式的工作流程是:
- 主线程往epoll 内核时间表中注册socket 上的读就绪事件
- 主线程调用epoll_wait 等待socket 上有数据可读
- 当socket 上有数据可读时,epoll_wait 通知主线程。主线程则讲socket可读事件放入到请求队列种
- 睡眠在请求队列上的某个工作线程被环形,它从socket 读取数据,并处理客户请求,然后往epoll 内科事件表中注册该socket 上的写就绪事件
- 主线程调用epoll_wait 等待socket 可写
- 当socket 可写时,epoll_wait 通知主线程。主线程将socket可写书简放入请求队列
- 睡眠在请求队列上的某个工作线程被环形,它往socket 上写入服务器处理客户请求的结果
在I/O 模型种,“同步”和“异步”区分的是内核向应用程序通知的那种I/O事件。以及该由谁完成I/O读写,在并发模式种,“同步”值得是程序完全按照代码序列的顺序执行,“异步”值得是程序的执行需要由系统的事件来驱动。