【黑马Redis原理篇】Redis网络模型

news2024/11/28 8:38:06

来源视频 [16,27]

文章目录

  • 1.用户空间和内核空间
    • 空间划分
    • 缓冲区
  • 2.IO模型
    • 2.1 阻塞IO
    • 2.2 非阻塞IO
    • 2.3 IO多路复用
      • 2.3.1 阻塞和非阻塞的对比
      • 2.3.2 IO多路复用
      • 2.3.3 监听FD方式、通知的方式,有多种实现
    • 2.4 信号驱动IO
    • 2.5 异步IO
    • 2.6 真正的同步和异步

1.用户空间和内核空间

在这里插入图片描述

空间划分

为了避免内存崩溃,需要分为用户空间和内核空间。进程的寻址空间会划分为这两部分,比如低位划分为内核空间,高位划分为用户空间。在权限上也划分不同等级。

缓冲区

在用户空间和内核空间都加入缓冲区,提高IO效率。
写数据时,把用户缓冲数据 拷贝到 -> 内核缓冲区-> 然后写入设备。
读数据时,要从设备读取数据 -> 内核缓冲区->拷贝到用户缓冲区,用户再读取。
在这里插入图片描述

2.IO模型

用户缓冲区调用内核指令,访问内核缓冲区,读取硬件设备的数据。
在这里插入图片描述
在这里插入图片描述

2.1 阻塞IO

阻塞IO,用户进程在两个阶段都在等待:用户进程向操作系统发起一个IO请求(系统调用)时,用户进程被阻塞,等待还没被准备好的数据;操作系统内核的IO子系统会监控硬件设备的状态,等待数据准备就绪。
如果数据已经准备好了,中断处理程序会通知操作系统内核的IO子系统。然后,操作系统内核会将数据从硬件设备拷贝到内核空间的缓冲区,再将数据从内核空间拷贝到用户空间的缓冲区。数据拷贝完成后,操作系统内核会通知之前被阻塞的应用程序线程。在这里插入图片描述

2.2 非阻塞IO

非阻塞IO,用户调用时,会立即返回结果,而不阻塞用户进程。用户进程可以反复调用反复询问,直到结果是有数据了,就将数据从内核缓冲区拷贝到用户缓冲区。
在非阻塞IO中,用户进程在调用阶段是非阻塞的,在拷贝数据阶段还是阻塞的。而且忙等机制让CPU使用率暴增。因此,可能性能还不如阻塞IO。
在这里插入图片描述

2.3 IO多路复用

2.3.1 阻塞和非阻塞的对比

阻塞和非阻塞IO的区别主要在于没有数据时,一个阻塞一个不阻塞;
有数据时是一样的操作,直接进入第二阶段,读取并处理数据。
在这里插入图片描述

2.3.2 IO多路复用

每个文件都有一个对应的文件描述符FD(每个socket都是一个FD)。
IO多路复用:利用单个线程(复用的是线程)同时监听多个FD,并在某个FD可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。

用户进程监听多个FD,调用select。内核检查监听的多个FD,只要有任意数据就绪,就会返回结果给用户进程。(如果所有数据全都没有就绪,应用进程就阻塞等待)内核将数据存储在内核缓冲区,用户进程循环调用recvfrom,把每个数据从内核缓冲区拷贝到用户缓冲区,用户进程处理用户空间缓冲区的数据。(数据拷贝时同样是阻塞的)

recvfrom直接尝试读取某个FD。在这里插入图片描述用户进程通常在一个循环中重复上述过程,以持续监听和处理多个文件描述符上的IO事件。

2.3.3 监听FD方式、通知的方式,有多种实现

常见的有:select, poll, epoll
区别:select和poll只会告诉用户进程有FD就绪,但不知道是哪一个FD。用户进程需要遍历每一个FD确认是否就绪;epoll通知用户进程有FD就绪,同时把这个已就绪的FD写入用户空间。
(可以不看)不同方式的具体实现…

2.4 信号驱动IO

