阻塞IO、非阻塞IO和IO多路复用

news2024/11/24 2:35:49

文章目录

    • 用户态和内核态
    • 操作系统角度的IO
    • IO模型
      • 阻塞IO
      • 非阻塞IO(NIO)
      • IO多路复用
        • select 、poll和epoll

用户态和内核态

用户态也叫用户空间,内核态也叫内核空间。

操作系统为了保护系统的安全,都会划分出内核空间和用户空间。简单来说用户空间是指没有特权的应用程序,访问系统资源时受到极大的限制,比如对系统中的文件进行读写操作时,都会切换到内核态,例如我们编写程序、APP、客户端软件等都是用户态程序。而内核态就是权限较大的进程,可以真正去操作磁盘。

内核态运行操作系统程序,操作硬件,用户态运行用户程序;当程序运行在3级特权级上时,可以称之为运行在用户态,当程序运行在0级特权级上时,称之为运行在内核态。

操作系统角度的IO

我们将内存中的数据写入到磁盘的话,操作系统负责计算机的资源管理和进行的调度,我们电脑上跑着的应用程序,其实是需要经过操作系统,才能做一些特殊的操作,如磁盘文件读写,内存的读写等。

真正的IO是操作系统执行的,应用程序的IO分为两个动作:IO调用,IO执行.IO调用是由进行发起的,而IO执行是操作系统内核的工作。

IO模型

主要区分就在于内核态进程遇到数据没有准备好时,处理的方式。

等待——阻塞IO,立即返回——非阻塞IO,

阻塞IO

当一个用户态进程需要读取磁盘上的某个数据时,需要调用内核对外提供的指令或者是函数,调用之后,如果现在数据还没有准备好,内核就等待,直到数据准备好了并返回给内核空间之后再将数据返回给用户态进程。

谁阻塞?用户进程

在这里插入图片描述

非阻塞IO(NIO)

当内核进程访问数据没有准备好时,立即返回一个失败信息,告诉用户进程没有准备好,用户进程不断的重新调用数据,也就是不断的问内核准备好了没有,在这段时间内核在后台会持续尝试将硬件上的数据读取到缓冲区。在内核准备的这段时间用户进程不会阻塞,但是会不停的访问。直达某一刻,数据准备好了,也到达内核了,访问不在报错,尝试拷贝并返回数据。

非阻塞IO的第一阶段:等待数据,的时候用户进程不是阻塞状态;而第二阶段:从内核拷贝数据到用户空间时,用户进程是阻塞状态的。

IO多路复用

无论是阻塞IO还是非阻塞IO,用户应用在一阶段都需要调用recvfrom来获取数据,主要区别在于无数据时的处理方案:

如果恰好没有数据时,阻塞IO会使进程阻塞,非阻塞IO会使CPU空转,都不能充分发挥CPU的作用。

比如服务器端处理客户端Socket请求时,在单线程情况下,只能依次处理一个Socket,如果正在处理的Socket恰好未就绪(数据不可读或者写),线程就会阻塞,其他所有的客户端Socket都必须等待(即使其他的Socket已经准备就绪了),性能自然差。

与一个生活中例子十分相似:

去店里排队买饭的时候,正在买饭的那个人有选择困难症,半天不知道吃啥,后面的人即使已经想好了要吃啥也必须在那干等。

解决方法:

  1. 增加服务员(多线程)。缺点:开销大(CPU性能随着线程的增加而降低)。
  2. 不排队,谁想好了(数据就绪),服务员就给谁点餐(用户应用就去读取数据)。线程监听所有到达服务器的Socket任意一个Socket准备就绪就赶紧处理它。问题如何知道是否准备就绪?使用到了FD(文件描述符),是一个从0开始递增的无符号整数,用来关联一个文件。

多路复用就是利用单线程来同时监听多个FD,并在某个FD可读、可写时通知,从而避免无效等待,充分利用CPU资源。

