一个例子看懂IO模型

news2024/10/6 10:35:18

1.用户态和内核态

现代操作系统将空间划分为用户空间和内核空间。

用户态:一般都是些应用程序,不能直接的访问内核空间和硬盘。

内核态:操作系统的核心,只有切换到内核态才能操作磁盘。 

2.同步、异步、阻塞、非阻塞

 我们使用前后端交互中的客户端和服务端来理解这些概念,同步和异步针对的是客户端,而阻塞和非阻塞针对服务端。

  • 同步:前端发出一个请求,前端直接卡住,必须等到接收到服务端响应来的数据之后才会继续向下进行。
  • 异步:前端发出一个请求,不用管,继续向下执行,利用回调的方式来接收响应的数据,比如我们的ajax异步请求。
  • 阻塞:后端接收请求的线程获取到前端发送的请求时,去调用处理线程去数据库中查询所需要的数据并返回给接收线程,阻塞就是在处理线程操作的过程中,接收请求的线程必须停步等待,不能去干其他的事情。
  • 非阻塞:非阻塞就是在处理线程操作的过程中,接受请求的线程采用轮询的方式来查看数据是否准备好了,在期间可以干其他的事情。

3.各种IO模型 

我们使用一个例子来理解各种IO模型,比如顾客去餐馆买饭。

3.1阻塞IO模型(BIO)

        应用程序的进程发起IO调用,但是内核的数据还没有准备好,那应用进程就一直阻塞等待,等到内核数据准备好了,将内核数据拷贝到用户空间,才返回成功。

意思就是:你点完餐在这里等待哪都不去(同步),服务员(应用进程)将你点的食物(数据)告诉给厨师长(内核),然后服务员就在前台一直在这等着(阻塞),等到厨师长将食物做完(内核数据准备好了),然后厨师长打包好之后(拷贝到用户空间)直接到前台给服务员。

3.2非阻塞IO模型(NIO)

        应用程序的进程发起IO调用,但是内核的数据还没有准备好,那么应用进程就会轮询调用,等到哪一次应用进程去调用时内核的数据准备好了,然后将内核数据拷贝到用户空间(此时的应用进程是阻塞的状态),才返回成功。

意思就是:你点完餐在这里等待哪都不去(同步),服务员将你点的食物告诉厨师长,然后服务员去服务其他的顾客了(非阻塞),过一会时间,服务员问厨师长,彦祖的饭好了没(轮询调用),厨师长说马上好了(内核数据正在准备中),然后服务员又去服务其他的顾客了,等到服务员问到第三次时,厨师长说彦祖的食物做好了(内核数据准备好了),这时服务员就到后厨等待哪都不去(此时的应用进程是阻塞的状态),等到厨师长将食物打包后(拷贝到用户空间)直接给服务员。

3.3IO复用模型

        IO多路复用有select函数、poll函数和epoll函数。IO多路复用避免了NIO中无效的轮询调用的问题,采用了一套监听的方法,应用程序的进程发起IO调用,但是内核的数据还没有准备好,此时应用进程不再主动的去询问内核数据是否准备好(此时的应用进程是一个阻塞的状态),而是内核数据准备好后,返回一个事件状态,然后应用进程再去调用,将内核数据拷贝到用户空间(此时的应用进程是阻塞的状态),才返回成功。

fd也叫文件描述符,是一个非负的整数,本质上是一个索引值,是内核态为每个进程所记录其打开文件的记录表。 

  • select缺点就是监听的IO数量有限,内核数据准备好了,还需要一个个去遍历判断是属于哪个IO的。
  • poll解决了监听IO数量的限制问题,但是还是需要一个个去遍历判断,效率还是很低。
  • epoll采用的是事件监听回调的方式,可以迅速定位到相关应用程序上。

采用epoll函数的意思就是:你点完餐后哪都不去(同步) ,服务员将你点的食物告诉厨师长并给这个食物设置一个彦祖的名称和一个进度条,然后服务员就一直在前台等着(阻塞),等到厨师长将食物做好了(内核数据准备好了),彦祖点的食物的进度条也满了,然后广播播放彦祖顾客的食物做好了(回调),这时负责彦祖点餐的服务员(快速定位)就到后厨等待哪都不去(此时的应用进程是阻塞的状态),等到厨师长将食物打包后(拷贝到用户空间)直接给服务员。

