同步与异步IO区别

来源:互联网 发布:steam mac免费游戏推荐 编辑:程序博客网 时间:2024/05/16 13:51

IO模型

要介绍同步IO与异步IO,得先介绍Unix5种I/O模型:
1. 阻塞IO
2. 非阻塞IO
3. IO复用(select和poll)
4. 信号驱动式IO(SIGIO)
5. 异步IO(aio_系列函数)

5种IO模型都包含两个阶段:
1. 等待数据准备好(等待数据从网络中到达,数据到达后,被复制到内核的缓冲区中)
2. 从内核缓冲区向用户缓冲区复制数据

分别介绍不同的IO模型,并且使用UDP作为例子,因为UDP整个数据报要么已经收到,要么没有。

阻塞IO

这里写图片描述

进程调用recvfrom,该系统调用直到数据报到达且被复制到应用进程的缓冲区或者发生错误才返回,常见的错误是系统调用被系统中断,

非阻塞IO

这里写图片描述

等待数据的阶段是非阻塞的,也就是当没有数据报准备好,recvfrom立即返回一个错误,但是当数据包准备好了,recvfrom将数据报从内核缓冲区复制到应用进程缓冲区后返回。

IO复用

这里写图片描述

如图,io复用模型是阻塞在select或者poll这两个系统调用之上的,而没有阻塞在真正的I/O系统调用如recvfrom之上,它等待数据报套接字变为可读,当数据报可读时,调用recvfrom把数据报复制到应用进程缓冲区中。

信号驱动式IO

这里写图片描述

通过sigaction系统调用安装一个信号处理函数,系统调用立即返回,当数据报准备好读取时,内核产生一个信号,随后就可以在信号处理函数中调用recvfrom读取数据报,将数据从内核空间复制到用户空间。

异步IO

这里写图片描述

调用aio_系列函数,给内核传递描述符、缓冲区指针、缓冲区大小和文件偏移,该系统调用立即返回,当整个IO操作完成,即数据报到达,并且从内核缓冲区被复制到用户缓冲区后,才产生一个信号。

IO模型比较

对比几种模型,可以看出,前4种模型区别主要在第一阶段,它们的第二阶段是一样的:在数据从内核复制到调用者缓冲区期间,进程是阻塞于recvfrom调用,而异步IO,这两个阶段都要处理完毕。

同步IO/异步IO

同步IO操作:导致请求进程阻塞,知道IO操作完成。
异步IO操作:不导致进程阻塞。

这里写图片描述
所以前4种都是同步IO模型,因为发生了阻塞。

阻塞/非阻塞

在处理(网络) IO 的时候,阻塞和非阻塞都是同步IO,阻塞与非阻塞的区分在于网络IO时进行IO操作的线程会不会挂起,其实对于某些IO模型来说,阻塞非阻塞其实比较难定义,比如select模型中指用户线程不会阻塞于recvfrom等网络IO操作上,但在select操作本身上是阻塞的,不过因为网络IO并未阻塞的原因仍称selec模型为非阻塞的模型。

原创粉丝点击