Unix五种I/O模型(阻塞、非阻塞、多路复用、信号驱动、异步)

news2024/11/16 17:35:42

文章目录

    • 概要
    • 一、I/O基础
    • 二、阻塞式I/O
    • 三、非阻塞式I/O
    • 三、I/O多路复用
    • 四、信号驱动I/O
    • 五、异步I/O
    • 六、小结

概要

在工作中,经常使用Nginx、Redis等开源组件,常提到其高性能的原因是网络I/O的实现是基于epoll(多路复用)。这次呢就基于Unix网络编程卷1的第6章【I/O复用:select和poll函数】,总结下Unix五种I/O模型(阻塞、非阻塞、多路复用、信号驱动、异步)。

一、I/O基础

我们在Linux下进行网络编写时,一般是通过Glibc库的Socket API(socket、bind、listen、accept、read、write、connect、close等API)来完成的,如下图:
socket编程
这只是表面的使用,那socket之下的OSI五层模型是如何体现的呢?见下图:
OSI五层模型具体表现

二、阻塞式I/O

阻塞式I/O是最基本的I/O模型,很好理解,就是每次系统调用(以read、waite API为例)时,如果此时不可读或写,那么调用会被阻塞,让后进程被挂起,直到内核通知进程可读或可写时,进程被唤醒,进行读写操作。
如下图:
Unix阻塞式I/O模型
ps:以recvfrom函数作为系统调用的代表,其他章节也如此。
阻塞式I/O实战(多进程模型)

三、非阻塞式I/O

非阻塞式I/O模型如下图:
Unix非阻塞式I/O模型
可以明显感觉到阻塞是I/O模型很低效,于是非阻塞式I/O模型诞生了,其进行系统调用(以read、waite API为例)时,如果此时不可读或写,那么就返回一个错误码(EAGAIN或EWOULDBLOCK),而不是阻塞当前进程,这样进程可以处理其他任务后再进行系统调用。
非阻塞式I/O模型实战。

三、I/O多路复用

不管是阻塞I/O还是非阻塞I/O,其同一时刻只能以一个客户端建立连接,如果要同时与多个客户端维持连接,即管理多个socket连接,分化出了两种编程模型:

  • 1)多线程或进程;
  • 2)通过数组等方式保存socket fd,不断轮询;
    在没有多路复用之前,实现与多个客户端维持连接的传统方法是多线程或进程,但是起一个子线程或进程的系统开销过大,所以可同时维持的客户端连接数量非常有限。

之所以传统维持多个客户端连接不常用第二种方式,主要是实现过于复杂,由于社会发展,基于阻塞or非阻塞模型的多进程/线程技术不足以支撑如此多的客户端,于是引入了I/O多路复用,即第二种方式来管理多个socket连接。

I/O多路复用解释如下:
多路:多个socket连接(即多个客户端连接);
复用:允许内核监听多个socket描述符,一旦发现进程指定的一个或多个I/O事件就绪(TCP三次握手成功、可读,可写),就通知该进程。

其模型图如下:
Unix I/O多路复用模型
I/O多路复用的API依次有三个select、poll、epoll。其中epoll性能最高,往往与Reactor编程模式结合,是目前常用的高效搭配模式。
select实战;
poll实战;
epoll实战。

本人研究Redis相关源码时,观察到其在Linux下就是通过epoll+非阻塞I/O+Reactor组合来处理I/O事件,是搞起高性能的一个关键点。

四、信号驱动I/O

信号驱动IO模型,顾名思义,其是通过信号来完成的,即当socket描述符准备就绪时,内核发送SIGIO通知进程。
Unix信号驱动模型
信号驱动IO模型实战。

这种模型的优势在于等待socket就绪期间进程不会被阻塞,主循环依旧可以执行,只需关注来自信号函数的通知即可。但是该模型在实际项目中很少使用,了解理解即可。

五、异步I/O

异步I/O由POSIX规范定义。一般来说其工作机制:告知内核启动某个动作,并让内核将整个动作(包括将数据从内核复制到用户缓冲区)完成后通知进程。

该机制与信号驱动I/O模型的区别是:信号驱动I/O模型是由内核通知进程何时可以开始一个I/O操作,但异步I/O是由内核通知进程I/O操作何时完成。

Unix异步I/O模型
进程调用系统函数aio_read(POSIX规范下异步I/O函数以aio_或lio_开头)之后,无论内核数据是否准备好,都会立即,然后进程可以去做别的事情。内核会自动处理I/O数据,并将内核直接复制数据给进程,然后向进程发送信号,进程收到信号后直接处理数据即可。

