前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >为什么操作系统需要虚拟内存

为什么操作系统需要虚拟内存

原创
作者头像
写bug的高哈哈
修改于 2024-05-15 03:04:47
修改于 2024-05-15 03:04:47
2210
举报

前言

在计算机中,CPU执行程序之前,得先把程序的内容加载到内存中一段连续的空间里,这样CPU才能根据内存中排列好的指令顺序执行。

因此,当你同时开启很多程序,他们在内存中就会长这样。

之后每当有新启动的程序,系统就会从剩余的内存中分配一段连续的空间给他,而若有程序结束了,那系统也会把他占用的内存清除掉

虽然这样的做法听起来很美好,但实际上却经常遇到内存碎片化的问题。

内存碎片化

内存碎片化简单来说就是虽然剩余的空间总量够大,但因为那些空间被切割成大大小小的区块,导致没有一段足够大的连续空间可以使用

以上图来说,原本我的内存最右侧还剩下 3GB 可以用,如果我再把 VSCode 关掉,那就会有 6GB 的空闲内存。

纵使有 6GB 的空闲内存,但如果现在想打开一个 4GB 应用,系统就会因为找不到连续的 4GB 而无法打开

而且一般在使用电脑时程序都会开开关关,所以碎片化的问题会越来越严重。虽然看似有很多空闲内存,由于这些空闲内存分散无法合并成连续的 4GB,所以什么程序都运行不了。

内存虚拟化

为了解决碎片化的问题,现在的操作系统都会使用内存虚拟化方案,也就是给每个进程一块独立的虚拟内存(Virtual Memory),然后将其映射到的物理内存(Physical Memory)中。

操作系统会分别为它们分配一大块虚拟内存,使得它们感觉像是各自拥有完整、连续的内存空间来使用,但实际上这些空间在物理内存中可能是分散存储的。

比如现在我同时打开了 Firefox 跟 Chrome,操作系统会分别为它们分配一大块虚拟内存,使得它们感觉像是各自拥有完整、连续的内存空间来使用。如此一来 Firefox 跟 Chrome 就会觉得自己拿到的内存是连续的一大块 ,但实际上这些空间在物理内存中可能是分散存储的。

再换句话说,如果你今天写程序声明了一个超大的数组, 逻辑上你确实拿到一块很大的连续空间,但实际上那个巨大数组在物理内存中是分散的 ,不过程序本身察觉不到这一点。

Memory Management Unit(MMU)

虽然 内存虚拟化 听起来完美解决了碎片化的问题,但如果每次程序要去存取内存时,操作系统都要花时间把虚拟地址(Virtual Address)转成物理地址(Physical Address),那程序跑起来就会慢很多。

为了解决这个问题,从 1980 年代开始的电脑都会加上一块硬件叫 MMU,大概长下面这样。

这个 MMU 内部有一个 page table 记录了虚拟/物理地址的对应关系 ,当程序试图访问某个变量时,CPU 就会马上叫 MMU 去找对应的物理地址,由MMU迅速查找并返回该变量的实际物理地址,然后CPU再从物理内存中读取数据。 通过硬件实现地址转换,尽管性能会有所下降,但相比纯软件方式,已经极大地减少了额外开销。

其它好处

前面有提到一开始做 内存虚拟化 是为了解决碎片化的问题,但除此之外还带来不少其他好处。

进程间共享物理内存

在开发过程中,我们常遇到不同程序需要打开同一文件的情况,例如同时用 node app.js 运行程序,又用 VSCode 编辑 app.js。这时,操作系统只需加载一次 app.js,并将两个进程中对 app.js 的虚拟地址映射到相同的物理内存区域,实现资源共享。

除了文件之外,很多程序会共同使用一些常用的动态链接库,如 Mac 系统下的 ls、cat 等命令都需要 libSystem.B.dylib。系统会在内存充足的情况下持续保留这类常用库在内存中,方便后续进程快速地调用。

按需加载

在有虚拟内存之前,要执行一个程序往往需要把整个程序加载进内存。

但仔细想一想, 每个程序都有很多地方根本不太会被执行到 :比如说有些代码的功能是在程序崩溃之时把 stack trace 印出来、有些则是在服务异常时发送 slack 通知给开发人员。 如果这些例外状况极少发生,那把整个程序都加载内存内显然不是个好主意

系统只会把当前马上要用到的部分加载至物理内存,而那些不太可能被执行到的部分(比如异常处理函数或极少使用的代码)则暂时不用加载。这种按需加载的方式被称为懒加载,可减少程序启动等待时间,并避免少数大型程序占用大量内存。

交换(Swapping)

当所需内存过大以至于物理内存不足时,系统会采取交换机制,即将曾经使用过但短期内可能不再需要的内存内容临时移出到硬盘上。例如,程序启动初期执行过的init()函数或偶尔才调用的error_handler()函数,在内存紧张时会被换出到硬盘,需要时再载入。