3.4信号驱动IO模型

        应用程序的进程发起IO调用,但是内核的数据还没有准备好,那么应用进程就会去处理其他的事情,等到内核的数据准备好了,就会给应用程序发送一个信号,然后应用进程去调用数据,内核数据拷贝到用户空间(此时的应用程序是阻塞的状态),才返回成功。

意思就是:你点完餐后哪都不去(同步) ,服务员将你点的食物告诉厨师长并给这个食物设置一个彦祖的名称和一个进度条,然后服务员去服务其他的顾客了(非阻塞),等到厨师长将食物做好了(内核数据准备好了),彦祖点的食物的进度条也满了,然后服务员的对讲机里说彦祖顾客的食物做好了,这时服务员就到后厨等待哪都不去(此时的应用进程是阻塞的状态),等到厨师长将食物打包后(拷贝到用户空间)直接给服务员。

我们可以看到上面四种IO模型在内核数据拷贝到用户空间的这个过程,应用进程都是阻塞的。 

3.5异步IO

        异步IO真正做到了异步非阻塞,应用进程发起IO调用,但是内核的数据还没有准备好,应用程序可以去干其他的事情,等到内核数据准备好了,将内核数据拷贝到用户空间,返回成功,在整个过程应用进程一直没有被阻塞。

意思就是:你点完餐不用管了,去外面逛街( 异步),服务员( 应用进程)将你点的食物( 数据)告诉给厨师长( 内核),然后服务员就去接待其他的顾客( 非阻塞),等到厨师长将食物做完( 内核数据准备好了),然后厨师长打包好之后( 拷贝到用户空间)直接到前台给服务员。

 

4.Java NIO

4.1channel通道 

channel是一个全双工通道,可以通过此通道来读写数据,所有数据需要Buffer来进行处理。

4.2Buffer缓存

Buffer是用来与channel来进行交互的,数据是从Buffer写入通道,从通道读入缓冲区的。

4.3selector选择器

实现单个线程处理多个channel,用于检查每个channel的状态是否处于可读、可写。

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

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

相关文章

Java请求webservice踩过的坑

最近项目对接过程中,因为对方系统比较旧,我们和对方进行交互使用webservice方式进行,对方给出相关文档, 接口地址:http://ip:port/abc/def/xxxService?wsdl 接口名称:methodA 1-springboot配合CXF使用 …

智慧水务建设项目可研报告-222页【可研报告】

导读:原文《智慧水务建设项目可研报告-222页【可研报告】》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 部分内容: 业务需求分析 3.3.1业…

CentOS7中使用Docker进行MySQL主从复制【论文式教程】

1、安装Docker 卸载docker sudo yum remove docker*安装 yum-utils 工具集,它提供了一些额外的命令和功能,帮助你更好地管理 YUM 软件包管理器。其中包含了一个工具叫做 yum-config-manager,它用于管理 YUM 配置,包括软件仓库源…

计算机视觉:比SAM快50倍的分割一切视觉模型FastSAM

目录 引言 1 FastSAM介绍 1.1 FastSAM诞生 1.2 模型算法 1.3 实验结果 2 FastSAM运行环境构建 2.1 conda环境构建 2.2 运行环境安装 2.3 模型下载 3 FastSAM运行 3.1 命令行运行 3.1.1 Everything mode 3.1.2 Text prompt 3.1.3 Box prompt (xywh) 3.1.4 Points p…

Docker容器学习:部署安装Docker基础使用

目录 1、安装Docker-CE 1)参考阿里云的yum安装 2)二进制安装docker(推荐、生产环境使用较多) 3)配置Docker镜像加速 2、下载系统镜像(Ubuntu、 centos) 1)先查看我们所需的镜像…

如何通过人工智能和自动化提高供应链弹性?

全球供应链中的数字化转型已经引起了广泛关注,尽管在过去的十年中,这一话题被广泛讨论,但许多公司仍然对如何实现这一不明确的目标感到困惑。人们普遍认识到这种转变的重要性,而新冠疫情及其带来的巨大影响也为行业向数字化转型方…

数字生意,经九长兴 | 带您一起回顾秦丝9年成长历程

今年是秦丝科技成立的第9年,9年前我国90%以上的商家处于原始手工记账状态,急需SaaS软件实现数字化转型,高效管理门店,秦丝科技创始人主动扛起了帮中小商家数字化转型的重任。 经过9年的发展,秦丝目前已经成功帮助200万…

drools8尝试

