Redis复习-网络模型

news/2025/2/27 11:48:26/文章来源:https://www.cnblogs.com/Helix6/p/18740660

用户空间和内核空间

任何Linux发行版,其系统内核都是Linux。我们的应用都需要通过Linux内核与硬件交互。

为了避免用户应用导致冲突甚至内核崩溃,用户应用与内核是分离的:
1.进程的寻址空间会划分为两部分:内核空间、用户空间
2.用户空间只能执行受限的命令(Ring3),而且不能直接调用系统资源,必须通过内核提供的接口来访问
3.内核空间可以执行特权命令(Ring0),调用一切系统资源

Linux系统为了提高IO效率,会在用户空间和内核空间都加入缓冲区:
1.写数据时,要把用户缓冲数据拷贝到内核缓冲区,然后写入设备
2.读数据时,要从设备读取数据到内核缓冲区,然后拷贝到用户缓冲区

阻塞IO

在《UNIX网络编程》一书中,总结归纳了5种IO模型:
1.阻塞IO(Blocking IO)
2.非阻塞IO(Nonblocking IO)
3.IO多路复用(IO Multiplexing)
4.信号驱动IO(Signal Driven IO)
5.异步IO(Asynchronous IO)

顾名思义,阻塞IO就是两个阶段都必须阻塞等待:
阶段一:
1.用户进程尝试读取数据(比如网卡数据)
2.此时数据尚未到达,内核需要等待数据
3.此时用户进程也处于阻塞状态

阶段二:
1.数据到达并拷贝到内核缓冲区,代表已就绪
2.将内核数据拷贝到用户缓冲区
3.拷贝过程中,用户进程依然阻塞等待
4.拷贝完成,用户进程解除阻塞,处理数据

可以看到,阻塞IO模型中,用户进程在两个阶段都是阻塞状态。

非阻塞IO

顾名思义,非阻塞IO的recvfrom操作会立即返回结果而不是阻塞用户进程。
阶段一:
1.用户进程尝试读取数据(比如网卡数据)
2.此时数据尚未到达,内核需要等待数据
3.返回异常给用户进程
4.用户进程拿到error后,再次尝试读取
5.循环往复,直到数据就绪

阶段二:
1.将内核数据拷贝到用户缓冲区
2.拷贝过程中,用户进程依然阻塞等待
3.拷贝完成,用户进程解除阻塞,处理数据

可以看到,非阻塞IO模型中,用户进程在第一个阶段是非阻塞,第二个阶段是阻塞状态。虽然是非阻塞,但性能并没有得到提高。而且忙等机制会导致CPU空转,CPU使用率暴增。

IO多路复用

无论是阻塞IO还是非阻塞IO,用户应用在一阶段都需要调用recvfrom来获取数据,差别在于无数据时的处理方案:
如果调用recvfrom时,恰好没有数据,阻塞IO会使CPU阻塞,非阻塞IO使CPU空转,都不能充分发挥CPU的作用。
如果调用recvfrom时,恰好数据,则用户进程可以直接进入第二阶段,读取并处理数据

而在单线程情况下,只能依次处理IO事件,如果正在处理的IO事件恰好未就绪(数据不可读或不可写),线程就会被阻塞,所有IO事件都必须等待,性能自然会很差。
就比如服务员给顾客点餐,分两步:
1.顾客思考要吃什么(等待数据就绪)
2.顾客想好了,开始点餐(读取数据)

要提高效率有几种办法?
-方案一:增加更多服务员(多线程)
-方案二:不排队,谁想好了吃什么(数据就绪了),服务员就给谁点餐(用户应用就去读取数据)

那么问题来了:用户进程如何知道内核中数据是否就绪呢?

文件描述符(File Descriptor):简称FD,是一个从0 开始的无符号整数,用来关联Linux中的一个文件。在Linux中,一切皆文件,例如常规文件、视频、硬件设备等,当然也包括网络套接字(Socket)。
IO多路复用:是利用单个线程来同时监听多个FD,并在某个FD可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。

阶段一:

1.用户进程调用select,指定要监听的FD集合
2.内核监听FD对应的多个socket
3.任意一个或多个socket数据就绪则返回readable
4.此过程中用户进程阻塞

阶段二:
1.用户进程找到就绪的socket
2.依次调用recvfrom读取数据
3.内核将数据拷贝到用户空间
4.用户进程处理数据

IO多路复用是利用单个线程来同时监听多个FD,并在某个FD可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。不过监听FD的方式、通知的方式又有多种实现,常见的有:
1.select
2.poll
3.epoll