select 、poll和epoll

select
在这里插入图片描述

先调用select函数,select内部可以接收多个fd,也就是可以吧每个客户端的Socket对应的FD都可以传给select函数,然后传入到内核,内核检查这些FD是否有准备就绪的,只要有一个准备就绪的,就调用recvfrom函数处理。如果都没有就绪,会等待。注意:select函数返回后,是通过遍历fdset,找到就绪的描述符FD,因为它并不知道是哪一个Socket准备好了。

recvfrom是只能监听一个FD,select一次可以监听多个FD。

poll

select监听的IO最大连接有限,在Linux系统上一般为1024。为了解决数量限制提出了poll。

epoll

poll和select只会通知用户进行有就绪FD,但是不确定具体哪个FD,需要进程逐个遍历来确认。
在这里插入图片描述

epoll会通知用户进程FD就绪时,把已经就绪的FD写入用户空间中,用户应用就可以直接处理准备就绪的Socket。

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

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

相关文章

seata 的部署和集成

文章目录 seata的部署和集成一、部署Seata的tc-server1.下载2.解压3.修改配置4.在nacos添加配置5.创建数据库表6.启动TC服务 二、微服务集成seata1.引入依赖2.修改配置文件 TODO三、TC服务的高可用和异地容灾1.模拟异地容灾的TC集群2.将事务组映射配置到nacos3.微服务读取nacos…

PHP加密与安全的最佳实践

PHP加密与安全的最佳实践 概述 在当今信息时代,数据安全是非常重要的。对于开发人员而言,掌握加密和安全的最佳实践是必不可少的。PHP作为一种常用的后端开发语言,提供了许多功能强大且易于使用的加密和安全性相关函数和类。本文将介绍一些P…

vue动态修改audio地址

问题:点击后替换url地址,实现了,但是播放器依旧没有反应。 解决:vue中动态替换只是替换了地址,并没有告诉audio标签是否要执行,执行什么操作。要load后才能让它知道,是在喊他,他需求…

geacon_pro配合catcs4.5上线Mac、Linux

我的个人博客: xzajyjs.cn 一些链接 Try师傅的catcs4.5项目: https://github.com/TryGOTry/CobaltStrike_Cat_4.5,最新版解压密码见:https://www.nctry.com/2708.html geacon_pro: https://github.com/testxxxzzz/geacon_pro BeaconTool.jar: https:/…

工业用故障电弧探测器的设计与应用

安科瑞虞佳豪 壹捌柒陆壹伍玖玖零玖叁 故障电弧产生的原因---绝缘破损 原因二:线路绝缘破损,导致相间并联故障电弧及对地故障电弧 (1)电气线路施工时未按规范使用套管等保护措施; (2)野蛮施工等施工不当导致线路绝缘皮破损; …

基于web的人力资源管理系统/基于java的OA系统

摘 要 人力资源管理系统是现代企业的核心内容。随着计算机信息技术的高速发展电子商务模式的空前盛行,企业之间的竞争也从有形的经济市场转向了网络。开发以计算机技术、网络技术、信息技术支持的现代人力资源管理系统,既能提高人力资源管理的技术含量和…

云上社群学习系统部分接口设计详解与测试

目录 一、项目简介 1. 使用统一返回格式+全局错误信息定义处理前后端交互时的返回结果 2.使用ControllerAdviceExceptionHandler实现全局异常处理 3.使用拦截器实现用户登录校验 4. 使用MybatisGeneratorConfig生成常的增删改查方法 5. …

.net core发布到IIS上出现 HTTP 错误 500.19

1.检查.net core 环境运行环境是否安装完成,类似如下环境 2.IIS是否安装全 本次原因就是IIS未安装全导致的 按照网上说的手动重启iis(iisreset)也不行

无涯教程-Perl - telldir函数