信号驱动IO,用户程序与内核建立信号关联后就返回(非阻塞)。当数据就绪后,内核发送信号通知用户程序。用户程序就可以调用获得数据。(数据从内核拷贝到用户空间仍是阻塞的)
在这里插入图片描述

2.5 异步IO

用户发起系统调用后就返回。后续工作由内核全部完成,完成后递交信号通知用户。
在这里插入图片描述

2.6 真正的同步和异步

阻塞IO、非阻塞IO、多路复用IO、信号驱动IO在拷贝数据时都是阻塞的,实际上都属于同步的IO操作。只有“异步IO”是真正的异步操作。

这种阻塞发生的原因是因为用户进程需要等待内核空间的拷贝操作完成,才能继续执行后续的操作。
用户进程在数据拷贝期间被阻塞的原因是:
内核空间操作:数据拷贝是在内核空间进行的,用户进程无法干预或控制这个过程,因此必须等待内核完成拷贝;
资源管理:内核需要确保数据拷贝过程中的内存管理是安全的,不会导致数据损坏或内存泄漏。因此,用户进程在这个阶段被阻塞,直到内核确认数据拷贝完成;
上下文切换:如果用户进程在数据拷贝期间不被阻塞,它可能会尝试访问或修改正在被内核拷贝的数据,这可能会导致数据不一致或其他问题。阻塞用户进程可以避免这种风险。在这里插入图片描述

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

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

相关文章

opencv环境配置-适配b站阿童木的opencv教程

首先,opencv作为一个库文件,目的是为了让更多人不需要学习底层像素操作就能上手视觉技术,所以他适配很多环境,目前电脑端我知道的就可以适配C语言 C Python MCU端就是openmv跟他最类似,还有个k210 canmv 阿童木教的…

考研前所学的c语言01(2024/10/15)

1.变量由字母数字下划线组成,但是首字母只能是字母和下划线 2.基本函数01 3.基本代码02(符号常量) 4. A 是字符常量(character constant)。它表示单个字符,并且它的类型是 char,一个字节 "…

mysql connect -- C api编译链接问题,接口介绍(初始化和销毁,连接,执行sql语句,获取结果集的元数据和数据,设置编码格式)

目录 mysql connect 介绍 开发环境 编译链接问题 编译 链接 接口介绍 初始化和销毁 mysql_init() 句柄 mysql_close() 链接数据库 mysql_real_connect() 参数 返回值 show processlist 给mysql下达命令 mysql_query() 参数 返回值 查询结果的获取 引入 …

HarmonyOS NEXT 应用开发实战(七、知乎日报轮播图的完整实现)

在今天的博文中,我们将深入探讨如何在 HarmonyOS NEXT 中使用 ArkUI 实现一个轮播图组件。我们将通过一个示例代码来演示这个完整的过程,其中包含获取数据、管理数据源以及渲染组件等多个部分。 先来看下最终实现效果: 项目准备 首先&#…

JMeter之mqtt-jmeter 插件介绍

前言 mqtt-jmeter插件是JMeter中的一个第三方插件,用于支持MQTT(Message Queuing Telemetry Transport)协议的性能测试。MQTT是一种轻量级的发布/订阅消息传输协议,广泛应用于物联网和传感器网络中。 一、安装插件 mqtt-jmeter项目…

【智能算法应用】雪消融优化算法求解二维路径规划问题

摘要 本文研究了雪消融优化算法在二维路径规划问题中的应用。该算法基于自然界中雪消融现象的模拟,通过优化策略寻找无人机路径的最优解。实验结果表明,该算法在路径规划中表现出较高的效率和收敛速度,能够有效地避开障碍物并找到代价最低的…

基于SpringBoot+Vue的校园周边美食探索及分享平台的设计与实现(带文档)

基于SpringBootVue的校园周边美食探索及分享平台的设计与实现(带文档) 开发语言:Java数据库:MySQL技术:SpringBootMyBatisVue等工具:IDEA/Ecilpse、Navicat、Maven 源码 校园周边美食探索及分享平台是一个旨在为校园用户提供便捷的美食发现和分享服务的系统。该平…

