一个例子看懂IO模型

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.hqwc.cn/news/78316.html

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

相关文章

【C++】UDP通信,实现文件的传输

目录 1 TCP与UDP比较 2 UDP 3 通信流程 4 实践 5 运行结果 1 TCP与UDP比较 2 UDP简介 UDP通信是无连接的,因此不需要

详解VAE(变分自编码器)

变分自编码器-VAE 前言一、AE(auto-encoders)-自编码器1.AE整体结构及公式推导2.AE的特点 二、 VAE(Variational auto-encoder)-变分自编码器1.VAE模型结构2.理论推导2.1变分下界(Variational Lower bound)/变分推理最小化KL散度最…

Harmony OS教程学习笔记

基础知识 1.如何修改程序启动的第一个页面? 不想使用创建的默认的页面,这时需要修改启动页面,修改的地方在EntryAbility文件中的onWindowStageCreate方法中。 onWindowStageCreate(windowStage: window.WindowStage) {// Main window is cr…

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 3 Paramter标签页介绍

这页是参数设置的界面,那首先要知道什么是参数,参数就是算法中的系数这些可以更改的变量,接下来就是要学习如何创建参数,如下图: 打开模型资源管理器 选择model Workspace标签,点击上边工具栏里的创建参数的按钮(红色箭头指向的按钮),添加一个新的参数K,值设置为4,数…

RISC-V公测平台发布· CoreMark测试报告

一. CoreMark简介 CoreMark是一款用于评估CPU性能的基准测试程序,它包含了多种不同的计算任务,包括浮点数、整数、缓存、内存等方面的测试。CoreMark的测试结果通常被用来作为CPU性能的参考,它可以帮助开发人员和系统管理员评估不同处理器和…

logstash配置文件

input { kafka { topics > “xxxx” bootstrap_servers > “ip:port” auto_offset_reset > “xxxx” group_id > “xxxx” consumer_threads > 3 codec > “json” } } filter { grok { match > { “message” > ‘%{IP:client_ip} - - [%{HTTPDATE:…

C语言好题解析(四)

目录 选择题一选择题二选择题三选择题四选择题五编程题一 选择题一 已知函数的原型是: int fun(char b[10], int *a); 设定义: char c[10];int d; ,正确的调用语句是( ) A: fun(c,&d); B: fun(c,d); C: fun(&…

神经网络基础-神经网络补充概念-54-softmax回归

概念 Softmax回归(Softmax Regression)是一种用于多分类任务的机器学习算法,特别是在神经网络中常用于输出层来进行分类。它是Logistic回归在多分类问题上的推广。 原理 Softmax回归的主要思想是将原始的线性分数(得分&#xf…

Python数据分析实战-给定JSON格式的数据提取所需字段并转换为DataFrame(附源码和实现效果)

实现功能 给定JSON格式的数据提取所需字段并转换为DataFrame 实现代码 import pandas as pd import json# 假设给定的JSON数据已经存储在data变量中 data [{"title": "Data Source Adapter for Excel Sheets","project_code_url": "htt…

无涯教程-Perl - time函数

描述 此函数返回自纪元以来的秒数(对于大多数系统,是1970年1月1日UTC,00:00:00;对于Mac OS,是1904年1月1日,00:00:00)。适用于gmtime和本地时间。 语法 以下是此函数的简单语法- time返回值 此函数返回自纪元后数秒的整数。 例 以下是显示其基本用法的示例代…

神经网络为什么可以学习

本资料转载于B站up主:大模型成长之路,仅用于学习和讨论,如有侵权请联系 动画解析神经网络为什么可以学习_哔哩哔哩_bilibilis 1、一个神经网络是由很多神经元形成的 1.1 也可以是一层,也可以是多层 2 层和层之间的连接就跟一张网一样 2.1 每…

解决Pycharm的Settings中Project不见了也无法选择Python Interpreter的方法

目录 一、问题如下二、解决方法 一、问题如下 突然打开项目没有python解释器,也无法重新配置python Interpreter,而且整个文件夹是黄色高亮的形式,如下显示,而且重新安装了pycharm也没用甚至说打开File–>Setting–>Projec…