当前位置: 首页 > news >正文

浅谈虚拟内存(操作系统、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 内存管理的策略,能够帮助在设计高效系统时更好地管理内存资源,从而提升程序的性能和稳定性。

相关文章:

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

浅谈虚拟内存(操作系统、Redis) 参考&鸣谢 4.1 为什么要有虚拟内存? xiaolincoding 【简单说下】REDIS的虚拟内存机制,会吗?别翻书 aristo_boyunv Redis 虚拟内存 Java杨永杰 浅谈虚拟内存:操作系统与 Redis 在计算机系统中…...

【LeetCode HOT 100】详细题解之链表篇

LeetCode HOT 100题解之链表篇 160 相交链表题目分析代码 206 反转链表方法一:迭代 234 回文链表方法一:将值复制到数组中方法二:快慢指针 141 环形链表方法一:哈希表方法二:快慢指针 142 环形链表II方法一&#xff1a…...

二叉树的递归遍历

方法论 确定递归函数的参数和返回值 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。 确定终止条件 写完了递归算法, 运行的时候,经常会遇到栈溢…...

国内访问OpenAI API

最近在学习LLM。绕不过去的肯定要学习OpenAI。 国内想直接使用官方API十分麻烦。就到处查资料及网友的分享。发现了这个代理可以在国内很方便的使用OpenAI API。 代理的地址如下: https://referer.shadowai.xyz/r/1014150 经过一段实际体验下来,这个…...

深入 Spring RestTemplate 源码:掌握 HTTP 通信核心技术

在上一篇文章《Spring Boot 项目高效 HTTP 通信:常用客户端大比拼!》里,我们提到了RestTemplate,它是Spring框架提供的Http客户端,在springboot项目开发过程中,属于使用最为广泛的 HTTP 客户端之一了。今天…...

计算机网络:计算机网络概述 —— 初识计算机网络

文章目录 计算机网络组成部分网络架构协议与标准网络设备网络类型作用实际应用案例 计算机网络 计算机网络是指将多台计算机通过通信设备和通信链路连接起来,以实现数据和信息的交换和共享的技术和系统。它是现代信息社会的基础设施之一,也是互联网的基…...

set和map结构的使用

个人主页:敲上瘾-CSDN博客 个人专栏:游戏、数据结构、c语言基础、c学习、算法 目录 一、序列式容器和关联式容器 二、set和multiset 1.insert 2.erase 3.find 4.count 三、map和mapmulti 1.pair 2.insert 3.find 4.operator[ ] 5.erase 6.lo…...

2. qt_c++反射实例

目录 使用场景元对象相关类及宏常用功能获取类相关内容以及委托调用 使用场景 Qt基于强大的元对象系统实现反射机制; 在复杂的开发需求中,我们希望通过一些手段映射出我们的类(映射对象) 然后直接使用,通过&#xff0…...

卷积神经网络(CNN)的计算量和参数怎么准确估计?

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 1. 卷积层(Convolutional Layer) a) 计算量估计: 卷积层的 FLOPs 2 * H_out * W_out * C_in * C_out * K_h * K_w 详细解释: H_out, W_out&#xff…...

Ruby基础语法

Ruby 是一种动态、反射和面向对象的编程语言,它以其简洁的语法和强大的功能而受到许多开发者的喜爱。以下是 Ruby 语言的一些基本语法: 1. 打印输出 puts "Hello, Ruby!" 变量赋值 x 10 name "John" 2. 数据类型 Ruby 有多种…...

插入排序C++

题目: 样例解释: 【样例解释 #1】 在修改操作之前,假设 H 老师进行了一次插入排序,则原序列的三个元素在排序结束后所处的位置分别是 3,2,1。 在修改操作之后,假设 H 老师进行了一次插入排序,则原序列的三个…...

修改ID不能用关键字作为ID校验器-elementPlus

1、校验器方法 - forbiddenCharValidator const idUpdateFormRef ref(null); const forbiddenCharValidator (rule, value, callback) > {const forbiddenCharacters [as,for,default,in,join,left,inner,right,where,when,case,select];for (let forbiddenCharacter o…...

一文详解WebRTC、RTSP、RTMP、SRT

背景 好多开发者,希望对WebRTC、RTSP、RTMP、SRT有个初步的了解,知道什么场景该做怎样的方案选择,本文就四者区别做个大概的介绍。 WebRTC 提到WebRTC,相信好多开发者第一件事想到的就是低延迟,WebRTC(W…...

全国职业院校技能大赛(大数据赛项)-平台搭建Zookeeper笔记

ZooKeeper是一个分布式的、开放源码的分布式应用程序协调服务,为分布式应用提供一致性服务。它的设计目标是简化分布式系统的管理,保证多个节点之间的数据一致性和协调工作。ZooKeeper提供了类似文件系统的层次化命名空间,用来存储和管理元数…...

不同领域神经网络一般选择什么模型作为baseline(基准模型)

在神经网络研究中,选择合适的baseline(基线模型)是评估新方法有效性的重要步骤。基线模型通常是领域内公认的、性能良好的参考模型,用于比较和验证新提出模型的优势。以下是一些在不同任务和领域中常见的基线模型选择:…...

华为-IPv6与IPv4网络互通的6to4自动隧道配置实验

IPv4向IPv6的过渡不是一次性的,而是逐步地分层次地。在过渡时期,为了保证IPv4和IPv6能够共存、互通,人们发明了一些IPv4/IPv6的互通技术。 本实验以6to4技术为例,阐述如何配置IPv6过渡技术。 配置参考 R1 # sysname R1 # ipv6# interface GigabitEthernet0/0/1ip address 200…...

【spring中event】事件简单使用

定义事件类 /* * 1. 定义事件类 * 首先,我们创建一个自定义事件 UserRegisteredEvent,用于表示用户注册事件。 * */ public class UserRegisteredEvent extends ApplicationEvent {private final String email;public UserRegisteredEvent(Object sourc…...

leetcode每日一题day19(24.9.29)——买票需要的时间

思路:在最开始的情况下每人需要买的票数减一是能保持相对位置不变的, 如果再想减一就有可能 有某些人只买一张票,而离开了队伍, 所有容易想到对于某个人如果比当前的人买的多就按当前的人数量算 因为在一次次减一的情况下&#xf…...

智源研究院推出全球首个中文大模型辩论平台FlagEval Debate

近日,智源研究院推出全球首个中文大模型辩论平台FlagEval Debate,旨在通过引入模型辩论这一竞争机制对大语言模型能力评估提供新的度量标尺。该平台是智源模型对战评测服务FlagEval大模型角斗场的延展,将有助于甄别大语言模型的能力差异。 F…...

python实用脚本(二):删除xml标签下的指定类别

介绍 在目标检测中,有些时候会遇到标注好的类别不想要了的情况,这时我们可以运行下面的代码来批量删除不需要的类别节省时间。 代码实现: import argparseimport xml.etree.ElementTree as ET import osclasses [thin_smoke]def GetImgNam…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

C++ 基础特性深度解析

目录 引言 一、命名空间(namespace) C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用(reference)​ C 中的引用​ 与 C 语言的对比​ 四、inline(内联函数…...

OpenLayers 分屏对比(地图联动)

注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

大数据学习(132)-HIve数据分析

​​​​🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言&#x1f4…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

免费数学几何作图web平台

光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...