我的JAVA项目构建

1.Maven maven就是pip 设置maven下载的的jar包位置 换源 下载插件maven-search 配置dependency 2.Tomcat 设置环境变量JAVA_HOME 设置编码方式 方框就是路径的前缀 3.Servlet 新建项目 写一个类继承HttpServlet,复写doGet(应对Get请求),doPost(应对…

vue组件传值之$attrs

1.概述:$attrs用于实现当前组件的父组件,向当前组件的子组件通信(祖-》孙) 2.具体说明:$attrs是一个对象,包含所有父组件传入的标签属性。 注意:$attrs会自动排除props中声明的属性&#xff0…

从0开始深度学习(14)——模型选择、欠拟合、过拟合

① 模型在训练数据上拟合的比在潜在分布中更接近的现象,就叫过拟合(overfitting) ② 用于对抗过拟合的技术称为正则化(regularization) 1 训练误差和泛化误差 ①训练误差(training error)&…

scrapy 爬虫学习之【中医药材】爬虫

本项目纯学习使用。 1 scrapy 代码 爬取逻辑非常简单,根据url来处理翻页,然后获取到详情页面的链接,再去爬取详情页面的内容即可,最终数据落地到excel中。 经测试,总计获取 11299条中医药材数据。 import pandas as…

CTFHUB技能树之HTTP协议——响应包源代码

开启靶场,打开链接: 是个贪吃蛇小游戏,看不出来有什么特别的地方 用burp抓包看看情况: 嗯?点击“开始”没有抓取到报文,先看看网页源代码是什么情况 居然直接给出flag了,不知道这题的意义何在 …

某MDM主数据管理系统与微软Dynamic CRM系统(国内节点)集成案例

一、需求分析 需要完成的核心场景: 客户主数据:通过SAP PO集成中间件平台,某MDM主数据实时推送客户主数据信息至微软CRM系统,方便微软CRM系统进行客户方面的管理,并供微软CRM查询员工信息,修改员工&…

IDEA运行Java程序时出错。提示:命令行过长。通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行。

文章目录 一、遇到问题二、分析问题三、解决办法 一、遇到问题 运行 OpenCVUtils.test 时出错。命令行过长。 通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行。二、分析问题 IDEA提示很明显了。 三、解决办法 运行——>编辑配置 运行/调试配置——&g…

024_Symbolic_Math_in_Matlab符号数学工具箱的使用思路

符号运算与数值计算 缘,妙不可言 给本科、硕士、博士、研究实习员、助理研究员、副研究员改过Matlab代码,最有意思也最好玩的就是兄弟姐妹们喜欢把符号运算跟数值计算混合在一起。 从概念上看,还是挺不错的。 大佬们的计划都是这样的&…

64页精品PPT | 汽车经销商数据应用解决方案

汽车经销商正面临前所未有的盈利能力挑战。从18年起 ,传统燃油车汽车行业开始步入低速增长阶段 ,卖车已经挣不到钱 ,利润往往来自任务完成的厂家返利;新兴的直营模式的出现 ,冲击了传统授权经销的方式 ,疫情…

车辆管理新篇章:SpringBoot技术解析

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

sns数据分析

探索性数据分析 这一部分目的在于了解数据&#xff0c;包括数据是什么类型&#xff0c;数据有什么特点 数据信息 print(data.shape) data.info()(1086, 12) <class pandas.core.frame.DataFrame> Index: 1086 entries, 2020/7/1 0:00 to nan Data columns (total 12 c…

鸿蒙网络编程系列24-Web组件与应用互操作示例

1. APP内嵌网页与应用互操作概述 在通常的APP开发中&#xff0c;经常会采用内嵌网页的形式&#xff0c;通过网页来展现丰富的动态内容&#xff0c;虽少了很多原生开发的功能&#xff0c;但是这么做无可厚非&#xff0c;毕竟APP需要适配的系统平台很多&#xff0c;比如安卓、苹…

leetcode289:生命游戏

根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态&#xff1a; 1 即为 活细胞 &am…