【图解IO与Netty系列】IO的同步与异步、阻塞与非阻塞,Linux五种IO模型

IO的同步与异步、阻塞与非阻塞,Linux五种IO模型

  • IO的同步与异步,阻塞与非阻塞
    • 阻塞IO与非阻塞IO
    • 同步IO与异步IO
  • Linux五种IO模型
    • BIO
    • NIO
    • IO多路复用
    • 信号驱动IO
    • AIO

IO的同步与异步,阻塞与非阻塞

我们有时会看到类似于同步阻塞式IO、同步非阻塞式IO、异步IO等这些名词。

大多数时候,同步就是阻塞的,异步就是非阻塞的,比如我们并发编程里面加锁进行同步,那么获取不到锁的就要阻塞等待。但是在IO里面,同步异步与阻塞非阻塞不是同一概念。

这里面的同步、异步、阻塞、非阻塞是什么意思呢?

阻塞IO与非阻塞IO

在IO里面,当数据还没有就绪时,当前线程是否需要等待数据到达,可以分为阻塞IO与非阻塞IO。阻塞式IO是指当数据未就绪时,当前线程阻塞等待数据就绪;非阻塞式IO是指当数据未就绪时,当前线程不会阻塞等待数据就绪。

在这里插入图片描述

这里的数据就绪是指,数据已经加载到操作系统内核空间。比如网络IO,当数据到达网卡缓冲区,会通过DMA(Direct Memory Access——直接内存访问)设备把数据拷贝到内核空间,此时代表数据就绪,也就是等待应用程序拷贝到用户空间。

在这里插入图片描述

同步IO与异步IO

当数据已经达到了之后,就需要把内核空间的数据拷贝到用户空间,把内核空间的数据拷贝到用户空间是通过CPU进行拷贝。

在这里插入图片描述

是否需要当前线程主动去把内核空间中的数据搬运到用户空间,这又分为同步IO和异步IO。需要当前线程主动拷贝内核空间的数据到用户空间的叫同步读取,不需要当前线程主动拷贝内核空间的数据到用户空间的叫异步读取。

在这里插入图片描述

那么,根据同步与异步、阻塞与非阻塞,就组合出了四种类型的IO:

在这里插入图片描述

首先这里要知道,异步阻塞IO是不存在的,因此阻塞式IO在数据未就绪前是阻塞等待的,直到数据就绪之后当前线程才解阻塞,而数据都已经到达了,那直接拷贝到用户空间就可以了,这时候弄一个异步读取就没有必要了。

Linux五种IO模型

BIO

BIO是同步阻塞式IO。以网络IO为例,当客户端没有发送数据时,当前线程会阻塞等待数据,当客户端发送的数据被网卡接收并被DMA设备拷贝到内核空间之后,当前线程把内核空间中的数据拷贝到用户空间,然后当前线程才从数据拷贝中返回。

在这里插入图片描述

那么我们看到的现象就是,当服务端调用read()函数时,服务端当前线程阻塞等待客户端发送数据,当客户端发送的数据被服务端接收并拷贝到内核空间之后,服务端的当前线程需要把数据拷贝到用户空间,然后服务端当前线程才从read()函数返回。

在这里插入图片描述

NIO

NIO是同步非阻塞IO,当客户端没有发送数据时,服务端线程不会阻塞等待,而是马上返回,当前线程需要不断的检测数据是否已经到达并被拷贝到内核空间。如果数据还没有准备好,那么read函数调用会马上返回一个error,用户线程可以再次发起read函数调用继续检测;如果数据已经在内核空间了,那么当前线程调用read函数就会拷贝内核空间的数据到用户空间,这个拷贝的过程是同步读取,是当前线程主动拷贝的,因此在线程拷贝数据到用户空间的这段时间,程序是不会往下执行的。

在这里插入图片描述

NIO相比BIO的不同在于当数据还未就绪时,使用NIO是不会导致当前线程阻塞的,但是当数据就绪时,NIO与BIO一样是由当前线程拷贝到用户空间的,因此当要拷贝内核空间的数据到用户空间时,NIO与BIO是一样的会卡住直到数据拷贝完毕。

在这里插入图片描述

IO多路复用

在Linux操作系统上面,IO多路复用通过Linux提供的select、poll、epoll等API实现。使用IO多路复用是会使得当前线程阻塞的,但是IO多路复用与阻塞IO不同,阻塞IO是当前线程阻塞监听一个socket文件描述符,而IO多路复用则是阻塞监听多个socket文件描述符。

在这里插入图片描述

当有一个或多个文件描述符有数据就绪时,则该线程解阻塞,可以操作这些有数据就绪的socket文件描述符读取数据。

在这里插入图片描述

信号驱动IO