比如说程序刚启动时要跑的 init() 、偶尔才跑一次的 error_handler()他们都曾经被执行过所以一定有被加载内存 。但如果可用的内存快没了,系统就会把他们 swap 出去(没用的东西都给我滚),哪天需要时再从硬盘拿回来就好

有了 swapping 机制后虽然可以增进内存的使用效率,而且内存绝对不会不够用(说穿了就是拿硬盘当扩充内存),虽然交换机制可以有效扩大内存利用率,但如果频繁进行交换操作,由于硬盘速度远低于内存,会导致系统整体性能显著降低。

那怎么知道系统用了多少 Swap 呢?看 htop 就可以了。我的 htop 打开后会看到 Swp 是 0/1023MB,意思是系统没有把任何内存 swap 到硬盘上(因为我的 Mem 还够用),但如果需要的话最多可以把 1023MB 的内存 swap 出去,等需要时再拿回来就好

如果没有装 htop 的话,top 最上面也有 swap in 跟 swap out 可以看目前用了多少 swap 哦~

那知道 Swap 使用量可以做什么呢?刚刚有提到说频繁的做 swapping 会导致性能变差,因此如果常常觉得电脑、主机慢到炸裂,开个浏览器一分钟才跳出来,而且刚好 Swap 的使用量又很高,那就很有可能是内存不足,快帮你的机器升级吧~

总结

