参考:
《Linux-unix系统编程手册》
《Unix环境高级编程》
从内核当中来看可以分为五种IO模型:阻塞IO
,非阻塞IO
,IO多路复用
,信号驱动IO
,异步IO
,每一种IO模型的出现都是对前一种的升级优化。
传统的阻塞IO,就是默认的read()和write()系统调用。
<aside> 🚞 磁盘文件是个特例,因为内核使用缓冲区进行了优化。
O_SYNC
标志)。read()
调用将数据从内核缓冲区 cache 移动到用户的缓冲区中,如果请求的数据不在内核缓冲区 cache,那么内核就会让进程休眠,同时执行对磁盘的读操作。
</aside>满足两种需求:
有两种部分解决的手段:
O_NONBLOCK
来实现非阻塞的打开文件,如果系统调用无法完成,则会返回错误。周期性的检查某个 fd 是否能进行IO操作,但是轮询的周期设置很重要,容易造成无意义的CPU空转。