要理解信号驱动IO,首先要理解什么是信号驱动。信号驱动是一种软中断,是在软件层面模拟硬件中断实现的一种中断机制。

首先当前线程向操作系统注册一个信号处理函数,操作系统内核保持该信号处理函数。

在这里插入图片描述

当对应的事件发生时,操作系统向当前线程发送一个SIGIO信号。然后触发一个软中断,当前线程切换到内核态,执行之前注册的信号处理函数。执行完毕之后,再切换回用户态,当前线程从中断处开始往下执行。

在这里插入图片描述

可见这是一种异步操作,再对应的事件没有发生时,当前线程可以继续往下执行,不会阻塞,当对应的事件发生时,才转而执行预先注册的函数。

信号驱动IO也是一种同步非阻塞IO。当前线程通过sigaction函数注册一个SIGIO信号处理函数,然后回马上返回不会阻塞。如果客户端发送的数据已被拷贝到内核空间,操作系统会发送一个SIGIO信号给当前线程,当前线程转而执行之前注册的SIGIO信号处理函数,里面会调用redvfrom读取内核空间的数据到用户空间,此时是由当前线程主动拷贝数据,因此从内核空间拷贝数据到用户空间期间当前线程阻塞,因此还是同步IO。

在这里插入图片描述

AIO

AIO是异步IO,异步IO是全程无阻塞的IO操作,性能最高。应用程序不需要阻塞等待数据到达,当数据到达时操作系统自动把内核空间的数据拷贝到用户空间,再通知当前线程处理数据。

在这里插入图片描述

首先用户线程调用aio_read函数并传递用户空间缓存区、缓冲区大小等参数,然后马上返回,不会阻塞当前线程。当数据已在内核空间中就绪时,操作系统内核自动把数据拷贝到指定的用户空间缓冲区。当操作系统内核拷贝数据到用户空间完成后,再发送一个信号通知用户线程处理数据。

在这里插入图片描述

但可惜的是,Linux操作系统对AIO的支持不是很好,Linux的AIO是基于IO多路复用做的封装,性能并没有很大的提升,因此使用的更多的是IO多路复用。但是Windows操作系统则在真正意义上实现了AIO,因此在Windows操作系统环境下使用AIO的话,可以在性能上得到很大的提升。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【二叉树算法题记录】236. 二叉树的最近公共祖先

题目链接 题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个…

STL---unordered set和unordered multiset【无序集合】

1.1 定义及初始化&#x1f357; 下面列出常用的初始化方式 #include <unordered_set> #include <iostream> using namespace std; //输出s中的所有元素 template<typename T> void Show(const T& s) {for (auto& x : s) …

操作系统实验四:多线程与信号量编程

操作系统实验上机 更多技术请访问&#xff1a;www.xuanworld.top 部分审核不通过的文章将发至个人博客&#xff1a;www.xuanworld.top 欢迎来52破解论坛阅读帖子&#xff1a;https://www.52pojie.cn/thread-1891208-1-1.html 实验名称实验序号实验日期实验人多线程与信号量…

信号量——多线程

信号量的本质就是一个计数器 在多线程访问临界资源的时候&#xff0c;如果临界资源中又有很多份分好的资源&#xff0c;那么就可以通过信号量来表示里面还有多少份资源&#xff0c;且每份资源只有一个线程可以访问 线程申请信号量成功&#xff0c;就一定有一份资源是你的&…

Golang并发编程-协程goroutine的信道(channel)

文章目录 前言一、信道的定义与使用信道的声明信道的使用 二、信道的容量与长度三、缓冲信道与无缓冲信道缓冲信道无缓冲信道 四、信道的初体验信道关闭的广播机制 总结 前言 Goroutine的开发&#xff0c;当遇到生产者消费者场景的时候&#xff0c;离不开 channel&#xff08;…

基于Matplotlib包实现可视化①——折线图绘制

Matplotlib 是一个用于创建静态、动画、 和交互式可视化的第三方库&#xff0c;也是我们在借助Python进行数据可视化时经常使用到的库&#xff0c;具有较强的可视化能力。 为让大家有一个更为直观的认识&#xff0c;这里我随机从其官方网页中摘取了几张图片。 按照惯例&#x…

【安装笔记-20240523-Windows-安装测试 ShareX】

安装笔记-系列文章目录 安装笔记-20240523-Windows-安装测试 ShareX 文章目录 安装笔记-系列文章目录安装笔记-20240523-Windows-安装测试 ShareX 前言一、软件介绍名称&#xff1a;ShareX主页官方介绍 二、安装步骤测试版本&#xff1a;16.1.0下载链接功能界面 三、应用场景屏…

2024年【危险化学品经营单位安全管理人员】考试及危险化学品经营单位安全管理人员考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品经营单位安全管理人员考试资料题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品经营单位安全管理…

强化学习4:DQN 算法

