Redis-网络模型

参考资料 :极客时间 Redis(亚风)

前置知识

系统隔离
为了避免⽤户应⽤导致冲突甚⾄内核崩溃,⽤户应⽤与内核是分离的:
进程的寻址空间会划分为两部分:内核空间、⽤户空间
• ⽤户空间只能执⾏受限的命令(Ring3),⽽且不能直接调⽤系统资源,必
须通过内核提供的接⼝来访问
• 内核空间可以执⾏特权命令(Ring0),调⽤⼀切系统资源

在这里插入图片描述
缓冲区
Linux系统为了提⾼IO效率,会在⽤户空间和内核空间都加⼊缓冲区:
• 写数据时,要把⽤户缓冲数据拷⻉到内核缓冲区,然后写⼊设备
• 读数据时,要从设备读取数据到内核缓冲区,然后拷⻉到⽤户缓冲区
在这里插入图片描述
这里的数据交互采用不同的模型就会有不同的性能,因而也诞生了一些网络IO模型。

IO模型

阻塞IO

在这里插入图片描述

非阻塞IO

在这里插入图片描述

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

IO多路复用
文件表述符的概念

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

区间听FD有三种实现方式

1 select
Sekect的结构

typedef struct {// ⻓度为 1024/32 = 32// 共1024个bit位,每个bit位代表⼀个fd,0代表未就绪,1代表就绪int fds_bits[__FD_SETSIZE / __NFDBITS]} fd_set;
// select函数,⽤于监听多个fd的集合
int select(
int nfds,//要监视的fd_set的最⼤fd + 1
fd_set *readfds, //要监听读事件的fd集合
fd_set *writefds, // 要监听写事件的fd集合
fd_set *exceptfds,// 要监听异常事件的fd集合
//超时时间,null-永不超时;0-不阻塞等待;⼤于0-固定等待时间
struct timeval *timeout);

在这里插入图片描述
select模式存在的问题:
• 需要将整个fd_set从⽤户空间拷⻉到内核空间,select结束还要再次拷⻉回⽤户空间
• select⽆法得知具体是哪个fd就绪,需要遍历整个fd_set
• fd_set监听的fd数量不能超过1024(因为32个int,每个int 4 * 8 32 位)总共1024位。
2 poll

#define POLLIN //可读事件
#define POLLOUT //可写事件
#define POLLERR //错误事件
// pollfd结构
struct pollfd {int fd; //要监听的fdshort int events;/*要监听的事件类型:读、写、异常*/short int revents;/* 实际发⽣的事件类型*/
}// poll函数
int poll(
struct pollfd *fds,// pollfd数组,可以⾃定义⼤⼩
nfds_t nfds, //数组元素个数
int timeout) // 超时时间

1 ) 创建pollfd数组,向其中添加关注的fd信息
2 )调⽤poll函数,将pollfd数组拷⻉到内核空间,转链表存储(内核要求转换为链表)
3 )内核遍历fd,判断是否就绪
4 )数据就绪或超时后,拷⻉pollfd数组到⽤户空间,返回就绪fd数量n
5 )判断n是否⼤于0,⼤于0则遍历pollfd数组,找到就绪的fd

与select对⽐:

整体过程和Select大同小异。结构优化了一些,但是还是需要遍历fd_set.

select模式中的fd_set⼤⼩固定为1024,⽽pollfd⽆上限,监听FD越多,每次遍历消耗时间也越久,性能反⽽会下降。

3 epoll

