Redis系列---Redis网络模型1

news2024/12/29 13:00:57

      我们都知道,redis的高性能是具有多方面的因数,如:运行在内存上,单线程命令,io多路复用技术等,对于redis高性能的探究,就需要深入的研究其工作原理,这就涉及到redis的网络模型了,而需要探究redis的网络模型,就需要提前了解什么是用户空间,什么是内核空间,以及多路复用等技术。

一、用户空间与内核空间

一、前言

由于内核本身也是在操作和消耗各种资源,而用户程序也是在消耗这些资源(内存,cpu等),如果不加以限制,让用户程序随意操作这些资源,可能会导致用户应用冲突,从而产生内核崩溃。所以需要对应用程序与内核进行隔离。

二、用户空间和内核空间 

一、对应用程序和内核进行隔离

1、进程的寻址空间划分为两部分:内核空间、用户空间

寻址空间:无论是内核还是用户程序,都无法直接访问计算机的物理内存空间,而是通过访问一个虚拟内存空间(虚拟内存空间与物理内存空间会有一个映射),这个虚拟内存空间就是一个无符号的整数虚拟地址,他的最大值就是(假如这台计算机是32位的)2的32次方,从0-2^32这个空间就是所为的寻址空间。一个内存地址代表的就是一个存储单元,也即一个字节,2^32就等于4G。

2、内核空间和用户空间命令权限的控制

用户空间:只能执行受限的命令(Ring3,等级最低的命令),而且不能直接调用系统资源,必须通过内核提供的接口进行访问。

 内核空间:可以执行特权命令(Ring0,等级最高的命令),可以调用一切系统资源

三、栗子 

以IO读写为例,Linux系统为了提高IO效率,会在用户空间和内核空间加入缓冲区。io读写会涉及到对磁盘(文件读取等)或者网卡的访问(网络访问)。

1、写数据时,要把用户缓冲数据拷贝到内核缓冲区中,然后写入设备

2、读数据时,要从设备读取数据到内核缓冲区,然后拷贝到用户缓冲区

1、假设进程一开始进行简单的字符串运算,这些都属于基础命令,都是在用户空间进行,等到计算完了,需要写入到磁盘。这个时候就需要调用内核空间进行操作了

2、这个时候用户空间的数据会放入到缓冲区,内核空间从用户空间的缓冲区复制一份数据到内核缓冲区里,然后再把内核缓冲区数据写入到磁盘。

3、读取操作刚好相反。

注意: 这些操作用,读取数据等待数据从磁盘中返回和数据复制这两部分操作时最消耗性能的

二、阻塞IO 

用户空间调用内核空间的recvfrom函数,内核空间去检查是否有数据,阻塞IO模型下,如果没有数据,会一直阻塞等待函数返回数据,这个时候函数也不会返回失败信息,而是会一直等待数据准备就绪(数据从硬件放入到内核空间缓冲区),这个时候如果数据准备就绪了,就会拷贝一份到用户空间,函数返回一个ok的结果给用户进程

阻塞IO:就是在这两阶段都必须阻塞等待

三、 非阻塞IO

用户应用调用内核空间函数进行数据的获取,如果数据还未准备就绪,函数直接返回失败,此时用户应用会反复去询问内核空间数据是否准备就绪,但是不会阻塞。一直到内核空间数据准备就绪,拷贝到用户空间,函数返回ok。

注意:在数据准备就绪到拷贝完成这段时间,线程是处于阻塞状态的

四、IO多路复用 

一、文件描述符:

        简称fd,是一个从0开始递增的无符号整数位,用来关联Linux中的一个文件。在Linux中,一切皆文件,例如常规文件、视屏、硬件设备等,当然也包括网络套接字(socket)

二、IO多路复用:

        是利用单个线程来同时监听多个fd,并在某个fd可读、可写时得到通知,从而避免无效的等待,充分利用cpu资源。

 recvfrom函数:此函数是直接尝试去读取数据,读的目标就是某一个具体的fd,但是并不知道这个fd数据在内核空间是否准备就绪。如果没有就绪,就会产生阻塞或者一直轮询询问是否就绪等情况。(这个函数只能监听当前fd是否就绪,如果没有将会阻塞)

