IO模型-同步IO、异步IO、阻塞IO、非阻塞IO

同步I/O与异步I/O

同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。

1
指的是用户空间和内核空间数据交互的方式

同步I/O

同步IO

用户使用应用程序时获取数据的步骤如下:

1
2
3
4
5
从用户空间应用程序获取数据,命中则返回
用户空间调用系统提供的SystemCall函数向内核空间申请读取磁盘
内核空间异步向磁盘发出指令等待磁盘可读取时通过DMA模式拷贝数据至内核缓存
通过CPU拷贝数据至用户空间应用缓存
返回用户应用所需数据

在调用SystemCall函数后会一直等待内核空间给到用户空间应用缓存后才做其他事情

异步I/O

异步IO

用户使用应用程序时获取数据的步骤如下:

1
2
3
4
从用户空间应用程序获取数据,命中则返回
用户空间调用系统提供的SystemCall函数向内核空间申请读取磁盘,立即返回等待通知,此时可处理其他事情
内核空间异步向磁盘发出指令等待磁盘可读取时通过DMA模式拷贝数据至内核缓存同时通过CPU拷贝数据至用户空间应用缓存并通知用户空间数据可用
返回用户应用所需数据

在调用SystemCall函数后会立即返回等待通知,同时可以处理其他事情,内核缓存会主动将数据从高速缓存页拷贝到应用缓存并且通知用户空间数据可用

阻塞I/O与非阻塞I/O

阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。

1
2
3
4
指的是用户空间和内核空间IO操作的方式
堵塞:用户空间通过系统调用(Systemcall)和内核空间发送IO操作时,该调用是堵塞的
非堵塞:用户空间通过系统调用(Systemcall)和内核空间发送IO操作时,该调用是不堵塞的,直接返回的,
只是返回时,可能没有数据而已
觉得文章有用的话,欢迎点赞打赏~