I/O的基本概念
⼀次完整的I/O是⽤⼾空间的进程数据与内核空间的内核数据的报⽂的完整交换,但是由于内核空间与⽤⼾空间是严格隔离的,所以其数据交换过程中不能由⽤⼾空间的进程直接调⽤内核空间的内存数据,⽽是需要经历⼀次从内核空间中的内存数据copy到⽤⼾空间的进程内存当中,所以简单说I/O就是把数据从内核空间中的内存数据复制到⽤⼾空间中进程的内存当中。
⽹络通信就是⽹络协议栈到⽤⼾空间进程的IO就是⽹络IO
磁盘I/O是进程向内核发起系统调⽤,请求磁盘上的某个资源⽐如是⽂件或者是图⽚,然后内核通过相应的驱动程序将⽬标图⽚加载到内核的内存空间,加载完成之后把数据从内核内存再复制给进程内存,如果是⽐较⼤的数据也需要等待时间。
同步/异步:关注的是事件处理的消息通信机制,即在等待⼀件事情的处理结果时,被调⽤者是否提供完成通知。
同步:synchronous,调⽤者等待被调⽤者返回消息后才能继续执⾏,如果被调⽤者不提供消息返回则为同步,同步需要调⽤者主动询问事情是否处理完成。
异步:asynchronous,被调⽤者通过状态、通知或回调机制主动通知调⽤者被调⽤者的运⾏状态
阻塞/⾮阻塞:关注调⽤者在等待结果返回之前所处的状态
阻塞:blocking,指IO操作需要彻底完成后才返回到⽤⼾空间,调⽤结果返回之前,调⽤者被挂起,⼲不了别的事情。
⾮阻塞:nonblocking,指IO操作被调⽤后⽴即返回给⽤⼾⼀个状态值,⽆需等到IO操作彻底完成,最终的调⽤结果返回之前,调⽤者不会被挂起,可以去做别的事情。
通过一个简单的例子来理解一下同步异步和阻塞和非阻塞
我点了10个包子
同步与异步:
我点包子之后厨师是否告诉我:
同步:厨师做好包子后会放到指定位置,但是做好包子之前需要自己-次次去看包子做好没有,厨师不会在包子做
好之后通知我。
异步:厨师做好包子后告诉我包子做好放哪了。
阻塞与非阻塞:
我点包子后的状态:
阻塞:在厨师做包子期间-直在包子盘子前面等着,不能干别的事情。
非阻塞:点完包子就可以去干别的事情,比如去逛逛街或者买买买。
I0模型组合:
同步阻塞:我点完包子后不能去做别的事情,而且不知道包子有没有做好,需要自己一直等着并一次次的问厨师做好
没有。
同步非阻塞:点完包子后可以去做别的事情,但是不能长时间做别的事情,因为我还是不知道包子有没有做好,也要
自己一直等着并一一次次的问厨师做好没有, 只能抽空做点别的。
异步阻塞:我点完包子后不能去走做别的事情,但是厨师在做好包子后会告诉我,也就是我不用再一次次为厨师包子
有没有做好了。
异步非阻塞:我点完包子后可以做别的事情,而且可以一-直在做别的去事情,因为厨师在做好包子后会告诉我。