回到这篇的主题,为什么需要多加一层虚拟内存呢?我想现在大家都知道了。总的来说 虚拟内存 就是在 物理内存应用程序 之间加上一个中间层,这一层允许操作系统悄无声息地进行各种内存优化操作,如共享内存、延迟加载和内存交换,而应用程序只需专注于自身的逻辑,无需关心具体数据何时加载进内存或者何时被交换出去,一切交给操作系统来妥善处理。

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
什么是虚拟内存?
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。
zhanyd
2022/05/16
2K0
什么是虚拟内存?
系统内存管理:虚拟内存、内存分段与分页、页表缓存TLB以及Linux内存管理
虚拟内存是一种操作系统提供的机制,用于将每个进程分配的独立的虚拟地址空间映射到实际的物理内存地址空间上。通过使用虚拟内存,操作系统可以有效地解决多个应用程序直接操作物理内存可能引发的冲突问题。
努力的小雨
2023/11/13
9850
[翻译]虚拟内存介绍
计算机是用来执行简单任务的复杂机器:比如 上网、文本编辑、网页服务、视频游戏……,还可以对数据进行操作,图片 音乐 文本 数据库……
xindoo
2021/01/22
1.8K0
[翻译]虚拟内存介绍
【操作系统】内存管理概述
常见的内存分配函数有malloc,mmap等,但大家有没有想过,这些函数在内核中是怎么实现的?换句话说,Linux内核的内存管理是怎么实现的?
嵌入式与Linux那些事
2024/05/11
2200
【操作系统】内存管理概述
虚拟内存详解
究其原因,监控系统计算的可用内存算法有偏差,他只关注了计算机的“实际”内存,忽略了计算机的虚拟内存。
bisal
2020/04/10
3.8K0
虚拟内存详解
真棒! 20 张图揭开内存管理的迷雾,瞬间豁然开朗
操作系统确实是比较难啃的一门课,至少我认为比计算机网络难太多了,但它的重要性就不用我多说了。
小林coding
2020/07/03
1K0
Why | 为什么需要虚拟内存?
冯-诺依曼老爷子告诉过我们,算术逻辑单元和控制器单元组成的 CPU 负责进行运算以及程序流程的控制。运算所需要的指令和数据由 内存 来提供。
路遥TM
2021/08/26
8060
关于进程虚拟内存
由于内存数据是固定的一个大数组,而操作系统往往是运行多个程序,如果这些程序都直接访问内存数组的话,就出现了以下问题:
仙士可
2022/02/18
2.1K0
关于进程虚拟内存
操作系统笔记:内存虚拟化
程序自身并不需要关心自己的数据及代码存在哪,并且对程序来说,内存看上去是连续且独占的。当然事实肯定不是如此,而这背后就是操作系统的功劳 —— 内存虚拟化。本篇文章就介绍操作系统是如何实现虚拟内存系统的。
CS实验室
2021/03/22
1.6K0
操作系统笔记:内存虚拟化
基础知识-操作系统-虚拟内存
虚拟内存是相对于物理内存的一种说法。那么什么是物理内存呢?顾名思义,插在主板上的内存条是多大,内存就是多大。
BUPTrenyi
2019/07/15
1.3K0
基础知识-操作系统-虚拟内存
深入剖析虚拟内存工作原理
作者:allanpan,腾讯 IEG 后台开发工程师 导言 虚拟内存是当今计算机系统中最重要的抽象概念之一,它的提出是为了更加有效地管理内存并且降低内存出错的概率。虚拟内存影响着计算机的方方面面,包括硬件设计、文件系统、共享对象和进程/线程调度等等,每一个致力于编写高效且出错概率低的程序的程序员都应该深入学习虚拟内存。 本文全面而深入地剖析了虚拟内存的工作原理,帮助读者快速而深刻地理解这个重要的概念。 计算机存储器 存储器是计算机的核心部件之一,在完全理想的状态下,存储器应该要同时具备以下三种特性:
腾讯技术工程官方号
2021/05/08
3.4K0
计算机系统 Lecture 1:虚拟内存详解
因此,现代计算机系统通常把各种不同存储容量、存取速度和价格的存储器按照一定的体系组成多层结构,以解决存储器容量、存取速度和价格之间的矛盾。
Flowlet
2023/08/11
5580
计算机系统 Lecture 1:虚拟内存详解
操作系统内存管理,你能回答这8个问题吗?
大家早上好,我是程序喵!今天为大家总结整理了关于操作系统内存管理的知识点,更文不易,请各位兄弟别忘分享或者点个在看,多谢
GorgonMeducer 傻孩子
2020/12/22
1.2K0
操作系统内存管理,你能回答这8个问题吗?
操作系统内存管理(思维导图详解)
包括程序装入等概念、交换技术、连续分配管理方式和非连续分配管理方式(分页、分段、段页式)。
黄规速
2022/04/14
8890
操作系统内存管理(思维导图详解)
操作系统核心知识点整理--内存篇
如果采用可变分区进行管理,我们需要使用空闲分区表或者空闲分区链表的方式来记录当前内存中各个空闲分区块。
大忽悠爱学习
2023/02/26
6080
操作系统核心知识点整理--内存篇
虚拟内存管理技术
如果是程序太多, 超过了内存的容量, 可以采用自动的交换(swapping)技术, 把暂时不能执行的程序送到外存(硬盘)中 目的 : 多道程序在内存时, 让正在运行的程序或需要运行的程序获得更多的内存资源 原理 : 可将暂时不能运行的程序送到外存, 从而获得空闲内存空间. 操作系统把一个进程的整个地址空间的内容保存到外存中(换出 swap out), 而将外存中的某个进程的地址空间读入到内存中(换入 swap in). 换入换出内容的大小为整个程序的地址空间. 缺点: 交换的程序如果内存很大, 那么开销就非常大
用户11097514
2024/05/30
2530
虚拟内存管理技术
虚拟内存该如何设置呢
无论是 windows 系统还是 linux 操作系统,在硬盘上都有一块虚拟内存的空间。 无论你使用的是哪个系统,都存在一个问题,那就是到底虚拟内存的空间需要多大呢?虚拟内存又是什么呢? 本文就来详细介绍一下。
用户3147702
2022/06/27
2.7K0
虚拟内存该如何设置呢
操作系统是如何管理物理内存的?
1.抽象,即给每个程序逻辑地址空间2.保护,不同程序的地址空间互相隔离,无法越界访问3.共享,对于一些公共函数库,可以只在内存中存一份,其它程序引用这一个库即可4.虚拟化,通过逻辑地址和虚拟内存,可以使用更大的地址空间
陆道峰
2020/06/17
2.9K0
《现代操作系统》——内存管理
内存管理是操作系统中经典的话题。小型嵌入式系统一次只需要执行一个任务,对内存管理没有要求。现代的操作系统通常要同时执行多个进程,多个进程所占用的内存之和通常超出物理内存的容量大小。即便内存容量也在不断的增长,但始终跟不上软件体积膨胀的速度。甚至有些庞大的程序所需要的内存就足以塞满整个物理内存空间。所以,现代操作系统的设计者就要想办法来调和系统的多任务同时运行、软件体积膨胀和有限的物理内存容量之间的冲突,想尽办法做到鱼和熊掌兼得。这就是本文所介绍的操作系统的内存管理。本文所介绍的主要是:
VV木公子
2021/10/05
1.1K0
《现代操作系统》——内存管理
《笨开发学习操作系统》3内存
你的电脑上或许此时插着一根 8G 的内存条,你经常在使用它,但你有没有想过操作系统是如何管理内存的?如果让你来分配使用,你是否会想着:给正在运行的游戏分配其中的 4G,给我的视频软件分配 2G,给音乐软件分配 1G,分配各自独立,互不干扰。但当我的游戏需要更多的内存的时候,是否我的视频就无法播放了呢?
LinkinStar
2022/09/01
4270
《笨开发学习操作系统》3内存
推荐阅读
相关推荐
什么是虚拟内存?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档