描述 此函数返回DIRHANDLE引用的目录列表中读指针的当前位置。此返回值可以由seekdir()函数使用。 语法 以下是此函数的简单语法- telldir DIRHANDLE返回值 此函数返回目录中的当前位置。 例 以下是显示其基本用法的示例代码,/tmp目录中只有两个文件- #!/usr/bin/perl …

Vue用JSEncrypt对长文本json加密以及发现解密失败

哈喽 大家好啊,最近发现进行加密后 超长文本后端解密失败,经过看其他博主修改 JSEncrypt原生代码如下: // 分段加密,支持中文JSEncrypt.prototype.encryptUnicodeLong function (string) {var k this.getKey();//根据key所能编…

由小波变换模极大值重建信号

给定信号, 令小波变换的尺度 则x(t)的二进小波变换为 令为取模极大值时的横坐标,那么就是模极大值。 目标是由坐标、模极大值及最后一级的低频分量重建信号x(t) 为了重建x(t),假定有一信号集合h(t),该集合中信号的小波变换和x(…

JavaScript请求数据的4种方法总结(Ajax、fetch、jQuery、axios)

JavaScript请求数据有4种主流方式,分别是Ajax、fetch、jQuery和axios。 一、Ajax、fetch、jQuery和axios的详细解释: 1、 Ajax Ajax(Asynchronous JavaScript and XML)是一种使用JavaScript在用户的浏览器上发送请求的技术&…

分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测

分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测 目录 分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测 2.代码说明:要求于Matlab 2021版及以上版本。 程序…

kernel的config加上 CONFIG_SND_ALOOP=y ,aplay不能播放声音

概念:CONFIG_SND_ALOOP CONFIG_SND_ALOOP 是 Linux 内核配置选项之一,用于启用 ALSA Loopback 驱动程序。 ALSA(Advanced Linux Sound Architecture)是 Linux 上的音频架构,提供了一个统一的音频接口,使应…

雷军写的代码上热搜了

“雷军写的代码”一词突然上了微博热搜: 一瞬间,我想起了这张图: 到底发生了什么,好奇的我点进去一看,原来是因为雷军预告年度演讲的微博里配了一张海报: 这张海报信息量非常大,一眼就能看到有很…

如何使用Vue和C++实现OJ《从零开始打造 Online Judge》

课程简介 课程链接:https://www.lanqiao.cn/courses/20638 邀请码:x8pGd60V 本课程采用前后端分离架构,基于 Vue.js 和 C 技术,从零开始打造 Online Judge。 课程介绍 OJ 是 Online Judge 系统的简称,用来在线检测…

算法通关村第3关【白银】| 双指针思想

1. 双指针思想 双指针不仅指两个指针,也可以是两个变量,指向两个值。 有三种类型: 快慢型:一前一后对撞型:从两端向中间靠拢背向型:从中间向两端分开 2. 删除元素专题 2.1原地移除元素 (1)快慢指针 思…

我的创作纪念日(128天)

机缘 CSDN账号创建已有3年了,本篇是第一篇纪念文。。。有点偷懒的感觉了。。。 从第一篇文章的发布,到现在已经过了128天了,回想起当时发布文章的原因,仅仅只是因为找不到合适的云笔记,鬼使神差的想到了CSDN&#xff…

第十一课:Qt 快捷键大全

功能描述:Qt 中的快捷键查看方式和自定义快捷键 一、快捷键查看/自定义 Qt Creator 中提供了各种快捷键,如需查看或自定义快捷键,选择菜单栏“工具” -> “选项” -> “环境” -> “键盘”。 快捷键按类别列出,可以在过…

Windows 11 + Ubuntu20.04 双系统 坑里爬起来

ThinkPad x390 安装双系统,原有的磁盘太小,扩充了磁盘重新装系统,出现的问题,加以记录。 1. windows和ubuntu谁先安装,两个都可以,一般建议先安装windows,后安装ubuntu 2. 安装windows后&…