五种IO模型

                                                                       五种IO模型

在网络上已经有很多大佬写了很多关于IO模型的博客,我这篇主要是自己在学习中的总结,也有很多借鉴别人的地方。

IO:等待数据拷贝的过程(内核态->用户态)

现在常用的五种IO模型:阻塞型IO,非阻塞型IO,信息驱动型IO,多路转接IO,异步IO。

 

首先我们要搞清楚的是 什么叫 阻塞和非阻塞?

阻塞:一个函数发起了功能调用,若当时不具备完成的条件,则调用一直在等待。比如:我们去买饭,这是饭还没有做好,我们就一直在那等着,没有干别的事情。

非阻塞:一个函数发起了功能调用,若当时不具备完成的条件,则立即返回。比如,我们去买饭,这是饭还没有做好,我们就直接走了。

 

阻塞IO:发起了IO调用,若当时不满足IO条件,则一直等待。

比如:我们去钓鱼,扔下鱼竿后,一直拿着鱼竿等着鱼上钩。

 

优点:流程比较简答,一个完成后,才进行下一个。

缺点:IO未就绪就得一直等待,资源利用率较低,IO效率较低。

 

非阻塞IO:发起了IO调用,若当时不满足IO条件,则调用立即返回,并循环的去查看是否满足。

比如:我们在钓鱼,扔下鱼竿,发现没有鱼上钩,我们就玩了一把游戏,等游戏结束的时候,才去看鱼是否上钩,没有上钩就接着玩游戏。每次游戏结束的时候,看一眼鱼是否上钩。

优点:相比较阻塞IO,资源利用率上升。

缺点:需要循环的去查看是否满足条件,cpu占用较多,流程较为复杂一点,并且实时性不高(比如在打游戏的时候,鱼上钩了,但是我们在游戏结束了才去看的话,有可能鱼就溜走了)。

 

信息驱动型IO:首先我们先定义IO就绪的信号处理函数,如果我们收到了信号,证明这时候数据已经就绪了,我们就去处理。

比如:我们在钓鱼的时候,在鱼竿上绑上一个铃铛,这时候我们就去干别的事情了,当铃铛一响,证明了有鱼上钩,这时候,我们立马就去收鱼竿。

优点:相较于非阻塞,IO实时性更高,IO效率更高。

缺点:需要定义信号处理,流程较为复杂一点。

 

多路转接IO:使用监控函数,对大量的描述符进行监控,当有描述符就绪的时候,对于进行IO操作,未就绪的不操作,也就是说这个也属于阻塞型IO。

比如:我们在钓鱼的时候,拿了10个鱼竿,并且找了一个人,让他帮我们看着,如果某一个鱼竿动了,证明有鱼了,然他立马通知我,然后我去收鱼竿。

优点:可以同时监控大量的描述符,资源利用率高。

缺点:流程更为复杂,需要使用监控函数。

 

