IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO

文章目录

  • IO模型
  • 阻塞IO
  • 非阻塞IO
  • 信号驱动IO
  • 多路复用IO
  • 异步IO


IO模型

根据各自的特性不同,IO模型被分为阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO五类。

最主要的两个区别就是阻塞与非阻塞,同步与异步。

阻塞与非阻塞

阻塞与非阻塞最主要的区别就是程序在等待调用结果时的状态。

  • 阻塞: 为了完成一个功能发起调用,如果不具备完成功能的条件,则调用会一直等待
  • 非阻塞: 为了完成一个功能发起调用,如果不具备完成功能的条件,则立即报错返回

同步与异步

并发模型和I/O模型都有同步/异步的概念:

  • 并发模式中两者最主要的区别就是功能完成的流程是否是顺序化的,

  • I/O模型中两者最主要的区别是注册的是就绪事件还是完成事件,完成I/O操作的是用户程序自身还是内核系统

  • 同步: 功能完成的流程是顺序化的。注册就绪事件,读写事件由自身完成。

  • 异步: 功能完成的流程是不确定的,注册完成事件,读写事件由内核完成。


下列五种IO模型,从前往后处理的效率逐渐增加,对资源的利用也增加充分,但是流程也越来越复杂。

阻塞IO

发起IO调用,如果不具备IO条件,则一直等待直到条件就绪。以 recvfrom 为例:(recvfrom:UDP数据的读写函数)
在这里插入图片描述

  • 优点: 流程以及代码实现都非常简单,任务顺序操作。
  • 缺点: 任务处理效率较低,无法充分利用资源。

非阻塞IO

发起一个IO调用,如果不具备IO条件,则立即报错返回(无需等待),继续执行其他命令。通过一个循环来不断发起IO请求,直到条件就绪。

在这里插入图片描述

  • 优点: 与阻塞IO相比较来说,利用了等待的时间去做了其他的事情,对资源的利用更加充分
  • 缺点: 与阻塞IO对比,IO调用需要循环发起,流程更加复杂。 并且如果IO条件就绪了,也要等待同一个调用上一轮循环结束后进入当前循环,才能进行处理,这就导致了 IO 不够实时

非阻塞IO可以通过 fcntl函数 设置描述符状态来实现:

void SetNoBlock(int fd) 
{int flag = fcntl(fd, F_GETFL, 0);flag |= O_NONBLOCK;fcntl(fd, F_SETFL, flag);
}

信号驱动IO

自定义一个IO就绪的信号,当IO就绪时就发出这个信号。在没有收到信号时,可以继续处理其他事情,一旦收到信号,就会中断当前操作,来优先处理IO事件。程序没有阻塞阶段。
在这里插入图片描述

  • 优点: 相较于非阻塞IO,仍具有资源利用更加充分的优势;并且信号到来后就直接强行中断进行处理,更加实时
  • 缺点: 因为需要自定义信号,又要有主控流程也要有信号处理流程,并且还需要考虑信号是否可靠导致的事件丢失情况,流程会更加的复杂。

多路复用IO

用于对大量的IO事件进行监控,能够让用户只针对就绪了指定事件(可读、可写、异常) 的IO进行操作。只针对就绪的描述符进行操作,避免了阻塞,并且提高了效率。

值得一提的是,I/O复用函数对I/O本身的读写操作是阻塞的,他们能提高程序效率的原因在于具有同时监听多个I/O事件的能力。

Linux 下,操作系统提供了三种模型:select模型poll模型epoll模型
在这里插入图片描述


异步IO

IO处理的顺序不确定,整个IO的过程(等待 + 数据拷贝)由操作系统来完成而并非用户。程序没有阻塞阶段。

在这里插入图片描述

流程:

  1. 自定义一个IO完成信号
  2. 发起异步调用后返回,此时用户可以继续处理其他事情
  3. 系统进行IO事件的等待以及数据拷贝
  4. IO完成后通过信号通知进程IO
  • 优点: 对资源的利用最为充分, 以最高的效率进行任务的处理。
  • 缺点: 资源消耗较高, 流程最为复杂。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat服务器集群与负载均衡实现

一、前言 在单一的服务器上执行WEB应用程序有一些重大的问题,当网站成功建成并开始接受大量请求时,单一服务器终究无法满足需要处理的负荷量,所以就有点显得有点力不从心了。另外一个常见的问题是会产生单点故障,如果该服务器坏掉…

Linux服务器 | 事件处理模式:Reactor模式、Proactor模式

文章目录Reactor模式Proactor模式同步I/O模型模拟Proactor模式两者的优缺点ReactorProactor同步I/O模型通常用于实现 Reactor 模式,异步I/O模型通常用于实现 Proactor 模式。(不是绝对的,同步I/O也可模拟出 Proactor 模式) React…

Linux服务器 | 服务器模型与三个模块、两种并发模式:半同步/半异步、领导者/追随者

文章目录两种服务器模型及三个模块C/S模型P2P模型I/O处理单元、逻辑单元、存储单元并发同步与异步半同步/半异步模式变体:半同步/半反应堆模式改进:高效的半同步/半异步模式领导者/追随者模式组件 :句柄集、线程集、事件处理器工作流程两种服…

香农信息熵之可怜的小猪

文章目录题目解析香农熵公式样例具体分析代码题目 有 n 桶液体,其其中 正好 有一桶含有毒药,其装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶含有毒药,你可以喂一些猪喝,通过观察猪是否会死进行判断,实验对…

