Linux典型IO模型:阻塞、非阻塞、信号驱动、异步

简介: 【2月更文挑战第4天】

一、阻塞IO

       为了完成IO发起IO调用,若IO事件没有就绪,则一直等待,直到IO就绪,开始数据拷贝。

优点:流程最为简单,使用复杂度非常低。

缺点:IO效率较低,对资料利用不足。

image.png

二、非阻塞IO

        为了完成IO发起IO调用,若IO事件没有就绪,则调用直接返回(返回后,先进行一些其他任务,之后再重新发起IO调用)。

优点:不等待IO就绪,而是直接立即返回,可以继续对其他描述符进行IO操作,充分利用资源,效率相较于阻塞IO有所提高。

缺点:IO不够实时,且通常需要循环进行操作,增加了一定的复杂度。

image.png

三、信号驱动IO

       先定义IO就绪信号处理方式,当收到信号通知,则表示IO就绪,随后发起IO调用,完成IO操作。

优点:效率更高,更加实时,更加充分利用资源(在没有收到IO信号之前,可以进行其他任务处理,收到信号后,再进行IO请求)。

缺点:IO复杂度更高,需要涉及到信号操作。

image.png

四、异步IO

       发起IO调用,让系统进行IO就绪等待以及完成数据拷贝,完成后再通过信号通知进程。

注意:

(1)异步IO会告诉系统,需要对哪个描述符进行什么IO操作,要把IO操作的数据拷贝到哪块缓冲区,以及完成后通过什么信号通知进程。

(2)当进程收到信号,就表示IO已经完成,这时就可以直接对指定缓冲区中的数据进行处理。

优点:对系统资源利用非常高,效率也是最高。

缺点:流程复杂度也是最高。

image.png

五、阻塞VS非阻塞(概念)

1.阻塞

       为了完成某个功能,发起一个调用,若功能无法立即完成,则调用不返回一直等待。

2.非阻塞

       为了完成某个功能,发起一个调用,若功能无法立即完成,则报错返回。

3.区别与联系

       阻塞与非阻塞,都是讨论接口特性,表示一个函数在完成某个功能时,若无法立即完成,是否会立即返回。

六、同步VS异步(概念)

1.同步

(1)是一种流程化操作,一个功能完成后才能进行下一个功能。

(2)功能的完成顺序固定。

(3)功能通常都是由自己完成。

例如:IO操作,一个IO操作完成后,才能进行下一个IO操作,(这就是同步IO)IO的完成过程是由进程自身完成。

优点:操作流程简单

缺点:效率相较较低

2.异步

(1)是一种非流程化操作,无论一个功能是否已经完成,都可以进行下一个功能。

(2)功能的完成顺序不确定。

(3)功能通常都是由别人完成。

例如:IO操作,不管是否完成,都可以立即发起下一个IO操作,IO的完成过程由系统完成。

优点:对系统资源利用更充分,效率相较更高

缺点:流程较为复杂

3.区别与联系

       同步与异步,都是讨论功能的完成方式,同步表示的是按序由自己完成;异步表示的是非按序由系统完成。

同步:操作流程简单,但效率相较较低。

异步:对系统资源利用更充分,效率相较更高,但流程较为复杂。

相关文章
|
1月前
|
并行计算 数据处理 Python
Python并发编程迷雾:IO密集型为何偏爱异步?CPU密集型又该如何应对?
在Python的并发编程世界中,没有万能的解决方案,只有最适合特定场景的方法。希望本文能够为你拨开迷雾,找到那条通往高效并发编程的光明大道。
42 2
|
2月前
|
开发框架 并行计算 算法
揭秘Python并发神器:IO密集型与CPU密集型任务的异步革命,你竟还傻傻分不清?
揭秘Python并发神器:IO密集型与CPU密集型任务的异步革命,你竟还傻傻分不清?
44 4
|
2月前
|
算法 Java 程序员
解锁Python高效之道:并发与异步在IO与CPU密集型任务中的精准打击策略!
在数据驱动时代,高效处理大规模数据和高并发请求至关重要。Python凭借其优雅的语法和强大的库支持,成为开发者首选。本文将介绍Python中的并发与异步编程,涵盖并发与异步的基本概念、IO密集型任务的并发策略、CPU密集型任务的并发策略以及异步IO的应用。通过具体示例,展示如何使用`concurrent.futures`、`asyncio`和`multiprocessing`等库提升程序性能,帮助开发者构建高效、可扩展的应用程序。
109 0
|
3月前
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
44 6
|
3月前
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
50 5
|
2月前
|
Linux API
Linux里的高精度时间计时器(HPET)驱动 【ChatGPT】
Linux里的高精度时间计时器(HPET)驱动 【ChatGPT】
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
4月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
2月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
|
3月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
46 2
下一篇
无影云桌面