Loading... <p><strong><span style="font-size: 20px">1. 四种理论的I/O模型 </span></strong></p> <p> 1) 调用者(服务进程):</p> <p> 阻塞: 进程发起I/O调用,如果调用为完成,进程被挂起休眠,不能再执行其他功能</p> <p> 非阻塞:进程发起I/O调用,被调用的函数完成之前,依然可以执行其他功能</p> <p> 2) 被调用函数或过程(系统调用I/O读写操作)</p> <p> 同步: 函数或功能被进程调用时,不立即返回值,直到此调用完成 </p> <p> 异步: 函数或功能被进程调用时,不能立即完成则返回未完成状态,完成后通知调用进程</p> <p> 3)四中理论模型</p> <p> 同步阻塞 </p> <p> 同步非阻塞(几乎没人使用)</p> <p> 异步阻塞 </p> <p> 异步非阻塞: 真正的异步I/O </p> <p> </p> <p><strong><span style="font-size: 20px">2. 五种网络服务中的I/O模型 </span></strong> </p> <p> <strong>1) 同步阻塞模型</strong></p> <p> 工作进程调用I/O请求库函数后,工作进程被阻塞等待I/O完成第一阶段,数据从硬盘加载到内核空间,此时工作进程在库函数返回数据之前继续被阻塞参与完成第二阶段数据从内核空间复制到用户进程空间的过程,最后拿到数据。 </p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703163704-46.png" title="1432650073140859.png" alt="同步阻塞.png" width="574" height="401" style="width: 574px;height: 401px" /></p> <p> <strong> 2)I/O复用(同步阻塞模型)</strong>:select(), poll()</p> <p> 工作进程调用一个管理I/O的特殊库函数,此库函数可以接受并管理多个I/O请求,工作进程则可以同时等待多个I/O请求,虽然是阻塞,但是阻塞在多个进程上,可以提高效率。第二阶段依然需要工作进程参与库函数把内核空间数据复制到用户空间,第二阶段依旧阻塞。 </p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703163705-12.png" title="1432650528311105.png" alt="IO复用模型.png" width="722" height="459" style="width: 722px;height: 459px" /></p> <p> <strong>3) 同步非阻塞(盲等待模型)</strong></p> <p> 工作进程调用I/O库函数,工作进程不需要I/O完成依旧可以处理其他事物,但是需要反复查看I/O是否完成。第二阶段依然需要工作进程参与库函数把内核空间数据复制到用户空间,第二阶段依旧阻塞。 </p> <p> </p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703163705-18.png" title="1432650839101199.png" alt="同步非阻塞.png" width="604" height="431" style="width: 604px;height: 431px" /></p> <p> <strong>4) 事件触发模型(同步非阻塞)</strong>: epoll(), kqueue() </p> <p> 工作进程调用I/O库函数,工作进程不需要等待I/O完成,内核空间I/O完成后会通过事件通知进程。第二阶段依然需要工作进程参与库函数把内核空间数据复制到用户空间,第二阶段依旧阻塞。 </p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703163706-7.png" title="1432650987278790.png" alt="事件驱动(同步非阻塞).png" width="641" height="464" style="width: 641px;height: 464px" /></p> <p> <strong>5) 全异步:AlO 调用</strong></p> <p> 全异步1: 工作进程调用I/O库函数,工作进程不需要等待I/O完成,内核空间I/O完成后会通过事件通知进程。第二阶段不需要工作进程参与库函数把内核空间数据复制到用户空间,库函数完成复制后自行返回数据给工作进程</p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703163706-50.png" title="1432651210109294.png" alt="异步非阻塞.png" width="605" height="435" style="width: 605px;height: 435px" /></p> <p> 全异步2: 工作进程调用I/O库函数,工作进程不需要等待I/O完成,内核空间I/O完成后会通过事件通知进程。第二阶段不需要库函数从内核空间复制数据,而是通过内存映射来实现(mmap)。 </p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703163707-59.png" title="1432651340302099.png" alt="mmap.png" width="606" height="458" style="width: 606px;height: 458px" /></p> <p> 实现以上功能,libevent 库 </p> <p> <img src="//cto.wang/usr/uploads/2016/07/20160703163707-26.png" title="1432651857127553.png" alt="libevent.png" /></p> <p></p> <p></p> <p></p> <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信