IO模型
LINXU 有五种io模型
- 阻塞IO
- 非阻塞IO
- 多路复用IO
- 事件驱动IO
- 异步IO
- 阻塞IO
用户态请求内核态数据的时候,
内核态的数据还没有准备好,
所以用户态需要等待(阻塞)内核态拿到数据,
期间用户线程不能做其他事情。
因此被称为阻塞IO
- 非阻塞IO
跟阻塞IO一样,
但是内核态在没有准备好数据的时候会直接返回给用户态一个值(这个值是自定义的,
用来表示重试或者表示没有拿到数据),
用户态在拿到这个数据去做其他的操作,
因此用户态需要不停轮询来判断内核态是否有数据到达了。
一旦有数据到达,
则立马去内核态拿数据。
在拿数据这期间用户态是阻塞状态。
所以非阻塞IO本质还是有一部分是阻塞状态
- 多路复用IO
多路复用IO在非阻塞IO基础上增加了一些东西,
具体就是单独用一个线程或者一个进程去监听内核态的数据是否到达,
一旦到达立马通知用户态来取数据,
用户态取数据这期间依然是阻塞状态。
跟非阻塞的优点就是可以用一个线程监听很多个IO操作,
因此被称为多路复用IO
- 异步IO
异步IO也有监听内核态的线程或进程,
但是不一样的地方是如果内核态准备好了,
就会把准备好的数据写入到用户态的缓存区中,
然后通知用户态来拿数据。用户态接到通知后,
会去缓存区拿到该数据。因此不会阻塞用户态,
是真正的异步IO