差异:
1.select和poll只会通知用户进程有FD就绪,但不确定具体是哪个FD,需要用户进程逐个遍历FD来确认
2.epoll则会在通知用户进程FD就绪的同时,把已就绪的FD写入用户空间

信号驱动IO

异步IO

Redis网络模型

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

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

相关文章

2026-02-27 把本地项目添加到新建的git仓库

一:检查本地项目中是否存在git仓库git status 没有,好!进入第二步👇(有?直接git add git commit -m xxx git push,聊天end) 二:初始化仓库git init 三:创建一个远程仓库地址(如有可略) 四:关联远程仓库git remote add origin 远程仓库 五:推送git push一般直接执…

No.21 CSS--弹性盒子模型(flex box)

一、定义弹性盒子是 CSS3 的一种新的布局模式。 CSS3 弹性盒是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。 引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列、对齐和分配空白空间。二、CSS3弹性盒内容…

从零开始的云上建筑师速成班:用ROS架构编辑器搭个服务器小屋

云上建筑师速成秘籍:用阿里云ROS架构编辑器像搭乐高一样玩转服务器!零代码拖拽资源+配置指南,从部署到拆家一条龙服务~前情提要:你的云上建筑师执照 想成为云架构师?不需要考清华MIT,只需要: ✅ 一个阿里云账号(注册地址已备好,请自取) ✅ 完成实名认证(就像进游乐园…

第02章 JDBC的新增修改删除

JDBC编程六步 JDBC编程的步骤是很固定的,通常包含以下六步:第一步:注册驱动作用一:将 JDBC 驱动程序从硬盘上的文件系统中加载到内存中。 作用二:使得 DriverManager 可以通过一个统一的接口来管理该驱动程序的所有连接操作。第二步:获取数据库连接获取java.sql.Connecti…

第01章 JDBC概述

什么是JDBC JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。‍ JDBC原理 早期SUN公司的天才们想编写一套可以连接天下所有数据库的AP…

数组模拟单链表

题目代码 #include <iostream> #include <algorithm> #include <cstring> using namespace std; const int N = 100010; int head, idx, e[N], ne[N]; // 两个值,两个数组// head:第一个节点的下标(表示头结点的下标) // idx:已经存储了几个数(到了第几个数…

ES-8.17.2版本集群搭建

前提工作准备  Linux 3台 16GB运行内存 8核 50GB磁盘  JDK17 环境配置  elasticsearch-8.17.2-linux-x86_64.tar.gz 安装包2.集群规划  在 ES 集群中,不同节点可承担不同角色: **主节点(Master Node)**:负责集群管理、节点选举、索引元数据管理。建议至少配置 3 个…

第9章 shell编程

Linux系统结构 Linux操作系统是一种开放源代码的类UNIX操作系统,它的结构分为内核、Shell和应用程序三个层次。内核层内核是Linux系统的核心部分,它负责管理系统各种硬件设备、文件系统、内存管理和进程管理等核心任务。Linux内核设计了良好的模块化结构,可以动态地加载和卸…

第2章 磁盘与文件管理

磁盘管理 windows和Linux磁盘管理的区别 windows资源管理方式系统一般安装在C盘 C盘下的"Windows"目录是操作系统的核心 C盘下的"Program Files"目录下安装软件 C盘下的"用户"目录是所有的用户,包括超级管理员也在其中 windows操作系统分为C盘、…

第3章 系统命令

系统当前时间 date命令:切换用户 su 用户名sudo 命令:表示使用超级管理员身份执行该命令,如果你当前不是管理员,希望以管理员身份执行某个命令时,使用sudo,需要输入超级管理员的密码: ​​ echo命令 输出字符串 echo "Hello, world!"这将会输出 Hello, world!…

https://avoid.overfit.cn/post/bad10ed894bd43c086e3ef9de7478bea

特征选择作为机器学习工作流程中的关键环节,对模型性能具有决定性影响。Featurewiz是一个功能强大的特征选择库,具备以下核心能力:高度自动化的特征选择,仅需少量代码即可完成。 全面的特征工程功能,不仅能够选择特征,还能生成数百个衍生特征并自动筛选最优特征组合。 实…

Redis复习-五种数据类型

String String是Redis中最常见的数据存储类型: 1.其基本编码方式是RAW,基于简单动态字符串(SDS)实现,存储上限为512mb。 2.如果存储的SDS长度小于44字节,则会采用EMBSTR编码,此时object head与SDS是一段连续空间。申请内存时只需要调用一次内存分配函数,效率更高。 3.如…