Redis在window下和linux下的区别

news2024/12/26 21:21:51

早期,redis只能运行在linux上,原因是底层调用的是epoll方法,而windows下没有该方法。除此之外,windows下也没有fork( )函数。最终为了强行能在windows上运行,使用的是select+ IOCP方式。

Epoll 是当事件资源满足时发出可处理通知消息;
IOCP 则是当事件完成时发出完成通知消息;
从应用程序的角度来看, Epoll 是同步非阻塞的;IOCP是异步操作;

简单来说,Epoll可以省去你等待的过程,但是不会帮你完成任务。
IOCP是在Epoll的基础上,还会帮你把任务完成,完成之后,让你过来拿结果,完全异步操作。

Windows只提供Select
Linux提供Select、Poll、Epoll

Select:

过程① 准备bitmap:先调用FD_ZERO函数,进行初始化,把一批文件描述符(一般是5个)初始化为0,然后调用FD_SET函数,循环设置(设置的数是随机,但是小于10),将bitmap上对应(需要监听的文件描述符)的置为1。

过程② 准备完毕后,将bitmap拷贝,从用户态拷贝至内核态。由内核去判断,哪个文件描述符有对应的数据到达。
比如下面,当有数据从客户端传输到网卡,发生软中断,就会调用DMA拷贝技术,拷贝到内核环形缓冲区,根据对应的文件描述符信息,拷贝到socket的数据接收队列。

 过程③:拷贝完之后,将对应的文件描述符标记成已就绪的状态,然后就会将全部文件描述符(包括未就绪的)全部返回给用户态(此时只返回了已就绪的个数,哪几个不知道)。

过程④:然后在用户态中,循环遍历出,是哪几个的文件描述符发生了变更。

完成后,阻塞解除。

 注:while(1)的右括号应该包括下面ret = select 以及for循环遍历全部过程。
accept函数是用来创建客户端连接的,并存放到fd数组中,连接到服务端。
这里有一个点,求出最大文件描述符max ,后面的max+1 ,这样不需要每次循环去多遍历那些没有用到的,节省性能。

select函数的参数:max+1 , 读文件描述符的集合,写文件描述符的集合,需要监听的异常事件文件描述符集合,超时时间(null:永不超时 ,0:不阻塞, >0 :具体阻塞的时间)

为什么要拷贝至内核态:内核态工作效率高。如果是用户态中的bitmap每有一个文件描述符有对应的数据到达,就去告诉内核态,那么就会有频繁的用户态和内核态上下文切换。

Select的不足:

fd_set每次都需要重新初始化,不能做到重用。
还是有频繁的用户态和内核态的拷贝,性能消耗大。
需要对文件描述符循环遍历,O(n)的时间复杂度。

Poll:

相比Select做了一个改进:定义了一个存放文件描述符信息的结构体,然后其中存放的事件的类型,是读事件还是写事件。然后将整个结构体数组拷贝到内核态。通过socket去监听....

当有消息从客户端发送到网卡,通过DMA拷贝技术到内核环形缓冲区。该过程和select一样。
只不过,这里是把对应的revents属性置为1。然后将整个结构体数组拷贝回用户态,去循环判断,当前的revents如果为1,则置为0。达到了结构体数组的复用,不用每次执行poll函数前去初始化

Epoll: linux2.6之后

accept函数:用来创建客户端连接,并连接到客户端,存放到epoll_event中,注册监听事件
epoll_ctl函数:注意参数,第二个是回调函数,每创建完一个socket连接后,就会把它的节点添加到红黑树中,这里涉及epitem结构体。当epitem结构体对应的文件描述符就绪的时候,通过回调函数,放进双向链表中。

每当我们调用 epoll_ctl 增加一个 fd 时,内核就会为我们创建出一个 epitem 实例,并且把这个实例作为红黑树的一个子节点,增加到 eventpoll 结构体中的红黑树中,对应的字段是 rbr。这之后,查找每一个 fd 上是否有事件发生都是通过红黑树上的 epitem 来操作。