看这篇文章之前&#xff0c;建议先了解一下&#xff1a;Q-Learning 算法。 1. 算法介绍 DQN 算法全称为 Deep Q-Network&#xff0c;即深度Q网络。它将 Q-Learning 与 Deep Learning 结合在了一起。 1.1 Q-Network Q-Learning 是使用 Q-table 才存储决策信息的&#xff0c;…

【Python001】python批量下载、插入与读取Oracle中图片数据(已更新)

1.熟悉、梳理、总结数据分析实战中的python、oracle研发知识体系 2.欢迎点赞、关注、批评、指正,互三走起来,小手动起来! 文章目录 1.背景说明2.环境搭建2.1 参考链接2.2 `oracle`查询测试代码3.数据请求与插入3.1 `Oracle`建表语句3.2 `Python`代码实现3.3 效果示例4.问题链…

嵌入式实时操作系统笔记3:FreeRTOS移植(STM32F407)_编写简单的FreeRTOS任务例程

上文讲到UC/OS III系统的移植&#xff0c;那篇文章是失败了的&#xff0c;网络上的资料真是层次不清&#xff0c;多有遗漏步骤&#xff0c;导致单片机连操作系统的初始化都卡在那&#xff0c;这次换个赛道&#xff0c;学FreeRTOS吧...... 今日任务如标题所示&#xff1a;FreeR…

2024年【熔化焊接与热切割】考试内容及熔化焊接与热切割考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割考试内容考前必练&#xff01;安全生产模拟考试一点通每个月更新熔化焊接与热切割考试报名题目及答案&#xff01;多做几遍&#xff0c;其实通过熔化焊接与热切割复审模拟考试很简单。 1、【单选题】…

Android 配置 Kapt 编译器插件

以 Android Studio 2023.3.1 最新版本为准。 步骤1:打开版本信息配置文件 找到libs.versions.toml文件。 这是打开后的样子&#xff1a; 步骤2&#xff1a;配置版本信息 你需要在[plugins]下面添加一条kapt的配置信息&#xff1a; 要添加的配置信息如下&#xff1a; jetbr…

Boxy SVG for Mac:打造精致矢量图形的得力助手

在矢量图形设计领域&#xff0c;Boxy SVG for Mac以其出色的性能和丰富的功能&#xff0c;成为了设计师们的得力助手。 Boxy SVG for Mac(矢量图编辑器) v4.32.0免激活版下载 Boxy SVG具备强大的编辑能力&#xff0c;支持节点编辑、路径绘制、颜色填充等多种操作&#xff0c;让…

小浪助手下载学浪视频的简单步骤

你是否想轻松下载学浪高清视频&#xff1f;快来尝试小浪助手&#xff0c;这是你不可错过的下载神器&#xff01;简单几步操作&#xff0c;即可轻松下载你所需的学浪视频&#xff0c;节省时间&#xff0c;提高效率&#xff01; 首先我已经打包好了小浪助手&#xff0c;有需要的…

毫米波雷达模块在智能家居安全系统中的关键技术分析

随着智能技术的不断发展&#xff0c;智能家居已经成为了现代生活的一部分。而智能家居安全系统作为智能家居的重要组成部分&#xff0c;其功能不仅仅是对家庭进行监控和报警&#xff0c;更是通过各种感知技术对家庭安全进行全方位的保障。在智能家居安全系统中&#xff0c;毫米…

二叉树的遍历(前序遍历,中序遍历,后序,层序遍历)和一些简单操作(由浅入深绝对能看懂)

欢迎大佬们的关顾能给个赞就更好啦QWQ 目录 二叉树的逻辑结构与物理结构 一.二叉树的遍历 &#xff08;1&#xff09;二叉树的前序遍历 &#xff08;2&#xff09;二叉树的中序遍历 &#xff08;3&#xff09;二叉树的后序遍历 &#xff08;4&#xff09;二叉树的层序遍历…

Python 渗透测试:电子邮件 || Redis || FTP || SSH || MySQL 集成爆破工具.

集成爆破工具. 集合爆破里面包含了&#xff1a;电子邮件爆破工具&#xff0c;Redis爆破工具&#xff0c;FTP爆破工具&#xff0c;SSH爆破工具&#xff0c;MySQL爆破工具。 目录&#xff1a; 集合爆破工具. 电子邮件 爆破工具&#xff1a; Redis 爆破工具&#xff1a; FTP …

sqlserver 创建表,列及表,列描述

-- 创建表 CREATE TABLE Employees (EmployeeID INT PRIMARY KEY,EmployeeName NVARCHAR(100),EmployeeEmail NVARCHAR(100) );-- 为表添加描述 EXEC sp_addextendedproperty name NMS_Description, value N员工信息表, level0type NSchema, level0name dbo, level1type N…