字符串匹配之KMP(KnuthMorrisPratt)算法(图解)

文章目录最长相等前后缀next数组概念代码实现图解GetNext中的回溯改进代码实现代码复杂度分析最长相等前后缀 给出一个字符串 ababa 前缀集合:{a, ab, aba, abab} 后缀集合:{a, ba, aba, baba} 相等前后缀 即上面用同样颜色标识出来的集合元素&#…

linux下tomcat6.0与jdk安装详细步骤

安装Tomcat6.0和JDK1.6 在linux系统上安装tomcat和jdk应该说是我学习linux知识的第一课了,之前只 是听说过,从没接触过,但我们公司项目都是部署在linux系统上的,那天上司突 然给我发了几个文档,让我看一下&#xff…

Android入门(一) | Android Studio的配置与使用

文章目录安装配置Android Studio使用Android Studio模拟器更改Android SDK的路径Hello World!安装配置Android Studio 从这一步开始: 一直点 next 即可,直到存储路径的选择上,可以放到非 C 盘,这里我放到 D 盘了&am…

Android 入门(四) | Intent 实现 Activity 切换

文章目录Intent显式 Intent定义两个 xml 文件android:orientationmatch_parent 和 wrap_contentIntent函数定义两个 Activity隐式 Intent更多隐式 Intent 的用法用隐式 Intent 打开系统浏览器自建 Activity 以响应打开网页的 Intent向下一个活动传递数据返回数据给上一个活动In…

Android入门(二) | 项目目录及主要文件作用分析

文章目录项目目录分析app目录分析AndroidManifest.xml 分析MainActivity.kt 分析build.gradle 分析最外层目录下的 build.gradleapp 目录下的 build.gradle项目目录分析 我们来看一下 src/main/res 下的一些文件: .gradle 和 .idea :这两个目录下放置…

Android入门(三) | Android 的日志工具 Logcat

文章目录日志工具类 android.util.LogLogcat 中的过滤器日志工具类 android.util.Log Log 从属日志工具类 android.util.Log ,该类提供了五个方法供我们打印日志: Log.v() :用于打印那些最为琐碎的、意义最小的日志信息。对应级别 verbose&…

Android 客户端与服务器交互方式

突然想到一个问题就是Android客户端与服务器交互有几种方式,因为在脑袋里想当然的就是webservices和json。要在Android手机客户端与pc服务器交互,需要满足下面几种条件:跨平台、传输数据格式标准、交互方便...。 为了与服务器通讯其实无非就…

Android入门(五) | Activity 的生命周期

文章目录Activity 的状态及生命周期实现管理生命周期FirstActivitySecondActivityDialogActivity运行结果旧活动被回收了还能返回吗?Activity 的状态及生命周期 Android 的应用程序运用 栈(Back Stack) 的思想来管理 Activity: …

Android入门(六) | Activity 的启动模式 及 生产环境中关于 Activity 的小技巧

文章目录Activity 的启动模式standardsingleTopsingleTasksingleInstance技巧了解当前界面是哪个 Activity随时随地退出程序启动活动的最佳写法Activity 的启动模式 standard:默认的启动方式,每次启动一个活动都会重新创建singleTop:如果该活…

Android入门(七) | 常用控件

文章目录TextView 控件:文本信息Button 控件:按钮EditText 控件:输入框ImageView 控件:图片ProgressBar 控件:进度条AlertDialog 控件:提示框ProgressDialog 控件:带有进度条的提示框TextView 控…

Android入门(八) | 常用的界面布局 及 自定义控件

文章目录LinearLayout :线性布局android:layout_gravity :控件的对齐方式android:layout_weight:权重RelativeLayout :相对布局相对于父布局进行定位相对于控件进行定位边缘对齐FrameLayout :帧布局Percent &#xff1…

Android入门(九)| 滚动控件 ListView 与 RecyclerView

文章目录ListView内置类型的简单运用定制数据类型提升效率点击事件RecyclerView布局管理器点击事件ListView 内置类型的简单运用 由于手机屏幕空间有限,能够一次性在屏幕上显示的内容不多,当我们的程序有大量数据需要显示的时候就可以借助 ListView 来…

关于“三门问题”的一些想法

三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let’s Make a Deal。问题名字来自该节目的主持人蒙提霍尔(Monty Hall)。参赛者会看见三扇关闭了的门&#xf…

Android入门(10)| Fragment碎片详解

文章目录为什么要使用碎片(Fragment)实例布局文件FragmentActivity动态添加碎片布局文件FragmentActivity碎片通信Fragment布局文件Activity生命周期为什么要使用碎片(Fragment) 我们在手机上看新闻可能是这样的: Re…

Android开发(1) | Fragment 的应用——新闻应用

文章目录Item&#xff1a;标题子项布局文件Java代码标题碎片布局文件Java代码新闻内容碎片布局文件Java代码新闻内容活动布局文件Java代码首界面布局文件Java代码Item&#xff1a;标题子项 布局文件 news_item.xml&#xff1a; <TextViewxmlns:android"http://schema…

Java Web整体异常处理

在实际的J2EE项目中&#xff0c;系统内部难免会出现一些异常&#xff0c;就如StrutsSpringHibernate项目&#xff1a;通常一个页面请求到达后台以后&#xff0c;首先是到action&#xff08;就是MVC中的controller&#xff09;&#xff0c;在action层会调用业务逻辑层service&am…