当前位置: 首页 > 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…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色&#xf…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...