浅谈虚拟内存(操作系统、Redis)

浅谈虚拟内存(操作系统、Redis)

参考&鸣谢

4.1 为什么要有虚拟内存? xiaolincoding

【简单说下】REDIS的虚拟内存机制,会吗?别翻书 aristo_boyunv

Redis 虚拟内存 Java杨永杰

浅谈虚拟内存:操作系统与 Redis

在计算机系统中,内存管理是影响性能和资源利用的关键环节,而虚拟内存技术在其中扮演了核心角色。虚拟内存不仅被操作系统广泛使用,Redis 这样的高性能内存数据库也在一定程度上应用了虚拟内存概念。下面我讲分别介绍操作系统中的虚拟内存机制,以及 Redis 中如何借鉴类似的内存管理思路,并探讨两者的区别。

一、操作系统中的虚拟内存

1. 什么是虚拟内存?

虚拟内存(Virtual Memory)是操作系统的一种内存管理技术,它允许程序运行时使用比物理内存更大的地址空间。通过虚拟内存,操作系统能够提供一种“虚拟”内存的抽象层,使得每个进程可以使用一个连续的地址空间,而不必关心实际物理内存的布局。虚拟内存的主要目的包括:

  • 扩展内存:程序可以运行在比物理内存大的虚拟地址空间中。
  • 内存隔离:不同进程之间的地址空间互不干扰,提升系统安全性和稳定性。
  • 内存管理:通过分页机制,优化物理内存的使用效率,减少碎片。
2. 虚拟内存的工作原理

虚拟内存的核心思想是将物理内存和外部存储(如硬盘)结合起来。操作系统会将虚拟内存划分为页面(Page),每个页面对应一个固定大小的内存块。当程序访问一个页面时,操作系统通过页表(Page Table)将虚拟地址映射到物理地址。如果该页面不在物理内存中,则会触发页面置换(Page Swap)机制,将未使用的页面从内存中换出,加载所需的页面。

虚拟内存的关键特性包括:

  • 分页和分段:虚拟内存通过分页或分段机制,将虚拟地址划分为固定大小的页面或段。分页更加常见,它使得内存管理更加灵活和高效。
  • 页表和 TLB:操作系统通过页表记录虚拟地址到物理地址的映射,而 TLB(Translation Lookaside Buffer)则用于加速虚拟地址的翻译,减少查表带来的性能损耗。
  • 页面置换算法:当物理内存不足时,操作系统需要将某些页面从内存中换出到磁盘。常用的页面置换算法包括 LRU(最近最少使用)、FIFO(先进先出)等。
3. 虚拟内存的优点
  • 扩展内存容量:虚拟内存允许操作系统通过硬盘等外部存储设备扩展内存,支持更大的程序运行。
  • 程序隔离:每个进程有独立的虚拟地址空间,互不干扰,提升了系统的安全性和稳定性。
  • 提高内存利用率:虚拟内存使得系统可以根据程序的需求灵活分配物理内存,减少内存浪费。
4. 虚拟内存的缺点
  • 性能损耗:虚拟内存需要频繁地进行地址翻译、页面置换等操作,尤其在页表和 TLB 未命中时,可能会导致性能下降。
  • I/O 瓶颈:页面置换涉及磁盘 I/O,过度的页面置换(页面抖动)可能导致系统性能显著下降。

二、Redis 中的内存管理和虚拟内存机制

1. Redis 的内存模型

Redis 是一个基于内存的数据存储系统,通常将数据全部存放在内存中,以确保高效的读写性能。由于内存的高速访问特性,Redis 在处理高并发和低延迟需求的应用中表现出色。然而,Redis 也面临着内存有限的问题,当数据量过大时,无法完全存放于物理内存中。

Redis 曾在早期版本(2.4 之前)引入了一种类似虚拟内存的机制,称为Redis 虚拟内存(Redis Virtual Memory)。它将部分不常用的数据存储到磁盘中,而将常用的数据保存在内存中,以解决内存不足的问题。

2. Redis 虚拟内存的工作原理

Redis 的虚拟内存机制类似于操作系统的虚拟内存。它会将较大的键或较少使用的键值对从内存中移出,存放到磁盘上。Redis 虚拟内存的关键机制包括:

  • 数据分页:将数据划分为固定大小的页面,并将页面存储到磁盘。
  • LRU 置换算法:Redis 使用 LRU(最近最少使用)算法来决定哪些数据应当从内存中换出到磁盘。当访问某个页面时,Redis 会将其从磁盘加载回内存。
  • 异步 I/O 操作:为避免频繁的阻塞操作,Redis 的虚拟内存采用异步的方式将数据写入磁盘或从磁盘读取。
3. Redis 虚拟内存的缺点

尽管虚拟内存在理论上可以解决 Redis 的内存瓶颈问题,但它在实践中并没有达到预期的效果:

  • 性能问题:由于 Redis 频繁进行磁盘 I/O 操作,虚拟内存会导致访问较慢的键时性能大幅下降。Redis 的高性能基于内存访问,一旦涉及磁盘,性能会受到显著影响。
  • 复杂度:虚拟内存的管理增加了系统的复杂性,尤其是在 Redis 处理大量小对象时,内存分页和页面置换可能带来额外的开销。

