[Linux]五种IO模型(图文讲解+故事讲解)

目录

一、对IO的理解:等+拷贝

拷贝

二、五种IO模型(解释其概念)

1.阻塞IO

2.非阻塞IO

3.信号驱动IO

4.IO多路复用

5.异步IO

 IO速度比较

三、一个故事让你了解五种IO模型

四、同步VS异步   阻塞VS非阻塞 

同步VS异步

阻塞VS非阻塞 


一、对IO的理解:等+拷贝

  • 等待外设就绪在进行I/O操作时,由于外设(如硬盘、网络设备等)的速度通常远低于CPU的速度,因此CPU在执行I/O指令后往往需要等待外设完成操作。这种等待是I/O操作中的一个基本且常见的特性。
  • 在现代操作系统中,为了提高CPU的利用率,通常会使用中断(Interrupt)和DMA(直接内存访问)等技术来管理I/O操作,使得CPU在等待I/O操作完成期间可以执行其他任务。但是,从应用程序的角度来看,I/O操作仍然是一个“等待”的过程。(备注:中断是一种硬件或软件生成的信号,用于中断正在执行的程序,将控制权转移到处理中断的程序上,DMA是一种机制,允许输入/输出设备直接访问系统内存,而无需通过处理器的干预)

拷贝

        拷贝数据:在I/O操作中,数据通常需要在不同的存储介质或内存区域之间移动。这种移动过程本质上就是数据的拷贝。

二、五种IO模型(解释其概念)

1.阻塞IO

在内核将数据准备好之前,系统调用将会一直等待,所有的套接字, 默认都是阻塞方式.阻塞IO是最常见的IO模型。

2.非阻塞IO

也称为非阻塞轮询式IO,如果内核未将数据准备好,系统调用不会等待阻塞,会直接返回,且返回的是EWOULDBLOCK错误码。注意:使用非阻塞IO,一般要进行轮询操作,即反复的进行IO操作(如读写文件等操作,看看文件描述符是否已经就绪)直到操作完成,这对CPU是一个很大的消耗,一般只有特定的场景才使用。

3.信号驱动IO

内核将数据准备好之后,发送SIGIO信号通知应用程序进行IO操作。允许应用程序在等待IO操作完成时执行其他任务。

4.IO多路复用

同时监视多个IO操作的技术,它可以提高程序的效率,能够同时等待多个文件描述符的就绪状态.,最常见的IO多路复用机制是selectpollepoll(主要在Linux上),这些机制允许单个线程或进程监视多个文件描述符,以查看是否有IO操作准备就绪。一旦有IO操作就绪,程序就可以执行相应的读写操作,而不会阻塞整个程序。

5.异步IO

异步IO是最高效的IO模型之一。在异步IO模型中,应用程序发起一个IO操作,并立即返回继续执行后续操作,而不会阻塞当前线程。当IO操作完成时,内核会通知应用程序,通常是通过回调函数或事件。这样,应用程序可以在不牺牲性能的情况下,同时处理多个IO操作。 

 IO速度比较

从速度角度来看,异步IO > IO多路复用 > 信号驱动IO > 非阻塞IO > 阻塞IO。然而,这种比较并不是绝对的,因为实际速度还受到多种因素的影响,如操作系统的支持、硬件性能、IO操作的类型(如磁盘IO、网络IO)以及应用程序的具体实现等。因此,在选择IO模型时,需要根据实际应用场景和需求进行综合考虑。

三、一个故事让你了解五种IO模型

在一条河边有五个人在钓鱼:

人分别为:张三(代表阻塞IO),李四(代表非阻塞IO),王五(代表信号驱动IO),赵六(代表IO多路复用),田七(代表异步IO)

河:操作系统,鱼竿:文件描述符,鱼漂:就绪条件,人:进程/线程

(阻塞IO)张三钓鱼:

张三是一个热爱钓鱼享受钓鱼的人,他钓鱼会一丝不苟的盯着鱼漂,只要鱼漂一下沉他立马把鱼掉上来,在这区间他不会做其他与钓鱼无关的事。

(非阻塞IO)李四钓鱼:

李四钓鱼没有张三那么死脑筋,他就是享受这一个过程的,他一会玩玩手机,一会看看鱼漂看看有没有鱼上钩,一会和旁边的钓友聊聊天,一旦鱼上钩,鱼漂一沉,鱼竿一动,他就把鱼钓上来。

(信号驱动IO)王五钓鱼:

王五虽然喜欢钓鱼,但他比较懒,他既不想眼睛盯着鱼竿,也不想手里拿着鱼竿,于是他在鱼竿上挂了一个铃铛,一但鱼上钩时鱼漂下沉,鱼竿摇动,铃铛就会响,他一听到铃声,他就把鱼钓上来,在这区间王五可以干任何事,刷抖音,看看书,只有铃铛响,他能听到把鱼钓上来就行。

(IO多路复用)赵六钓鱼:

赵六非常喜欢钓鱼,而且他非常有钱,别人钓鱼带一套装备(鱼竿,鱼漂等工具),一次只能钓到一条鱼,他嫌弃这样钓鱼慢,于是他带了100套装备,把100个鱼竿架好,然后他就在这100个鱼竿面前来回走动,一旦鱼漂下沉,鱼竿晃动,他到这个鱼竿面前把鱼钓上来。

(异步IO)田七钓鱼:

田七是一个钓鱼爱好者同时也是一个公司老板,他很忙,但他又想钓鱼,于是他钓鱼就放挂好鱼漂,架好鱼竿,他就开车回公司忙去了,让司机帮他钓,调到鱼了就打电话通知他,他忙完了就开车来接他和鱼。

四、同步VS异步   阻塞VS非阻塞 

同步VS异步

  • 同步:发出一个调用时,没有得到调用结果是,该调用不会返回,直到得到调用有结果时才会返回。即:调用者会主动的等待调用结果。
  • 异步:发出一个调用时,该调用直接返回,没有返回结果,调用者不会主动等待调用结果,被调用者会通过状态、通知来通知调用者,或通过回调函数处理这个调用。

阻塞VS非阻塞 

  • 阻塞调用是指调用结果返回之前,当前线程会被挂起. 调用线程只有在得到结果之后才会返回.
  • 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程

  • 13
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值