1、一次IO过程
当一次读IO操作发生时,它会经历两个阶段
step1:内核等待数据准备,将数据保存在内存缓冲区
step2:内湖将数据从内核缓冲区拷贝到进程空间
2、IO模式
2.1 阻塞模式
阻塞模式的特定是两个阶段都阻塞。换句话说,
step1:如果内核缓冲区没有数据,进程阻塞
step2: 如果数据还没从内核缓冲区拷贝到进程空间,进程阻塞
2.2 非阻塞模式
非阻塞模式的特定是阶段1不会阻塞。换句话说,
step1:如果内湖还没有数据,进程返回错误
step2:数据从内核拷贝到进程的时候,进程阻塞
非阻塞模式,需要进程不断轮询去read,查验step1是否ok。
2.3 I/O多路复用
使用I/O多路复用技术,
进程阻塞在一个接口上,select、poll、epoll
只要有一个IO数据ready,接口不再阻塞
2.4 异步
异步模式的特点是,进程发起数据读操作后,内核不阻塞进程。
等内核完成
step1;内核等待数据准备,将数据保存在内存缓冲区
step2:内湖将数据从内核缓冲区拷贝到进程空间
通知进程读操作完成。
3、阻塞与非阻塞
阻塞与非阻塞的关键在于step1的处理方式。
如果内核缓冲区数据没准备好,进程陷入阻塞等待,则是阻塞模式
如果内核缓冲区数据没准备好,进程得到内核返回值,则是非阻塞模式
4、异步和同步
异步和同步的关键在于step1的处理方式。
如果内核在处理step2的时候,进程不阻塞(进程可以处理另外逻辑),则是异步
如果内核在处理step2的时候,进程阻塞(进程当前的逻辑就是拷贝数据),则是同步
所以,2.1、2.2、2.3都是同步模式。因为在内核拷贝数据到进程空间的时候,进程做不了其它逻辑