因此,从 Redis 2.4 开始,官方逐步废弃了虚拟内存机制,转而推荐通过 内存淘汰策略集群扩展 来解决内存不足的问题。

4. Redis 现代的内存管理策略

Redis 放弃虚拟内存后,采取了其他策略来优化内存使用:

  • 内存淘汰机制(Eviction Policy):当内存不足时,Redis 可以通过内存淘汰策略清理不需要的数据。例如,allkeys-lru 策略会将最近最少使用的数据淘汰,释放内存。
  • 压缩内存结构:Redis 对某些数据结构(如哈希表、列表)进行了优化,使用了压缩数据结构(Ziplist、Intset)来节省内存。
  • 持久化方案:Redis 支持 RDB(快照)和 AOF(日志)两种持久化机制,将

数据存储在磁盘上,保障数据的可靠性。在 Redis 运行过程中,数据全部存储于内存中,而持久化的方式则确保系统重启后数据不会丢失。

5. Redis 与操作系统虚拟内存的区别

尽管 Redis 早期的虚拟内存机制与操作系统的虚拟内存有类似之处,但它们在本质上有很多不同:

  • 设计目标:操作系统的虚拟内存旨在让应用程序在有限的物理内存上运行更大的程序,而 Redis 的虚拟内存机制是为了在有限内存中处理更大数据集。Redis 的虚拟内存设计初衷是为了保持高性能,而操作系统虚拟内存更多考虑内存扩展。

  • 实现方式:操作系统的虚拟内存通过硬件支持的页表、TLB 和页面置换算法等机制高效管理地址空间,而 Redis 则通过其内部的逻辑层实现数据的分页与异步加载。

  • 数据访问:操作系统虚拟内存隐藏了物理内存与虚拟内存之间的差异,对于应用程序透明处理。而 Redis 虚拟内存机制在涉及磁盘 I/O 时,会显著影响性能,数据访问速度远远低于操作系统的虚拟内存。

  • 废弃原因:Redis 虚拟内存因性能问题而被弃用,而操作系统的虚拟内存是计算机系统不可或缺的一部分,被广泛应用于各类程序中。

三、总结

虚拟内存是操作系统中极为重要的技术,它通过分页、分段、页表等机制高效地管理内存,扩展了物理内存的能力,并提升了内存利用率和程序的运行安全性。而 Redis 早期也曾引入类似的虚拟内存机制,尝试通过将数据部分存储在磁盘中来解决内存不足的问题,但由于性能下降等原因最终放弃了这种设计。

目前,Redis 依赖内存淘汰策略和持久化机制来优化内存使用,而操作系统的虚拟内存仍然是主流内存管理方式。两者的不同之处在于,操作系统的虚拟内存对于应用程序透明且高度优化,而 Redis 的虚拟内存机制则由于对高性能的要求,无法与操作系统的通用虚拟内存相提并论。

对于开发者而言,理解虚拟内存的原理以及 Redis 内存管理的策略,能够帮助在设计高效系统时更好地管理内存资源,从而提升程序的性能和稳定性。

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

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

相关文章

ARM单片机的内存分布(重要)

