IO模型

2022-08-20  本文已影响0人  夏虫亦可语冰

阻塞IO

我们知道在调用某个函数的时候无非就是两种情况,要么马上返回,然后根据返回值进行接下来的业务处理。当在使用阻塞IO的时候,应用程序会被无情的挂起,等待内核完成操作,因为此时的内核可能将CPU时间切换到了其他需要的进程中,在我们的应用程序看来感觉被卡主(阻塞)了。

image.png

非阻塞IO

当使用非阻塞函数的时候,和阻塞IO类比,内核会立即返回,返回后获得足够的CPU时间继续做其他的事情。

image.png

IO复用模型

当等待标准输入的时候,如果此时套接字有数据但不能读出。IO多路复用意味着可以将标准输入、套接字等都当做IO的一路,任何一路IO有事件发生,都将通知相应的应用程序去处理相应的IO事件,在我们看来就反复同时可以处理多个事情。这就是IO复用。

image.png

信号驱动IO

在信号驱动式 I/O 模型中,应用程序使用套接口进行信号驱动 I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个 SIGIO 信号,可以在信号处理函数中调用 I/O 操作函数处理数据。

image.png

优点:

缺点:

异步IO

用程序告知内核启动某个操作,并让内核在整个操作(包括将数据从内核拷贝到应用程序的缓冲区)完成后通知应用程序。

同步与异步

对于发生一次网络IO,可以分为两部分:

1、等待数据:

阻塞:线程挂起,等待内核完成操作。

非阻塞:马上返回,无论是否完成。

2、将数据从内核复制到用户空间:

同步:线程自己把数据从内核复制到用户空间,期间不能做其它事情,一直等待数据复制完毕。

异步:系统内核把数据从内核复制到用户空间,然后再通知相应线程进行数据处理。

总结:
阻塞/非阻塞:发生请求后,是否等待接收方处理好数据(是否等待数据处理好)。

同步/异步: 线程是否需要等待数据从内核复制到用户空间(是否等待数据复制)。

上一篇 下一篇

猜你喜欢

热点阅读