异步IO:首先我们定义一个IO完成的信息(当我们收到信息的时候,就证明IO操作已经完成,直接进行数据的处理。我们先发起IO调用,交由系统进行完成,等IO操作完成后,在由信号通知我。

比如:我们去钓鱼,这时候,我们还带了一个人,让他把鱼调到后,在通知我,我就去干别的事情了。等他调到鱼后,把鱼给我就好了。

优点:对系统的利用用最为充分,IO效率最高。

缺点:流程最为复杂。

 

同步:表示任务由进程自己完成,任务是顺序化完成。

异步:任务完成的流程不固定,任务由系统完成。分为异步阻塞,异步非阻塞。

异步阻塞:发起调用后,进程等着系统完成。

异步非阻塞:发起调用后,进程不等待系统的完成,调用立即返回。

同步和异步的区别:任务是由自己完成的,还是由系统完成的。(如上所说的,收起鱼的那一个动作,是由自己完成还是别人完成的呢。)因此上面的五种IO,前面四种都是同步IO,最后一个是异步IO。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux IO 模型是指 Linux 操作系统中的 IO 处理机制。它的目的是解决多个程序同时使用 IO 设备时的资源竞争问题,以及提供一种高效的 IO 处理方式。 Linux IO 模型主要分为三种:阻塞 IO、非阻塞 IOIO 多路复用。 阻塞 IO 指的是当程序进行 IO 操作时,会被挂起直到 IO 操作完成,这种方式简单易用,但是对于高并发环境不太适用。 非阻塞 IO 指的是程序进行 IO 操作时,如果无法立即完成,会立即返回一个错误码,程序可以通过循环不断地进行 IO 操作来实现轮询的效果。非阻塞 IO 可以提高程序的响应速度,但是会增加程序的复杂度。 IO 多路复用指的是程序可以同时监听多个 IO 设备,一旦有 IO 事件发生,就会立即执行相应的操作。IO 多路复用可以提高程序的效率,但是需要程序员手动编写代码来实现。 Linux IO 模型还有其他的实现方式,比如信号驱动 IO 和异步 IO 等。但是这些方式的使用比较复杂,一般不常用。 ### 回答2: Linux中的IO模型是指操作系统在处理输入输出的过程中所遵循的一种方式。它主要包括阻塞IO、非阻塞IO、多路复用IO和异步IO四种模型。 阻塞IO是最简单的IO模型,当一个IO操作发生时,应用程序会被阻塞,直到IO操作完成才能继续执行。这种模型的特点是简单直接,但是当有多个IO操作时会造成线程的阻塞,影响系统的性能。 非阻塞IO是在阻塞IO的基础上发展而来的,应用程序在发起一个IO操作后可以继续执行其他任务,不必等待IO操作的完成。但是需要通过轮询来不断地检查IO操作是否完成,效率相对较低。 多路复用IO使用select、poll、epoll等系统调用来监听多个IO事件,当某个IO事件就绪时,应用程序才会进行读写操作,避免了前两种模型的效率问题。多路复用IO模型适用于连接数较多时的场景,如服务器的网络通信。 异步IO是最高效的IO模型,应用程序发起一个IO操作后,立即可以执行其他任务,不需要等待IO操作的完成。当IO操作完成后,操作系统会通知应用程序进行后续处理。异步IO模型常用于高吞吐量、低延迟的应用,如高性能服务器和数据库等。 总之,Linux IO模型提供了多种不同的方式来处理输入输出,每种模型都有其适用的场景和特点。选择合适的IO模型可以提高系统的性能和效率。 ### 回答3: Linux IO模型是指操作系统中用于处理输入输出操作的一种方法或机制。在Linux中,常见的IO模型有阻塞IO、非阻塞IOIO多路复用和异步IO。 阻塞IO是最基本的IO模型,当应用程序发起一个IO请求时,它将一直阻塞等待直到IO操作完成,期间无法做其他任务。虽然简单易用,但是对资源的利用不高。 非阻塞IO在发起一个IO请求后,不会阻塞等待IO操作完成,而是立即返回并继续做其他任务。应用程序需要不断地轮询IO操作状态,直到操作完成。由于需要不断轮询,对CPU的占用较高,但可以提高资源的利用率。 IO多路复用是通过一个线程同时监听多个IO事件,从而实现并发处理多个IO操作。在IO多路复用模型中,应用程序不需要进行轮询,而是通过调用select、poll或epoll等系统调用监听多个文件描述符的IO事件。这样可以在单个线程中处理多个IO操作,提高并发性能。 异步IO模型在发起一个IO请求后,应用程序不需要等待IO操作完成,而是继续做其他任务。当IO操作完成后,操作系统会通知应用程序。异步IO模型需要操作系统的支持,效率较高,但实现较为复杂。 通过选择合适的IO模型,可以根据不同的应用场景来提高IO操作的效率和性能。例如,对于需要同时处理大量连接的服务器应用,IO多路复用是一种常见的选择;而对于需要处理大量IO操作的高性能服务器,则可以考虑使用异步IO模型

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值