- 同步阻塞式IO:需要等待数据到内核空间和用户空间的两次拷贝
- 同步非阻塞式IO:轮询数据到内核空间的拷贝情况,等待数据到用户空间的拷贝
- 异步IO:都不等待,数据到用户空间拷贝好了后通知
NIO的实现
IO多路复用个人认为是NIO的一种实现
IO信号驱动模型也是既有NIO但是同时也进行了改进
IO多路复用
- 解决思路:应用程序不去主动查询啦,而是让系统通知我,就是一个发布订阅的过程。
- select方式:有限制fd数组最多1024个
- 应用程序调用select,将监听的fd数组传入内核,进程阻塞
- 内核一旦发现数组中的某个fd(文件描述符)ok了,给这些fd打上标记所有的fd数组,
- 应用程序遍历返回的所有fd,依次将有已完成标记的文件复制到用户空间
- poll方式:过程和select类似,但是传的是一个链表,突破1024的限制
- epoll方式
- 应用程序通过epoll_ctl()注册一个监听fd到内核的fd红黑树中
- 当红黑树中的某个fd就绪时,会放入就绪链表中
- 应用程序调用epoll_wait()时便得到通知
个人感觉IO多路复用实际上就是NIO的一种实现方式 select/poll是轮询的一种fd数组和链表,每次给内核一组fd,内核返回有就绪的fd epoll:有点事件驱动的意思啦,就是有无事件时等待,有事件时触发通知
IO信号驱动模型
信号驱动IO不再用主动询问的方式去确认数据是否就绪,而是向内核发送一个信号(调用sigaction的时候建立一个SIGIO的信号),然后应用用户进程可以去做别的事,不用阻塞。当内核数据准备好后,再通过SIGIO信号通知应用进程,数据准备好后的可读状态。应用用户进程收到信号之后,立即调用recvfrom,去读取数据。
总结
参考资料
- https://xiaolincoding.com/os/8_network_system/selete_poll_epoll.html#i-o-%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8
- https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247496448&idx=1&sn=cd502f850290a25949dd4a11ac55a039&chksm=cf222c29f855a53f094bde2868900fa252b07385e73564e9ee9f0510cb4e74387d9d23ab67e6&token=2001057130&lang=zh_CN&scene=21#wechat_redirect