epoll_wait函数:去检查双向链表中,检查就绪队列是否有元素,没有就将当前进程阻塞,然后让出cpu,如果有就绪事件的话,epoll_wait会立刻返回,不阻塞,会将已就绪的事件拷贝到数组中,并返回给用户态。

简述一下epoll的过程:当消息基于客户端传输到网卡,进而通过DMA拷贝技术,拷贝到内核环形缓冲区。有一个Socket消息接收队列,如果来了消息,会通过回调函数,将这条消息从内核环形缓冲区直接插入到epoll就绪队列,相比select和poll来说,不需要去遍历,时间复杂度从O( n) -> O(1)。

并且整个过程只需要传递一次文件描述符,即从用户态拷贝到内核态,后面即epoll_wait函数不需要拷贝文件描述符回用户态,而是直接通过回调函数,返回给用户态。

底层是红黑树加双向链表的结构。这样加快了每个文件描述符节点的增删改查的速度,时间复杂度从O(n) ->O (logN)。

Epoll多路复用的触发机制

redis采用的是水平触发,nginx采用的是边缘触发。

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

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

相关文章

Python编码系列—Python责任链模式:打造灵活的请求处理流程

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

“天翼云息壤杯”高校AI大赛开启:国云的一场“造林”计划

文 | 智能相对论 作者 | 叶远风 2024年年初《政府工作报告》中明确提到了“人工智能”行动,人工智能的发展被提到前所未有的高度。 如何落实AI在数字经济发展中引擎作用,是业界当下面临的课题。 9月25日,“2024年中国国际信息通信展览会”…

java中的四种引用

在java中对象的引用有强、软、弱、虚四种,这些引用级别的区别主要体现在对象的生命周期、回收时机的不同。这里在已知结论的情况下对其进行验证。 准备工作 1. 设置内存 为方便调试,将内存设置为16MB 依次点击菜单栏的Run—>Edit Configurations …

常用性能优化方法

在一个Java项目中进行性能优化是至关重要的。性能优化能够提高项目的效率和响应速度,提升用户体验,并且可以节省服务器资源和成本。 首先,性能优化可以确保项目的高效运行。当项目在运行时,性能问题可能会导致应用程序变慢、响应时…

Python集成测试详解

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 软件开发过程中,确保代码的稳定性和功能性至关重要。集成测试是一项关键步骤,旨在验证不同模块或组件能够协同工作,实现预期的…

信息安全工程师(22)密码学网络安全应用

前言 密码学在网络安全中的应用极为广泛且深入,它通过多种技术手段确保数据的机密性、完整性和真实性。 一、数据加密 对称加密: 定义:使用相同的密钥进行加密和解密的过程。特点:加密和解密速度快,适用于大数据量的加…

机器学习笔记 - week6 -(十一、机器学习系统的设计)

11.1 首先要做什么 在接下来的视频中,我将谈到机器学习系统的设计。这些视频将谈及在设计复杂的机器学习系统时,你将遇到的主要问题。同时我们会试着给出一些关于如何巧妙构建一个复杂的机器学习系统的建议。下面的课程的的数学性可能不是那么强&#xf…

一个PDF样本册免费上传网站

​随着数字化时代的到来,PDF样本册已经成为企业、个人展示产品、成果的重要载体。然而,如何高效地分享这些专业文档,让更多人了解和欣赏,成为了一个亟待解决的问题。今天让我来教你怎么制作吧 一、制作步骤 1. 注册账号&#xff…

2024京东·雪浪小镇数字科技合肥交流会

数字科技与数字经济已成为构建现代化经济体系的重要引擎。 9月22日下午,2024京东雪浪小镇数字科技合肥交流会在合肥市泓瑞金陵大酒店成功召开。本次活动由雪浪小镇未来园区与京东科技联合主办,汇聚国内数字科技行业龙头企业、雪浪小镇工业互联网重点企业以及众多高成长性创业公…

