reactor
①主线程往epoll内核事件表中注册socket上有数据可读
②主线程调用epoll_wait等待socket上有数据可读
③当socket上有数据可读时,epoll_wait通知主线程。主线程则将socket可读事件放入请求队列
④睡眠在请求请求队列上的某个工作线程被唤醒,它从socket读取数据,并处理客户请求,然后往epoll内核事件表中注册该socket上的写就绪时间
⑤主线程调用epoll_wait等到socket可写
⑥当socket可写时,epoll_wait通知主线程。主线程将socket可写事件放入请求队列
⑦睡眠在请求队列上的某个工作线程被唤醒,它向socket上写入服务器处理客户请求的结果
同步模拟proactor
主线程往epoll内核事件表中注册socket上的读就绪事件
②主线程调用epoll_wait等待socket上有数据可读
③当socket上有数据可读时,epoll_wait通知主线程。主线程从socket循环读取数据,直到没有更多数据可读,然后将读取到的数据封装成一个请求对象并插入请求队列
④睡眠在请求队列上的某个工作线程被唤醒,它获得请求对象并处理客户请求,然后往epoll内核事件表中注册socket上的写就绪事件
⑤主线程调用epoll_wait等到socket可写
⑥当socket可写时,epoll_wait通知主线程。主线程往socket上写入服务器处理客户请求的结果
两者注意到io相关: reactor io操作由工作线程完成, 同步模拟的proactor由主线程完成