ARM单片机的内存分布(重要) 一、S32K344的内存布局 MEMORY {int_pflash : ORIGIN 0x00400000, LENGTH 0x003D4000 /* 4096KB - 176KB (sBAF HSE)*/int_dflash : ORIGIN 0x10000000, LENGTH 0x00020000 /* 128KB …

BUUCTF [SCTF2019]电单车详解两种方法(python实现绝对原创)

使用audacity打开,发现是一段PT2242 信号 PT2242信号 有长有短,短的为0,长的为1化出来 这应该是截获电动车钥匙发射出的锁车信号 0 01110100101010100110 0010 0前四位为同步码0 。。。中间这20位为01110100101010100110为地址码0010为功…

不靠学历,不拼年资,怎么才能月入2W?

之前统计局发布了《2023年城镇单位就业人员年平均工资情况》,2023年全国城镇非私营单位和私营单位就业人员年平均工资分别为120698元和68340元。也就是说在去年非私营单位就业人员平均月薪1W,而私营单位就业人员平均月薪只有5.7K左右。 图源:…

两数之和、三数之和、四数之和

目录 两数之和 题目链接 题目描述 思路分析 代码实现 三数之和 题目链接 题目描述 思路分析 代码实现 四数之和 题目链接 题目描述 思路分析 代码实现 两数之和 题目链接 LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode) 题目…

EfficientFormer实战:使用EfficientFormerV2实现图像分类任务(一)

摘要 EfficientFormerV2是一种通过重新思考ViT设计选择和引入细粒度联合搜索策略而开发出的新型移动视觉骨干网络。它结合了卷积和变换器的优势,通过一系列高效的设计改进和搜索方法,实现了在移动设备上既轻又快且保持高性能的目标。这一成果为在资源受…

Redis-01 入门和十大数据类型

Redis支持两种持久化方式:RDB持久化和AOF持久化。 1.RDB持久化是将Redis的数据以快照的形式保存在磁盘上,可以手动触发或通过配置文件设置定时触发。RDB保存的是Redis在某个时间点上的数据快照,可以通过恢复RDB文件来恢复数据。 2.AOF持久化…

力扣P1706全排列问题 很好的引入暴力 递归 回溯 dfs

代码思路是受一个洛谷题解里面大佬的启发。应该算是一个dfs和回溯的入门题目&#xff0c;很好的入门题目了下面我会先给我原题解思路我想可以很快了解这个思路。下面是我自己根据力扣大佬写的。 我会进行详细讲解并配上图辅助理解大家请往下看 #include<iostream> #inc…

初始MYSQL数据库(7)—— 视图

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; MYSQL 引言 前面我们学习MySQL数据库时&#xff0c;创建表之后&#xff0c;会在表中插入数据&#xff0c;在需要的时候&#xff0c;也会进行…

python文字转wav音频

借鉴博客 一.前期准备 1. pip install baidu-aip 2. pip install pydub 3. sudo apt-get install ffmpeg 二.代码 from aip import AipSpeech from pydub import AudioSegment import time#input your own APP_ID/API_KEY/SECRET_KEY APP_ID 14891501 API_KEY EIm2iXtvD…

示例:WPF中Grid显示网格线的几种方式

一、目的&#xff1a;介绍一下WPF中Grid显示网格线的几种方式 二、几种方式 1、重写OnRender绘制网格线&#xff08;推荐&#xff09; 效果如下&#xff1a; 实现方式如下&#xff1a; public class LineGrid : Grid{private readonly Pen _pen;public LineGrid(){_pen new P…

【Linux】深度解析与实战应用:GCC/G++编译器入门指南

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…

RabbitMQ08_保证消息可靠性

保证消息可靠性 一、生产者可靠性1、生产者重连机制&#xff08;防止网络波动&#xff09;2、生产者确认机制Publisher Return 确认机制Publisher Confirm 确认机制 二、MQ 可靠性1、数据持久化交换机、队列持久化消息持久化 2、Lazy Queue 惰性队列 三、消费者可靠性1、消费者…

速通LLaMA3:《The Llama 3 Herd of Models》全文解读

文章目录 概览论文开篇IntroductionGeneral OverviewPre-TrainingPre-Training DataModel ArchitectureInfrastructure, Scaling, and EfficiencyTraining Recipe Post-TrainingResultsVision ExperimentsSpeech Experiments⭐Related WorkConclusionLlama 3 模型中的数学原理1…

细说硫酸钙防静电地板的材质结构和优势特点

防静电地板有全钢基材的、硫酸钙基材的、铝合金基材的&#xff0c;在一些防静电要求、承载要求、铺设要求、铺装效果要求很高的场合&#xff0c;如银行、电信机房、移动机房、智能化办公室、部队指挥中心&#xff0c;通常都会使用硫酸钙防静电地板。那么什么是硫酸钙防静电地板…

计算机毕业设计 二手图书交易系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

计算机毕业设计 基于Python的医疗预约与诊断系统 Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

arthas-阿里远程诊断工具神器一定要掌握

文章目录 1. 背景介绍2. 安装下载3. 常用命令4. 常见案例4.1 案例一&#xff1a;使用logger 实时修改某个类的日志级别、4.2 案例二&#xff1a;使用watch 查看方法输入输出参数4.3 案例三&#xff1a;使用 Arthas 实现在线代码热更新 1. 背景介绍 通常&#xff0c;本地开发环…

文件上传、amrkdown编辑器

一、文件上传 这里我以图片为例&#xff0c;进行上传&#xff0c;上传到阿里云oss&#xff08;对象存在中&#xff09; 首先&#xff0c;我们先梳理一下&#xff0c;图片上传的流程 1、前端选择文件&#xff0c;提交文件 前端提交文件&#xff0c;我们可以使用ElementUI中的…

蓝队技能-应急响应篇Web内存马查杀JVM分析Class提取诊断反编译日志定性

知识点&#xff1a; 1、应急响应-Web内存马-定性&排查 2、应急响应-Web内存马-分析&日志 注&#xff1a;传统WEB类型的内存马只要网站重启后就清除了。 演示案例-蓝队技能-JAVA Web内存马-JVM分析&日志URL&内存查杀 0、环境搭建 参考地址&#xff1a;http…

有关 签到/签退 业务逻辑 的梳理与学习

导言 最近搞到了个签到管理&#xff0c;其中的业务逻辑感觉有点复杂(可能是我的方向不对),虽然是实现了&#xff0c;不过代码和逻辑很多&#xff0c;也有些乱&#xff0c;想趁着还记得逻辑来记录梳理一下&#xff0c;看看自己以后有没有更好的思路&#xff0c;或者有大佬有思路…