select函数:基于上面的情况,就需要确定fd是否准备就绪再调用recvfrom函数,这个时候就需要用到select函数了。此函数内部可以接受多个fd(此函数会把fd传入到内核空间),对多个fd进行监听(内核空间监听),如果有就绪了的,内核空间会返回给此函数。如果此时还是没有准备就绪的fd数据,那么此时进程只能进行等待,阻塞了。此时会有一个后台线程对fd进行监听,如果有准备就绪了的fd数据,将返回给select函数对应的结果。这个时候才会去调用recvfrom函数。这个时候如果有多个fd准备就绪,将会循环调用。

select、poll:只会通知用户进程有fd准备就绪,但不确定具体是哪一个fd,需要用户进程遍历fd来确认。
epoll:通知用户进程准备就绪的同时,把已就绪的fd写入用户空间。

1、 select模式

        select是linux中最早的IO多路复用实现方案。

select模式存在的问题:

1、需要将整个fd_set从用户空间拷贝到内核空间,select结束后还得再拷贝回去。

2、select模式在用户空间无法得知具体是哪个fd准备就绪了,需要重新遍历fd_set数组

3、fd_set数组最大长度为1024,因此最大可以监听1024个fd

  2、poll模式

 3、epoll模式

1、事件通知机制

 4、对比

5、完整流程 

 注意:

1、accept()函数处,如果有客户端请求连接,那么说明有ssfd可读,就会调用此函数,接收客户端socket,得到对应的fd,之后注册fd到红黑树中。如此重复。

2、当判断事件为读类型时,如果ssfd为可读类型时,那么说明有客户端连接进来了。如果为不可读时,说名是普通命令执行。

3、类型事件判断也可能会是异常事件。

五、信号驱动IO 

  六、异步IO

七、同步异步以及阻塞非阻塞 

一、同步异步:同步、异步描述的是多个线程之间的协作关系,线程之间要么是同步,要么是异步。简单来说同步异步是对于调用者来说的。

同步:调用者需要收到被调用者返回的数据才执行后续操作。

异步:调用者不需要收到被调用者返回的数据,就进行执行后续操作。

二、阻塞和非阻塞:是同一个线程内部的执行状态,在一个时间点,线程要么阻塞,要么非阻塞。简单来说阻塞和非阻塞是对于被调用者来说的。

阻塞:被调用者由于各种原因线程执行权被抢占,当前线程挂起,等待执行,程序无法进行下去。

非阻塞:被调用者没有处理完当前任务,但是线程也不挂起,而是去处理其他事情。等到当前任务可以执行时再回来执行,但是此时是一直会去询问当前任务是否可以执行,

 

 

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

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

相关文章

python实现单链表、双链表、反转链表(二)

一、链表概述 链表是有元素组成的数据结构,每个元素都是单独对象,包含数据和指针信息 链表中的每个元素称为节点,如下所示,第一个节点称为Head(头节点),为链表的入口点,如果链表为空,则Head指…

Vue.js 比较重要知识点总结二

概述 vue3 组合式API生命周期钩子函数有变化吗?Composition API 与 Options API 有什么区别?watch 和 watchEffect 的区别?vue2 如何升级到 vue3 ? vue3 组合式API生命周期钩子函数有变化吗? 选项式API 和 组合式API 生命周期…

Java的继承性

1.为什么要有类的继承性?(继承性的好处) ① 减少了代码的冗余,提高了代码的复用性② 便于功能的扩展③ 为之后多态性的使用,提供了前提 2.子类继承父类以后有哪些不同? 2.1体现: 一旦子类A继承父类B以…

汇编基础学习

1. 利用ldr向寄存器里面写较大数据,和设置寄存器的某些位 2. 这个lable 不对呢 验证宏值加载到寄存器里是正确的。 pc 的地址是0x80594 当前pc指针加上宏定义值的地址值。 3 打印字符串 字符串加载了8个字节到寄存器里面, 如何调试打印出来呢&#xff1…

数据库设计的原则有哪些

数据库设计是程序开发的核心部分,标准的数据库设计原则和步骤能有效提高开发进度和效率。 数据库设计(Database Design)是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据&#xf…

RK3588平台开发系列讲解(驱动基础篇)中断相关函数

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、获取中断号相关函数二、申请中断函数三、free_irq 函数四、中断处理函数五、中断使能和禁止函数沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Linux 中断有专门的中断子系统,其实现原理很复杂,但是驱…

Git详解——安装、使用、搭建、IDEA集成

Git 看目录,越往后面越重要 目录一、git是什么?二、为什么要使用Git?三、版本控制工具四、git下载安装以及环境配置五、git基本命令六、git项目搭建七、远程仓库怎么搞?git,gitlab,github,gitee区别八、idea集成Git 一、Git是什…

