浅谈虚拟内存(操作系统、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方法一:…...
二叉树的递归遍历
方法论 确定递归函数的参数和返回值 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。 确定终止条件 写完了递归算法, 运行的时候,经常会遇到栈溢…...
国内访问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基于强大的元对象系统实现反射机制; 在复杂的开发需求中,我们希望通过一些手段映射出我们的类(映射对象) 然后直接使用,通过࿰…...
卷积神经网络(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ÿ…...
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)——买票需要的时间
思路:在最开始的情况下每人需要买的票数减一是能保持相对位置不变的, 如果再想减一就有可能 有某些人只买一张票,而离开了队伍, 所有容易想到对于某个人如果比当前的人买的多就按当前的人数量算 因为在一次次减一的情况下…...
智源研究院推出全球首个中文大模型辩论平台FlagEval Debate
近日,智源研究院推出全球首个中文大模型辩论平台FlagEval Debate,旨在通过引入模型辩论这一竞争机制对大语言模型能力评估提供新的度量标尺。该平台是智源模型对战评测服务FlagEval大模型角斗场的延展,将有助于甄别大语言模型的能力差异。 F…...
python实用脚本(二):删除xml标签下的指定类别
介绍 在目标检测中,有些时候会遇到标注好的类别不想要了的情况,这时我们可以运行下面的代码来批量删除不需要的类别节省时间。 代码实现: import argparseimport xml.etree.ElementTree as ET import osclasses [thin_smoke]def GetImgNam…...
vue3 父子组件调用
vue3 父子组件调用 父组件调用子组件方法 子组件使用defineExpose将方法抛出 父组件定义 function,子组件通过 defineExpose 暴露方法,父组件通过 ref 获取子组件实例,然后通过 ref 获取子组件方法。 // 父组件 <template><div>…...
线性模型到神经网络
🚀 在初始神经网络那一节(链接如下:初始神经网络)的最后,我们通过加大考虑的天数使得我们最后得到的模型Loss最终停留在了0.32k,当我们在想让模型更加准确的时候,是做不到的,因为我们…...
【架构】前台、中台、后台
文章目录 前台、中台、后台1. 前台(Frontend)特点:技术栈: 2. 中台(Middleware)特点:技术栈: 3. 后台(Backend)特点:技术栈: 示例场景…...
Stable Diffusion 蒙版:填充、原图、潜空间噪声(潜变量噪声)、潜空间数值零(潜变量数值零)
在Stable Diffusion中,蒙版是一个重要工具,它允许用户对图像的特定部分进行编辑或重绘。关于蒙版蒙住的内容处理选项,包括填充、原图、潜空间噪声(潜变量噪声)、浅空间数值零(潜变量数值零)&…...
ffmpeg录制视频功能
本文目录 1.环境配置2.ffmpeg编解码的主要逻辑:3. 捕获屏幕帧与写入输出文件4. 释放资源 在录制结束时,释放所有分配的资源。5.自定义I/O上下文6.对于ACC编码器注意事项 1.环境配置 下载并安装FFmpeg库 在Windows上 从FFmpeg官方网站下载预编译的FFmpeg…...
【LeetCode】每日一题 2024_10_1 最低票价(记忆化搜索/DP)
前言 每天和你一起刷 LeetCode 每日一题~ 大家国庆节快乐呀~ LeetCode 启动! 题目:最低票价 代码与解题思路 今天这道题是经典动态规划,我们定义 dfs(i) 表示从第 1 天到 第 i 天的最小花费,然后使用祖传的:从记忆…...
[C++] 小游戏 征伐 SLG DNF 0.0.1 版本 zty出品
目录 先赞后看 养成习惯 War and Expedition SLG DNF 0.0.1 version 讲人话就是 图标解释: 绿色代表空地,可通过,对应数值 0 蓝色“~ ”为水,不可通过,对应数值 1 棕色“”为桥梁,可通过࿰…...
黑马头条day7-app端文章搜索
今天的内容也只是跑了一下 对于具体的实现掌握的很差 仔细看 es 在微服务学的es使用基本忘光了 这里用起来一点都熟悉 重学!!! kafka异步 文章自动构建索引的时候用到了‘’ mongoDB 用来存储用户的搜索记录 遗忘(拦截器 j…...
嵌入式必懂微控制器选型:STM32、ESP32、AVR与PIC的比较分析
目录 1 微控制器基础概述 1.1 微控制器基本概念 1.2 工作原理及架构 1.3 STM32、ESP32、AVR和PIC简介 2 微控制器性能比较分析 2.1 性能比较 2.2 功耗比较 2.3 功耗分析 2.4 外设接口对比 3 应用场景与选择策略 3.1 物联网应用场景 3.2 工业控制场景 3.3 智能家居场…...
Python selenium库学习使用实操二
系列文章目录 Python selenium库学习使用实操 文章目录 系列文章目录前言一、模拟登录二、表单录入 前言 在上一篇文章中,我们完成Selenium环境的搭建,和简单的自动化。今天继续深入学习。今天的目标是完成模拟登录,和表单录入。 一、模拟登…...
2017网站开发新技术/seo模拟点击软件
计划上:在之前的想了一下怎么设计 通过定义运算符优先级 分数的话将它转化成小数 然后通过不断简化算式来计算结果 实际操作上:在定义优先级的时候 将乘除定义的比加减多一个优先级 括号内的可以用栈来实现 搜索查到(就入栈直至检查到&#…...
php网站做代理服务器/网络优化培训骗局
本来是不太想动的...无可奈何,看到一句话【业精于勤, 荒于嬉】便还是动手写一写加深理解的同时给以后的自己留个备份吧...element-ui Tree组件如何给具有懒加载的tree设置半选效果?这也是让我很头疼的一个问题...因为数据不是一口气都请求回来的…...
张浦专业做网站/西安百度推广代运营
http://www.infoq.com/cn/articles/HIgh-Performance-Parsers-in-Java-V2?utm_sourceinfoq&utm_mediumpopular_links_homepage...
成都网站建设网站/seo网站推广是什么意思
关于F5负载均衡你认识多少? 2018年06月09日 18:01:09 tvk872 阅读数:14008网络负载均衡(load balance),就是将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行,例如web服务器…...
婚礼礼网站如何做的/营销渠道有哪些
转载自:https://www.cnblogs.com/birdsmaller/p/5377104.html 背景 涉及身份验证的系统都需要存储用户的认证信息,常用的用户认证方式主要为用户名和密码的方式,为了安全起见,用户输入的密码需要保存为密文形式,可采用…...
wordpress stheme/免费的个人网页
1.先搞清微信小程序的生命周期和页面生命周期的关系 微信小程序的生命周期包括App生命周期和页面生命周期。App生命周期指的是小程序从启动到退出的整个过程,而页面生命周期则是指小程序中每个页面从创建到销毁的过程。 在小程序中,当用户打开小程序时&a…...