IO的同步与异步、阻塞与非阻塞,Linux五种IO模型
IO的同步与异步,阻塞与非阻塞
我们有时会看到类似于同步阻塞式IO、同步非阻塞式IO、异步IO等这些名词。
大多数时候,同步就是阻塞的,异步就是非阻塞的,比如我们并发编程里面加锁进行同步,那么获取不到锁的就要阻塞等待。但是在IO里面,同步异步与阻塞非阻塞不是同一概念。
这里面的同步、异步、阻塞、非阻塞是什么意思呢?
阻塞IO与非阻塞IO
在IO里面,当数据还没有就绪时,当前线程是否需要等待数据到达,可以分为阻塞IO与非阻塞IO。阻塞式IO是指当数据未就绪时,当前线程阻塞等待数据就绪;非阻塞式IO是指当数据未就绪时,当前线程不会阻塞等待数据就绪。
这里的数据就绪是指,数据已经加载到操作系统内核空间。比如网络IO,当数据到达网卡缓冲区,会通过DMA(Direct Memory Access——直接内存访问)设备把数据拷贝到内核空间,此时代表数据就绪,也就是等待应用程序拷贝到用户空间。
同步IO与异步IO
当数据已经达到了之后,就需要把内核空间的数据拷贝到用户空间,把内核空间的数据拷贝到用户空间是通过CPU进行拷贝。
是否需要当前线程主动去把内核空间中的数据搬运到用户空间,这又分为同步IO和异步IO。需