C/C++语言基础--C++运算符重载以及其重载限制

本专栏目的 更新C/C的基础语法,包括C的一些新特性 前言 通过前面几节,我们介绍了C的类与对象、构造与析构函数、拷贝、成员变量、特殊变量等相关知识,这一篇将详细介绍了C的运算符重载,我感觉这是C的一个很伟大的发明&#xff0…

[数据结构] 二叉树题目(一)

目录 一.翻转二叉树 1.1 题目 1.2 示例 1.3 分析 1.4 解决 ​编辑 二. 相同的树 2.1 题目 2.2 示例 2.3 分析 2.4 解决 三. 对称二叉树 3.1 题目 3.2 示例 3.3 分析 3.4 解决 一.翻转二叉树. - 力扣(LeetCode) 1.1 题目 1.2 示例 1.3 分…

猫头虎 分享已解决Bug: || Module not found: Can‘t resolve ‘react‘ 解决方案

🐯猫头虎 分享已解决Bug: || Module not found: Cant resolve react 解决方案 摘要: 今天猫头虎带大家解决一个常见的前端问题,尤其是在 React 项目中,很多开发者在安装依赖包时,遇到过 Module not found: Cant resol…

基于大数据技术的颈椎病预防交流与数据分析及可视化系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…

Mybatis详细教程 (万字详解)

Mybatis 3.5.14 来自于B站‘天气预报’,一名宝藏up,跟着他可以培养起独立解决编程问题的能力!!! 01.简介 1.1 官网 官方中文网: MyBatis中文网 中文网参考手册 1.2 概念 MyBatis 是一款优秀的持久层框架,支持自定义 SQL, 存储过…

《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch9 策略梯度方法 9.3.2 无折扣情形下的梯度推导

v3 链接 9.3.2 无折扣情形下的梯度推导 平均奖励 r ˉ π \bar r_\pi rˉπ​ 的定义对折扣和无折扣情况都有效。在折扣情况下的梯度是一个近似值,它在无折扣情况下的梯度更优雅。 因为 无折扣奖励和 E [ R t 1 R t 2 R t 3 ⋯ ∣ S t s ] {\mathbb E}[…

常见框架漏洞复现

1、Thinkphp5x远程命令执行及getshell 1、环境配置 靶场:vulhub/thinkphp/5-rce docker-compose up -d 2、漏洞利用 漏洞根本源于 thinkphp/library/think/Request.php 中method方法可以进行变量覆盖,通过覆盖类的核心属性filter导致rce,其攻击点较为…

C++的vector优化

1、C中的动态数组一般是特指vector类 2、vector需要优化的原因之一是当我们push_back元素到数组中时,如果原来分配给动态数组的内存不够用了,那么就会找一块更大的内存空间分配给数组,把旧的内容复制到新的内存中去,这就是导致程…

过流会导致并联电容损坏吗

在电子元器件领域,电容作为重要的储能元件,广泛应用于电路滤波、耦合、解耦等多种场合。然而,当电流超过其额定容量时,过流现象可能对电容造成严重的损坏,特别是在并联电容的应用场景下。这是什么原因呢?一…

考研数据结构——C语言实现归并排序

包含头文件:程序首先包含了标准输入输出库stdio.h,以便使用printf等函数进行输入输出操作。 定义数组和数组大小:定义了一个宏N,其值为5,表示数组q的长度。数组q被初始化为{5, 3, 8, 4, 2},这是我们要排序…

高性能计算应用优化实践之WRF

WRF(Weather Research Forecast)模式是由美国国家大气研究中心(NCAR)、国家环境预报中心(NCEP)等机构自1997年起联合开发的新一代高分辨率中尺度天气研究预报模式,重点解决分辨率为1&#xff5e…