异步I/O模型是最理想的模型,但是自诞生之日起的具体实现方式(glibc aio、libaio、libeio…)就有这样或那样的缺点,2019 年 Linux 5.1 内核首次引入的高性能 异步 I/O 框架io_uring ,能显著加速 I/O 密集型应用的性能,并且使用简单,适应度广,足够稳定,但诞生的太晚了,远没有epoll应用的范围广。

异步I/O模型实战。

六、小结

通过对五种I/O模型的描述,可以发现前四种模型的区别主要在于第一阶段的处理方式(阻塞I/O和多路复用是阻塞的,非阻塞I/O【轮询】和信号驱动【通知】是非阻塞的),第二阶段形同:将数据从内核区复制到用户区,都进程都会阻塞于recvfrom函数。但异步I/O的两个阶段内核都帮我们做了,这与前四种模型是截然不同的。

五种I/O模型比较如下:
Unix五种I/O模型比较
最后聊一下阻塞、非阻塞、同步、异步在Unix网络编程语境下的概念:
阻塞:指调用结果返回之前,当前进程会被挂起,只有得到结果之后才会返回。

非阻塞:指如果不能立刻得到结果,当前进程不会被挂起。Unix下是通过立即返回规定错误码来实现的。

同步:I/O操作会阻塞当前进程,直至操作完成。由此可知前四种模型都是同步的(非阻塞I/O如果有数据时依旧需等待数据从内核区复制到用户区,或阻塞当前进程)。

异步:I/O操作不会阻塞当前进程。

我们可以举这样一个场景,小明要喝开水,客厅有其他事情,而烧水壶在卧室。

小明打开热水壶,站在热水壶面前一直等待水开 => 阻塞
小明打开热水壶后回到客厅做其他事情,一会去卧室检查一下水是否烧开,烧开再使用 => 非阻塞
小明觉得一会去卧室检查一下太费劲了,于是换了一个水开报警的热水壶:
现在小明打开热水壶后回到客厅做其他事情,等到热水壶报警再去卧室用水 => 异步

ps:我们举的场景只有一个阶段,而Unix五种I/O模型是有两个阶段的【第一阶段获取I/O就绪事件,第二阶段将I/O数据从内核区复制到用户区】,只有异步I/O模型两个阶段都是异步的

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

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

相关文章

第1节、电路连接【51单片机+L298N步进电机系列】

↑↑↑点击上方【目录】,查看本系列全部文章 摘要:本节介绍如何搭建一个51单片机L298N步进电机控制电路,所用材料均为常见的模块,简单高效的方式搭建起硬件环境。 一、硬件清单 ①51单片机模块 ②恒流模块 ③开关电源 ④L298N模…

JDWP 协议及实现

什么是JDWP ? JDWP 是 Java Debug Wire Protocol 的缩写,它定义了调试器(debugger)和被调试的 Java 虚拟机(target vm)之间的通信协议。 JDWP 协议介绍 这里首先要说明一下 debugger 和 target vm。Target …

centos 7.6 安装 openldap 2.5.17

centos 7.6 安装ldap 1、下载ldap2、安装ldap2.1、官方参考文档2.2、安装前准备2.2.1、安装gcc2.2.2、安装Cyrus SASL 2.1.272.2.3、安装OpenSSL 1.1.12.2.3.1、下载openssl 3.02.2.3.2、安装依赖包2.2.3.3、编译安装openssl 3.0 2.2.3、安装libevent 2.1.82.2.4、安装libargon…

发送get请求并且发送请求头(header),java实现