drools7升级到drools8有很大很大的变更.几乎不能说是一个项目了. 或者说就是名字相同的不同项目, 初看下来变化是这样 两个最关键的东西都retired了 https://docs.drools.org/8.42.0.Final/drools-docs/drools/migration-guide/index.html business central变成了一个VS code…

回归预测 | MATLAB实现WOA-RF鲸鱼优化算法优化随机森林算法多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现WOA-RF鲸鱼优化算法优化随机森林算法多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现WOA-RF鲸鱼优化算法优化随机森林算法多输入单输出回归预测(多指标,多图)效果一览…

【计算机网络】日志与守护进程

文章目录 日志日志的创建logmessage 函数日志左边部分实现日志右边部分实现 完整代码log.hpp(整体实现)err.hpp (错误信息枚举) 守护进程PGID SID TTY 的介绍shell中控制进程组的方式结论 为什么要有守护进程存在?守护进程的创建使用守护进程的条件守护进…

centos7.6安装、卸载openssh

1.卸载openssh 执行 rpm -qa openssh*查看是否已经安装过了。 rpm -qa openssh* 依次卸载: yum remove openssh-server-7.4p1-23.el7_9.x86_64 yum remove openssh-7.4p1-23.el7_9.x86_64 或者使用:yum remove openssh-* 全部卸载掉 yum remove opens…

客户案例:中圣科技—CAC2.0防范盗号威胁,加固安全防线

客户背景 中圣科技(江苏)股份有限公司(以下简称“中圣科技”),是一家以技术研发为驱动,以清洁能源核心成套装备和节能环保工程服务为支撑的科技创新型企业。其以南京为核心运营基地,与当地政府…

【云原生】3分钟快速在Kubernetes1.25部署Prometheus2.42+Grafana9.5.1+Alertmanager0.25

文章目录 1、简介2、GitHub地址3、环境信息4、安装5、访问Grafana1、简介 Prometheus-operator帮助我们快速创建Prometheus+Grafana+Alertmanager等服务,而kube-prometheus更加完整的帮助我们搭建全套监控体系,这包括部署多个 Prometheus 和 Alertmanager 实例, 指标导出器…

Ubuntu20 安装 libreoffice

1 更新apt-get sudo apt-get update2 安装jdk 查看jdk安装情况 Command java not found, but can be installed with:sudo apt install default-jre # version 2:1.11-72, or sudo apt install openjdk-11-jre-headless # version 11.0.138-0ubuntu1~20.04 sud…

发布 net 项目 到 Docker

背景 因为发布到 centOS8 使用 screen -S 可以,想开机自启 使用 nohup 命令有启动不起来。环境问题不好找,就想尝试用 docker 运行 步骤 在生成的 Dockerfile 文件里增加修改时区指令 因为我们用的都是北京时间所以 创建镜像的时候就调整好 #设置时间…

SQLSTATE[IMSSP]: The active result for the query contains no fields.

我的是SQL server 报错场景,代码: $psendmx_sql"SET IDENTITY_INSERT PSENDMX ON;INSERT INTO psendmx (DJBH,MIBH,MXBH,SPDM,GG1DM,GG2DM,SL,SL_2,CKJ,ZK,DJ,DJ_1,JE,HH) VALUES {$mx_values};SET IDENTITY_INSERT PSENDMX OFF;"; $a$db_er…

算法通关村第九关——透彻理解二分查找

1.前言 常见的查找算法有顺序查找、二分查找、插值查找、斐波那契查找、树表查找、分块查找、哈希查找等。如果进行归类,那么二分查找、插值查找(一种查找算法)以及斐波那契查找都可以归为插值查找(大类)。而插值查找…

macOS上编译obs-studio

前言 最近基于obs的1个二开程序,需要移植到macOS平台上,由于遇到些问题,本文记录下如何在macOS上配置&编译&运行obs程序完整过程。 下载 首先下载cmake-gui工具,下载CMAKE,选择对应macOS平台的cmake版本&…

过来人经验,PMP考试第七版要怎么学?

第七版没有大家说的那么难,根据考纲来看,一半内容将考查预测型项目管理方法,一半考查敏捷或混合型方法 🌈备考建议是:先学第六版和敏捷,再来学第七版,第七版其实可以理解为第六版的升级&#xf…

java八股文面试[JVM]——垃圾回收

参考:JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客 GC垃圾回收面试题: JVM内存模型以及分区,需要详细到每个区放什么 堆里面的分区:Eden,survival from to,老年代,各…