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处理单元、逻辑单元、存储单元并发同步与异步半同步/半异步模式变体:半同步/半反应堆模式改进:高效的半同步/半异步模式领导者/追随者模式组件 :句柄集、线程集、事件处理器工作流程两种服…

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

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

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入门(五) | 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 来…

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…

Android入门(11)| 全局广播与本地广播

文章目录广播概念接收广播动态注册实例静态注册实例发送广播发送标准广播广播的跨进程特性发送有序广播本地广播广播概念 Android 中的每个应用程序都可以对自己感兴趣的广播进行注册&#xff0c;这样该程序就只会接收到自己所关心的广播内容&#xff0c;这些广播可能是来自系…

Android开发(2) | 广播 Broadcast 的应用——强制下线功能

文章目录功能简介关闭所有活动登陆界面发送强制下线的广播广播接收器AndroidManifest.xml运行结果功能简介 强制下线功能只需要弹出一个对话框&#xff0c;让用户只能点击确定按钮&#xff0c;回到登录界面。 如果在每一个活动中添加一个对话框的话太过繁琐&#xff0c;用广播…

Android入门(12)| 数据持久化

文章目录数据持久化文件存储将数据存储进文件实例从文件中读取数据实例SharedPreferences存储将数据存储进文件实例从文件中读取数据实例实现记住密码的功能SQLite数据库存储创建自己的帮助类调用自己的帮助类补全 onUpgrade() 方法增删查改增&#xff1a;SQLiteDatabase.inser…

Android入门(13)| Android权限 与 内容提供器

文章目录普通权限与危险权限运行时申请权限内容提供器运用安卓封装好的内容提供器自实现的内容提供器概念实现普通权限与危险权限 主要用于不同应用程序之间在保证被访数据的安全性的基础上&#xff0c;实现数据共享的功能。 在 Android 6.0 开始引入了运行时权限的功能&…

Android入门(14)| 通知

文章目录创建通知点击效果其它小功能实例创建通知 创建通知的步骤&#xff1a; 管理通知的 NotificationManager&#xff0c;通常通过当前 Context 的 getSystemService() 获取实例。它接受一个字符串参数用于确定获取系统的什么服务。Android 8.0(O) 版本后需要通知通道&…