发送get请求时,发送请求头(Header)中的内容 方便第二次调用其他url时传递参数,例如userCode或者租户编码 调用方式 Autowired private HttpServletRequest request;先注入HttpServletRequestpublic xxx xxx(){String url &quo…

SpringBoot集成axis发布WebService服务

文章目录 1、使用maven-web项目生成server-config.wsdd文件1.1、新建maven-web项目1.1.1、新建项目1.1.2、添加依赖 1.2、编写服务接口和实现类1.2.1、OrderService接口1.2.2、OrderServiceImpl实现类 1.3、配置deploy.wsdd文件deploy.wsdd文件 1.4、配置tomcat1.4.1、配置tomc…

基于springboot+vue+mysql员工宿舍管理系统

直达视频演示 技术栈 jdk8springboot vueelement-plusMySQL 包含功能点 管理员端 登录员工管理宿舍管理留言板管理物品报修管理公告管理 员工端 登录首页个人中心物品报修留言板 功能截图(部分) 管理员 管理员登录 员工管理 宿舍管理 物品报修管理 公告管理 留言管理 …

火山引擎ByteHouse:如何为OLAP设计高性能向量检索能力?

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 背景 随着 LLM 技术应用及落地,数据库需要提高向量分析以及 AI 支持能力,向量数据库及向量检索等能力“异军突起”,迎来业界持续…

Bytebase 签约 Vianova,助力欧洲城市交通智能平台中 Snowflake 和 PG 的变更自动化及版本控制

在数字化发展的浪潮中,自动化数据库变更管理成为提升产品上线效率、降低人为失误风险的关键工具,同时促进流程的一致性与标准化,确保合规性和变更的可追溯性。近日,数据库 DevOps 团队协同管理工具 Bytebase 签约欧洲交通数据管理…

【51单片机】LED的三个基本项目(LED点亮&LED闪烁&LED流水灯)(3)

前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

synchoronized 为什么不能锁 int 或者 long 类型

前言 synchronized(Object) 不能用String常量 因为字符串常量是在内存中同一个地方。如果两个线程锁一个,可能导致死锁。一个线程多次可能导致重入。 也不能用Integer,Long等基础类型。 因为当锁定int或者long时, jvm就会调用Interger.valu…

VXLAN网关技术及应用实例详解

1.特性概述 VXLAN是VLAN扩展方案草案,是NVo3中的一种网络虚拟化技术。采用MAC in UDP封装方式,将二层报文用三层协议进行封装,可对二层网络在三层范围进行扩展,同时支持24bits的VNIID ( 16M租户能力),满足…

甲辰龙年,中国科技十大趋势

先给各位拜个早年。 年关岁末,各大科技厂商、研究机构纷纷发布自己研判的新年十大科技趋势。这些内容当然大有裨益,相信热爱科技的读者朋友也没少关注。 但说句掏心窝子的话,种种十大趋势看多了,不免发现两个问题,一个…

vite+vue3发布自己的npm组件+工具函数

记录一下个人最近一次发布npm组件的过程: 一、创建组件和工具函数 执行命令创建一个空项目: npm create vite 创建过程稍微有些慢,不知何故?其中选择vue , 个人暂时使用的JS 。在 src 目录下面创建一个文件 package 存放组件和公…

Antd+React+react-resizable实现表格拖拽功能

1、先看效果 2、环境准备 "dependencies": {"antd": "^5.4.0","react-resizable": "^3.0.4",},"devDependencies": {"types/react": "^18.0.33","types/react-resizable": "^…

【知识图谱+大模型的紧耦合新范式】Think-on-Graph:解决大模型在医疗、法律、金融等垂直领域的幻觉

Think-on-Graph:解决大模型在医疗、法律、金融等垂直领域的幻觉 Think-on-Graph 原理ToG 算法步骤:想想再查,查查再想实验结果 论文:https://arxiv.org/abs/2307.07697 代码:https://github.com/IDEA-FinAI/ToG Think…

【Linux系统学习】1.初识Linux

初识Linux 操作系统概述 初识Linux 虚拟机介绍 VMware WorkStation安装 1.操作系统概述 了解操作系统的作用 了解常见的操作系统 1.1 硬件和软件 计算机由哪两个主要部分组成? 硬件:计算机系统中由电子,机械和光电元件等组成的各种物理装置的…

AI专题:海外科技巨头指引,AI主线逻辑依旧坚挺

今天分享的是AI 系列深度研究报告:《AI专题:海外科技巨头指引,AI主线逻辑依旧坚挺》。 (报告出品方:华西证券) 报告共计:54页 本周热点:海外科技巨头指引,AI主线逻辑依旧坚挺 硬件…

2、ChatGPT 在数据科学中的应用

ChatGPT 在数据科学中的应用 ChatGPT 可以成为数据科学家的绝佳工具。以下是我所了解到的关于它擅长的地方和不那么擅长的地方。 我从使用 ChatGPT 中学到了一个教训。它在数据科学中非常有帮助,但你必须仔细检查它输出的所有内容。它非常适合某些任务,并且可以非常快速准确…

CSDN2024年我的创作纪念日1024天|不忘初心|努力上进|积极向前

CSDN2024年我的创作纪念日1024天| 学习成长机遇:学习成长收获:2023年度总结数据:2024新领域的探索:日常和自己的感慨:2024憧憬和规划:创作纪念日总结: 学习成长机遇: 大家好&#x…

Aigtek高精度电压源什么作用

高精度电压源是一种能够提供稳定、可靠且精确的电压输出的电子设备。它在科学研究、工程应用和制造业中起着至关重要的作用。以下将详细介绍高精度电压源的作用及其在不同领域的应用。 一、工作原理 稳定性:高精度电压源通常采用精密的电路设计和稳压技术&#xff0…