HBase2.2.2安装(单机、伪分布)

系列文章目录 Ubuntu常见基本问题 Hadoop3.1.3安装(单机、伪分布) Hadoop集群搭建 HBase2.2.2安装(单机、伪分布) Zookeeper集群搭建 文章目录 系列文章目录前置条件一、HBase2.2.2安装二、配置环境变量1、问题 三、单机模式1、修…

浅谈数字化

一、数字化转型 数字化转型(Digital transformation)是建立在数字化转换(Digitization)、数字化升级(Digitalization)基础上,进一步触及公司核心业务,以新建一种商业模式为目标的高…

仙人掌之歌——权力的游戏(3)

像疯子一样死去 陈速没想到李通是在香山深处一所疗养院里休养,军方的岗位森严,进去还得把身份证押在门卫室。李通穿着病号服悠哉地晃过来把陈速领了进去。 “通哥,这儿真是个好地方啊。” 陈速由衷地赞叹着,望着大院里古树参天&…

九、Spring Cloud—gateway网关

一、引言 每个微服务都需和前端进行通信,解决每个微服务请求时的鉴权、限流、权限校验、跨域等逻辑,放在一个统一的地方进行使用。 在微服务架构中,网关是一个重要的组件,它作为系统的入口,负责接收所有的客户端请求…

Shiro高级及SaaS-HRM的认证授权

Shiro高级及SaaS-HRM的认证授权 Shiro在SpringBoot工程的应用 Apache Shiro是一个功能强大、灵活的,开源的安全框架。它可以干净利落地处理身份验证、授权、企业会话管理和加密。越来越多的企业使用Shiro作为项目的安全框架,保证项目的平稳运行。 在之…

前端042_图表展现_自适应

自适应 当缩小窗口时,饼图和柱状图不会自动自适应,会被遮挡住。因为 ECharts 本身并不是自适应的,当你父级容器的宽度发生变化的时候需要手动调用它的 .resize() 方法。 其中 vue-element-admin项目中已经实现了自适应效果,只要将对应代码拷贝引用即可。将 vue-element-adm…

Java中的this、package、import

this 在Java中,this的作用和其词义很接近。 它在方法内部使用,即这个方法所属对象的引用; 它在构造器内部使用,表示该构造器正在初始化的对象。 this 可以调用类的属性、方法和构造器 什么时候使用this关键字呢&#xff…

使用kettle进行日志分析

分析日志是一个大数据分析中较为常见的场景。在Unix类操作系统里,Syslog广泛被应用于系统或者应用的日志记录中。Syslog通常被记录在本地文件内,比如Ubuntu内为/var/log/syslog文件名,也可以被发送给远程Syslog服务器。Syslog日志内一般包括产…

机构的专属的线上招生 教学小程序搭建教程

小程序已经成为了很多教育机构的招生、推广重要渠道之一。相比于传统的网站或APP而言,小程序更加轻量级,更加易于传播和分享。在小程序搭建过程中,无需编写复杂的代码,只需要根据模板进行简单的操作,就可以轻松打造自己…

【Web开发技术】JWT令牌技术(信息安全)

文章目录 一、描述二、依赖三、配置四、java文件中的准备五、开始使用 一、描述 说到JWT令牌技术,就需要提到cookie和session两种技术。这两种技术在跨域问题(计算机网络的知识,百度可以搜到,就回归重点)上存在一定的局…

《智能新工厂规划白皮书》下 | “四步”规划智能工厂

中国制造业有着最大制造产能、最强配套能力和最大消费市场三个无可比拟的优势,随着产能升级,众企业的新工厂会开展智能工厂规划布局,从而实现降本减耗、提高效益的经营目标,以增强企业市场竞争力。 新工厂规划时,企业…

【GitHub已开源】某博热点事件评论数据分析与用户情感分析平台完整项目

找遍全网无奈只能自己开发某博热点评论数据爬取与用户情感分析平台,这就是技术人的创新! 最近想看一下微博热点评论的用户人群情感趋势,想到的就是去爬取某博的评论数据,然后进行一个可视化的情感分析。想想吧,这个项目…

RPC核心原理

大家好,我是易安,今天我们一起来研究下RPC的核心原理。 什么是RPC? RPC的全称是Remote Procedure Call,即远程过程调用。简单解读字面上的意思,远程肯定是指要跨机器而非本机,所以需要用到网络编程才能实现…