struct eventpoll {struct rb_root rbr;//红⿊树,记录要监听的FDstruct list_head rdlist;// 链表,记录就绪的FD}//1.会在内核创建eventpoll结构体,返回对应的句柄epfdint epoll_create(int size)//2.将⼀个FD添加到epoll的红⿊树中,并设置ep_poll_callback// callback触发时,就把对应的FD加⼊到rdlist这个就绪列表中int epoll_ctl(int epfd, // epoll实例的句柄int op, //要执⾏的操作,包括:ADD、 MOD、 DELint fd,//要监听的FDstruct epoll_event *event // 要监听的事件类型:读、写、异常等)//3.循环检查rdlist列表是否为空,不为空则返回就绪的FD的数量int epoll_wait(int epfd,struct epoll_event *events, //event数组,⽤于接收就绪的FD 属于用户空间int maxevents, // events数组的最⼤⻓度int timeout //超时时间,-1不超时;0不阻塞;⼤于0为阻塞时间);)

在这里插入图片描述
具体流程:
在这里插入图片描述

三种模式的对比:
select模式存在的三个问题:

• 能监听的FD最⼤不超过1024

• 每次select都需要把所有要监听的FD都拷⻉到内核

• 每次都要遍历所有FD来判断就绪状态

poll模式的问题:

• poll利⽤链表解决了select中监听FD上限的问题,但依然要遍历所有FD,如

果监听较多,性能会下降

epoll模式中如何解决这些问题的?

• 基于epoll实例中的红⿊树保存要监听的FD,增删改查效率⾮常⾼

• 每个FD只需要执⾏⼀次epollctl添加到红⿊树,⽆需重复拷⻉FD到内核空间

• 内核会将就绪的FD直接拷⻉到⽤户空间的指定位置,⽤户进程⽆需遍历所有FD就能知道就绪的FD是谁当FD有数据可读时,我们调⽤epollwait就可以得到通知。但是事件通知的模式

有两种:

LevelTriggered:简称LT。当FD有数据可读时,会重复通知多次,直⾄数据处理完成。是Epoll的默认模式。

EdgeTriggered:简称ET。当FD有数据可读时,只会被通知⼀次,不管数据是否处理完成。

ET模式避免了LT模式可能出现的惊群现象(就比如有多个进程监听了FD,这个FD一旦通知就会唤醒所有的进程,但是实际只需要一个进程来处理。)

ET模式最好结合⾮阻塞IO读取FD数据,相⽐LT会复杂。

信号驱动IO

信号驱动IO是与内核建⽴SIGIO的信号关联并设置回调,当內核有FD就绪时,会发出SIGIO信号通知⽤户,期间⽤户应⽤可以执⾏其它业务,⽆需阻塞等待。
在这里插入图片描述

存在的问题:当有⼤量lO操作时,信号较多,SIGlO处理函数不能及时处理可能导致信号队列溢出,⽽且内核空间与⽤户空间的频繁信号交互性能也较低。

AIO(异步IO)

AIO的整个过程都是⾮阻塞的,⽤户进程调⽤完异步API后就可以去做其它事情,内核等待数据就绪并拷⻉到⽤户空间后才会递交信号,通知⽤户进程。
在这里插入图片描述
IO操作是同步还是异步,关键看数据在内核空间与⽤户空间的拷⻉过程(数据读写的IO操作)
在这里插入图片描述

总结在Redis里面采用了IO多路复用,具体是epoll这种模式来实现。后面的信号IO 和 AIO虽然比较理想,但是目前使用起来还有一些问题。
在这里插入图片描述

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

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

相关文章

Linux笔记---系统信息

🍎个人博客:个人主页 🏆个人专栏:Linux学习 ⛳️ 功不唐捐,玉汝于成 目录 前言 命令 1. uname - 显示系统信息 2. hostname - 显示或设置系统主机名 3. top - 显示系统资源使用情况 4. df - 显示磁盘空间使用情…

【2023 英特尔On技术创新大会直播 |我与英特尔的初次相遇】—— AIPC探索下一代的物联网时代

🌈个人主页: Aileen_0v0 🔥系列专栏:英特尔技术学习专栏 💫个人格言:"没有罗马,那就自己创造罗马~" 目录 硅谷经济的发展与挑战 Intel开发者云与AI技术的应用 AI压缩技术的发展与应用 英特尔与阿里巴巴在AI领域的合作 AIPC时代的…

【已解决】解决Springboot项目访问本地图片等静态资源无法访问的问题

今天在开发一个招聘系统的时候,有投递简历功能,有投递就会有随之而来的查看简历对吧,我投递过的简历,另存为一个文件夹,就是说本地磁盘(或者服务器)有一个专门存放投递过的简历的文件夹,用于存放PDF&#x…

重新配置torch1.8 cuda11.1 torchtext0.9.0虚拟Pytorch开发环境

这里写目录标题 起因发现选择安装cuda 11.1核对下自己的显卡是否支持下载该版本的CUDACUDA下载地址CUDA安装过程 在anaconda中创建一个虚拟环境1.以下是环境的配置过程2.查看虚拟环境列表3.激活虚拟环境 安装torch和torchtext包的过程1.输入下面这句代码,就可以直接…

韩语中的一次多用-柯桥基础韩语学习

1.动词,写 일기를 쓰다 写日记 2.动词,戴(帽子,眼镜,口罩) 안경을 쓰다 戴眼镜 3.动词,使用(材料,道具,手段) 세제를 쓰다 使用洗剂 4.动词&am…

大创项目推荐 深度学习 大数据 股票预测系统 - python lstm

文章目录 0 前言1 课题意义1.1 股票预测主流方法 2 什么是LSTM2.1 循环神经网络2.1 LSTM诞生 2 如何用LSTM做股票预测2.1 算法构建流程2.2 部分代码 3 实现效果3.1 数据3.2 预测结果项目运行展示开发环境数据获取 最后 0 前言 🔥 优质竞赛项目系列,今天…

Ethernet/IP 之IO 连接简要记录

IO连接 EIP的IO连接提供了在一个生产者和多个消费者之间的特定的通信路径,以达到IO数据在IO连接下传输。 生产者对象产生IO数据通过生产者IO连接管理者对象将连接ID和数据组帧发送给消费者IO连接管理者对象然后将IO数据发送给消费者对象。 显示消息连接 显式消息传…

《信息安全工程师教材》-蒋建春、信息安全完全参考手册-Mark Rhodes Ousley、CISSP官方学习指南第九版、ISO27002学习

文章目录 介绍关系学习顺序重复内容学习方法建议学习时间可能重合的部分更详细的学习计划 介绍 《信息安全工程师教材》- 蒋建春:这本教材可能是针对中国地区信息安全工程师的认证考试而编写的,它可能会涵盖信息安全的基本概念、技术和政策,特…

【点选验证码识别】某招标网站反爬虫分析与验证码自动识别

文章目录 1. 写在前面2. 风控描述3. 验证码裁剪4. 验证码识别 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】:对JS逆向感兴趣…

winlator模拟器汉化版是款功能非常强大的安卓游戏模拟器。

winlator模拟器 可以支持玩家在手机上运行各种经典游戏,拥有强大的兼容性,不同芯片、系统和手机都可以完美的运行。进入软件后,可以对显卡配置等进行改变,有利于帮助运行较新的游戏,同时也能够跳过配置检查。相比于其…

ssm基于javaweb的疫情管理系统的设计与实现+vue论文

摘 要 针对于疫情信息管理方面的不规范,容错率低,管理人员处理数据费工费时,采用新开发的疫情管理系统可以从根源上规范整个数据处理流程的正规性和合法性。 疫情管理系统实现的功能包括健康打卡管理,返校申请管理,留…

【Vulnhub 靶场】【DarkHole: 1】【简单】【20210730】

1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/darkhole-1,724/ 靶场下载:https://download.vulnhub.com/darkhole/DarkHole.zip 靶场难度:简单 发布日期:2021年07月18日 文件大小:2.9 GB 靶场作者&#xff1a…

新手一键重装系统Win11详细教程

Win11系统如果出现了重大问题,无法通过简单的操作解决,那么我们就可以直接选择重新安装正常的操作系统。作为新手用户,对于装机过程不是很了解,那么可以参考下面小编分享的一键重新安装系统Win11的详细教程步骤,轻轻松…

第80讲:GTID全局事务标识符的基本概念以及在Binlog中应用GTID

文章目录 1.GTID的基本概念1.1.为什么要引入GTID1.2.什么是GTID 2.开启GTID全局事务标识符的功能3.模拟产生Binlog日志观察开启GTID功能的区别3.1.模拟产生Binlog日志3.2.观察Binlog日志中的事件信息3.2.观察节点状态有什么变化3.3.观察Binlog日志会有什么变化 4.使用GTID来截取…

HuggingFace下载模型

目录 方式一:网页下载 方式二:Git下载 方式一:网页下载 方式二:Git下载 有些模型的使用方法页面会写git clone的地址,有些没写,直接复制网页地址即可 网页地址: ​https://huggingface.co/…

【matlab】绘制横状双组渐变柱状图

【matlab】绘制横状双组渐变柱状图

阿里云登录镜像仓库报错: Error response from daemon: Get https://

阿里云登录镜像仓库报错: Error response from daemon: Get https:// 1. 故障现象 开发反应自用笔记本连接镜像仓库是正常的,但通过服务器连接镜像仓库一直失败. 报错信息如下: Error response from daemon: Get https://registry.cn-hangzhou.aliyuncs.com/v2/: unauthoriz…

关于“Python”的核心知识点整理大全33

目录 12.8.3 将子弹存储到编组中 alien_invasion.py 注意 12.8.4 开火 game_functions.py 12.8.5 删除已消失的子弹 alien_invasion.py 12.8.6 限制子弹数量 settings.py game_functions.py 12.8.7 创建函数 update_bullets() game_functions.py alien_invasion.py…

ssm445基于SSM的学生宿舍管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本学生宿舍管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息…

转行小白历险记-2023.12.19 如何解决跨域问题

讨厌突如其来的破坏计划的感觉&#xff0c;真的好烦 一、跨域以及如何解决跨域问题(反向代理) 跨域 同源&#xff1a;协议、端口、域名相同 如何解决跨域问题 jsonp:<script> 不受同源策略限制跨源域资源共享 CORS:允许 Web 应用服务器进行跨源访问控制使不同的源变成同…