IO模型之我见

一、IO操作步骤

IO操作包含以下两个阶段:
1、 数据准备阶段:IO进程等待数据准备好到阶段
2、 数据传输阶段:IO进程在数据准备好后,在内核空间接受数据,并将接收到的数据从内核空间拷贝到进程用户空间的阶段

二、IO模型分析

1、阻塞IO(BlockingIO)

在IO的两个阶段都阻塞用户进程执行都阶段,在IO操作完成后

2、非阻塞IO(NonBlockingIO)

等待阶段先判断内核数据是否准备好,如果数据未准备好则立即返回错误码,如果数据准备好,则进入到数据传输阶段阻塞进程执行数据传输

3、同步IO

在执行IO操作的任一阶段阻塞用户进程的操作属于同步IO

4、异步IO

IO操作不阻塞请求进程的操作,进程发起IO操作后立即返回,直到内核在数据准备好并传输结束后通过发送IO操作完成都信号,整个IO操作都没有阻塞进程

5、IO复用

同时等待多个IO,如果任意一个IO数据准备好就返回进行数据传输, IO复用的方式包括select、poll、epoll、kqueue或者libevent

PS. 由于阻塞IO在两个阶段都会阻塞调用进程,非阻塞IO和IO复用在传输阶段会阻塞调用进程,因此都属于同步IO。

三、IO模型实例

去餐厅吃饭包括等位和等餐两个阶段。
团队TB过程中去一家餐厅吃饭,结果餐厅爆满需要排队,如果团队一直等待位置并在位置准备好后在餐厅等餐的过程称为阻塞方式,如果团队发现餐厅需要等待直接离开去寻找下一家餐厅即返回错误,在找到一个无需等位的餐厅后直接坐下等餐的过程称为非阻塞方式,由于等位或者等餐都会阻塞团队工作,所以都称为同步IO
如果团队成员分散到多个餐厅同时等位,任意一个等位成功,则所有成员都到这个餐厅一起等餐,称为IO复用,由于等餐需要阻塞Team,所以也称为同步IO
由于工作实在太忙,团队成员都非常不愿意等位或者等餐直接点了外卖,则点完就继续干活,直到外卖员在餐厅等位并等待后厨准备完餐后直接通知团队,团队在收到通知后直接用餐,这种方式称为异步IO。

猜你喜欢

转载自blog.csdn.net/liushaofang/article/details/108885195