I/O模型
同步I/O
- 阻塞I/O,I/O复用,和信号驱动I/O 都是同步I/O模型.
- 这种I/O的读写操作,都是在I/O事件发生之后,由应用程序来完成.
- 同步I/O模型要求用户代码自行执行I/O操作,将数据从内核缓冲区读入用户缓冲区,或将数据从用户缓冲区写入内核缓冲区.
异步I/O
- 异步I/O机制则由内核来执行I/O操作,数据在内核缓冲区和用户缓冲区之间的移动是由内核在’后台完成的’
*也就是说,同步I/O向应用程序通知的是I/O就绪事件,异步I/O向应用程序通知的是I/O的完成事件.
Reactor和Proactor事件处理模式
同步I/O模型常用于实现Reactor模式,异步I/O模型则用于实现Proactor模式.
Reactor模式
- 它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将事件通知工作线程(逻辑单元).
实现Reactor模式的工作流程是,以(epoll_wait为例) - 主线程往epoll内核事件表中注册socket上的读就绪事件.
- 主线程调用epoll_wait等待socket上有数据可读。
- 当socket上有数据可读时,epoll_wait通知主线程,主线程则将socket可读事件放入请求队列。
- 睡眠在请求队列上的某个工作线程被唤醒,它从socket上读取数据,并处理客户端的请求,然后往epoll内核事件中注册该socket上的写事件.
- 主线程调用epoll_wait等待socket可写.
- 当socket可写时,epoll_wai