Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >浅谈计算机中的存储模型(二)虚拟存储器

浅谈计算机中的存储模型(二)虚拟存储器

作者头像
老九君
发布于 2018-08-08 09:32:24
发布于 2018-08-08 09:32:24
6850
举报
文章被收录于专栏:老九学堂老九学堂
上周给大家分享了

《浅谈计算机中的存储模型(一)物理内存 》

小伙伴们都表示

如此悲壮的画面

仍有小伙伴非常诚(xu)实(wei)的

告诉大雄

“我最喜欢看的文章就是干货”

“我一般只看干货”

“要学习迈,希望公众号干货多一点”

...

干货的力量果然是无穷无尽的

今天大雄顺民意

给大家奉上

存储模型系列的第二篇

“虚拟内存”

希望各位小伙伴们

在学习的路上越走越远~

这里先补充下地址空间的概念:

现代系统都是多任务系统,而我们的进程是在内存中运行的,内存是有限的,我们如何保证可以安全而又高效的在有限的内存中运行多个程序呢?于是系统给每个进程抽象出一个地址空间。

物理地址直接暴露给进程会带来一些问题:

1.进程可能会访问禁止访问的空间,如操作系统的地址;

2.运行多个进程是困难的。

如下图:

地址空间为程序创造了一种抽象的内存,地址空间是一个进程可用于寻址内存的一套地址集合。

每个进程都有一个自己的地址空间,并且这个地址空间独立于其他进程的地址空间。

地址空间:

虚拟存储器

虚拟存储器概念:现代系统为了更好的管理存储器并且保证安全提供了一种对主存的抽象概念,叫做虚拟存储器。

虚拟存储器提供了三个重要的能力:

1.它将内存看为是磁盘的高速缓存,在内存中只保存活跃的区域,并根据需要在内存和磁盘中来回传送数据,使得主存的使用更加高效。

2.它为每个进程抽象出了一致的内存空间,使得多进程可以更加简单的运行,简化了存储器的管理。

3.它保护了每个进程可以单独的,高效的运行,每个进程的地址空间不会被其他进程破坏。

简述上图:

前面说了每个进程都有一个抽象的地址空间,进程1访问物理内存中的数据时,它获得的地址是抽象的虚拟地址,需要将虚拟地址转化为物理地址。

那么就需要硬件MMU通过一些数据结构来进行地址转换从而得到物理内存的地址。

然而物理内存是有限的,如果每个进程都要全部加载到内存中内存肯定不够,后来先辈们就发现我为什么要把进程全部内容加载到内存中去呢。

根据二八定理,百分之百的内容常用的也就百分之二十。

所以只需要将每个进程常用的加载到内存中,不用的先暂存到磁盘,如果需要它时在从磁盘中将它加载出来。

这就是上图中内存和磁盘的连线关系,装过系统的朋友都知道无论是Linux还是windows分区时我们都要给它分交换分区,交换分区其实就是暂存物理内存中不用的内容。

这时如果物理内存中有数据就传送给cpu,如果没有就产生异常,然后内存和磁盘进程数据交换后在由内存将数据传送给cpu

这就是虚拟存储器。

如果你还是不理解为什么要抽象出地址空间,每个进程要抽象出虚拟内存,可以这样想。

32位机器下,内存最大是2^32也就是4GB,比如你的内存是4GB,现在你的机器上跑了10个程序,开始10个都占据内存非常少

但是,但是每个程序都有这样的能力,我是可以使用到4G内存的,只是我暂时没有这个需要!!

这时10个程序中的其中一个突然开始大量使用内存,它有能力使用到近乎4G的内存,而其它9个也正常运行。

纵坐标表示内存占用率,横坐标表示进程;那么可以这样使用:

也可以这样:

还可以这样,总量不超过内存大小即可:

实际上每个进程都可能很大的,不用的我们先放到磁盘嘛。

下面我们来细说:

页式管理

当代系统一般都采用的是页式管理内存,什么是页式管理,简单的来讲就是将内存分为固定大小的内存块,x86下一块大小是4k,一块我们称为为一页。

抽象出的虚拟内存也是按页大小分配的,而物理内存的页一般称为页框(页帧或内存块)。

磁盘上的交换分区也是按页大小来组织的,这样我们能发现虚拟内存->物理内存->磁盘都是相同大小的结构来组织数据。

页表

内存是有限的,所以进程使用自己的地址空间虚拟内存

但是当进程需要访问自己的数据时肯定要去物理内存中的物理地址找数据,那么从虚拟内存向物理内存地址转换在页式管理中我们就需要通过页表这个数据结构来进行转换。

页表项

页表项就是页表中的每一项,就和链表中的每一个节点,数组中的每一个元素一样。

页表项有什么内容呢,首先肯定要有地址转换,也就是虚拟地址通过变换成物理地址,其次还有一些标记位,这里我们说常见的几个标记位。

我们以x86架构32位机器来看,地址总线是32位,也就是寻址能力是2^32,为了加快地址转换我们需要一次传送地址就能转换,前面说了一个页大小一般为4K,我们要定位到具体的数据肯定要在页面内寻址,4K=2^12,所以12位即可。32-12=20,剩余20位我们来表示物理内存的页框号。

如下图:

虚拟内存页中保存的是页表的中某一项索引,索引到页表中的页表项时,前20位地址转换得到物理内存的页框号,后12位得到4K大小的页的页内偏移。

这样就完成了一次访问过程。

一般标记位有效位,访问位,修改位和保护位

有效位:表示此时这个页面是在内存中还是转换到了磁盘上。

访问位:表示这个页面在近期是否被访问过。

修改位:表示这个页面在近期是否被修改过。

保护位:是个权限位,比如这个页面属于操作系统的,那么普通程序没有权限访问它,它受保护。

多级页表

单一页表就是上面所述,从上面的描述我们可以大致计算出来页表占据空间的大小,每个进程一个页表,每个页表映射所有的物理页面,这个计算下来耗费是非常大的,所以引入多级页表。

多级页表其实是根据使用过的页面来建立页表,一级索引二级,二级索引内存,该进程没有使用的页面二级页表就不会映射。

部分内存该进程并没有使用,所以未使用的不存在二级页表,这样节省了空间。

当然不仅仅有二级页表,corei7使用的就是4级页表。

倒排页表

倒排页表其实是从物理内存出发,物理内存有多大,就建立多大的页表,因为所有进程共用物理内存,所以所有的进程共用这一张页表,然后更具页面的变换情况来刷新此页表。

MMU

前面简单介绍过MMU,MMU是Memory Management Unit的缩写,中文名是内存管理单元。

它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。

它的功能主要有两个:

1.将线性地址映射为物理地址;

2.提供硬件机制的内存访问授权。其实就是将我们刚才叙述的交给MMU来执行,单独出来一个硬件效率是比较高的。

快表TLB

快表其实就是一个页表项的缓存

如果没有快表,我们需要多次访问内存才能得到我们需要的页表项,前面说过二八定理,我们将经常使用的页表项缓存到TLB快表中,由于快表也是硬件集成的,它是并行的来查找,所以速度非常快。

页错误/缺页异常

页错误:刚说过页表上有访问位,权限位等,页错误就是我们没有按照这些标记位的规则来访问页面,比如这个页面是只读的,我们写了它,或者属于操作系统,我们错误的访问了等等。

缺页异常:我们需要访问的页面在页表中没有记录或者有效位为0表示此页面不在内存中,这时就会产生一个缺页异常,需要操作系统去磁盘上调度将页交换到内存中去。

页面置换算法

页面置换算法是针对内存和磁盘交换页面的,目的是为了尽量少交换页面,少产生缺页异常,因为访问磁盘是非常耗时的,这个后面会说到。

网上讲页面置换算法的很多了,这里简单叙述下:

比如我们内存只能存储3个页面,此时页面访问顺序为2 3 2 1 5 2 4 5 3 2 5 2,肯定会出现某时该页面不在内存中的情况,此时要产生缺页异常,我们的目的是尽量少产生。

OPT理想页面置换算法:

将未来不使用的或者很久后才使用的页面置换出内存。

我们可以看出这样发生缺页异常会少很多,但是这个算法是不能实现的,它的意义是用来作为一个衡量的标准,评判其他算法的好坏。

FIFO先进先出算法

思想很简单,当需要置换页面时,将最早到来的置换出去,因为它存在的最久,这个算法是最简单的,但是缺不高效,因为我们不能保证停留最久的页面不是最常访问的。

第二次机会算法

在FIFO算法的一种改进,按照FIFO思想,本身轮到你置换出去了,现在我再给你一次机会,我访问你页表项中的访问位,如果访问位为1说明你最近被访问过,我这次不将你置换出去,把你的访问位设置为0,然后从队头放到队尾。

下次再次轮到你时我再判断。如果你的访问位为0说明你最近没有被访问过,置换出去。

时钟算法

是在第二次机会算法上的一种结构的改进,将链式结构改造成环状,类似环形数组,这样就想一个时钟一样转即可,不需要像第二次机会算法一样每次每次还要将队头放到队尾这种耗时的操作。

LRU

LRU是Least Recently Used的缩写,即最少使用页面置换算法

将近期使用次数最少的页面置换出去,这种算法也是不能实现的,只有接近它的算法。

老化算法

老化算法就是接近LRU的一种算法,它是给每个页面一串bit位,比如8位00000000,当每访问一个页面时,我就将每个页面的bit位向右移动一位,然后被访问的页面首位补1。

其实就像高低信号一样,随着时间右移,有新信号为1,没有则为0,长时间没有的就慢慢衰减的00000000。

NRU

NRU也是近似LRU的一种算法,不过它是根据页面的标记位来判断,比如修改位和访问位,最近访问的和最近修改的都会被置为1,没有被访问和修改这两位都为0。根据2位4中情况来判断淘汰页面。

段式管理

段式管理(segmentation),是指把一个程序分成若干个段进行存储,每个段都是一个逻辑实体,程序员需要知道并使用它。

它的产生是与程序的模块化直接有关的。段式管理是通过段表(和页表类似)进行的,它包括段号或段名、段起点、装入位、段的长度等。此外还需要主存占用区域表、主存可用区域表。

在段式存储管理中,每个段地址的说明为两个量:一个段名和一个位移。

在段内,是连续完整存放的。而在段与段之间是不一定连续编址的。段名和位移构成了一种二维编址。

段式管理是不连续分配内存技术中的一种。其最大特点在于他按照用户观点,即按程序段、数据段等有明确逻辑含义的“段”,分配内存空间。克服了页式的、硬性的、非逻辑划分给保护和共享与支态伸缩带来的不自然性。

段的最大好处是可以充分实现共享和保护,便于动态申请内存,管理和使用统一化,便于动态链接;其缺点是有碎片问题。

段页式

就是将段式和页式组合起来管理内存

段页式内存管理有段表和页表,先通过段表来找到段,在通过段表的段内偏移其实是页框号加页内偏移,这样就再次索引页表来定位。

因为段页式管理是段式管理的页式管理方案结合而成的,所以具有它们二者的优点。但反过来说,由于管理软件的增加,复杂性和开销也就随之增加了。另外,需要的硬件以及占用的内存也有所增加。

内存映射和写时复制

内存映射

从mmap函数零拷贝内存映射角度来看,其实mmap仅仅是在内核中建立了文件与虚拟内存空间的对应关系,这样就脱离了磁盘文件系统的管理

普通的read,write都要经过文件系统,效率较低于mmap,交换分区要单独出来的原因也是这样,直接交给操作系统来管理避免磁盘文件系统。

写时复制

从fork函数创建子进程来看,其实是父子进程都通过各自的页表映射到物理内存上相同的页,当子进程修改数据时,页表上有访问权限位,得知只读时,操作系统会为它分配新的页。

今天大雄给小伙伴们

分享的干货就到此了

小伙伴们码住慢慢消化吧!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老九学堂 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
操作系统之存储器管理
(2)把程序计数器中存放的逻辑地址中的页号部分与控制寄存器中的页表长度比较,检查地址越界
_咯噔_
2022/03/22
1K0
面试计算机操作系统解析(一中)
猫咪-9527
2025/03/25
670
操作系统之存储管理
说明: 在左边的单处理器系统中,如果一个进程想要运行,那么必须将进程地址空间装载到物理内存中才可以运行。 而右边的是多处理器系统中有多个进程需要进入物理内存执行,这里要解决的问题就是,如何将进程地址空间合理的装载到物理内存中,如何合理的分配使用内存,使得每个进程能正确执行。
JavaEdge
2018/05/16
3.6K0
操作系统之存储管理
CSAPP 虚拟存储器 笔记
一个系统中的进程是与其他进程共享 CPU 和主存资源的。然而,共享主存会形成一些特殊的挑战。
wywwzjj
2023/05/09
5710
CSAPP 虚拟存储器 笔记
操作系统 内存管理 虚拟存储技术与虚拟页式存储管理方案的实现
基本思想:利用大容量的外存来扩充内存,产生一个比有限的实际内存空间大得多的、逻辑的虚拟内存空间,简称虚存。
Meng小羽
2019/12/23
2.4K0
操作系统内存管理,你能回答这8个问题吗?
大家早上好,我是程序喵!今天为大家总结整理了关于操作系统内存管理的知识点,更文不易,请各位兄弟别忘分享或者点个在看,多谢
GorgonMeducer 傻孩子
2020/12/22
1.2K0
操作系统内存管理,你能回答这8个问题吗?
虚拟内存管理技术
如果是程序太多, 超过了内存的容量, 可以采用自动的交换(swapping)技术, 把暂时不能执行的程序送到外存(硬盘)中 目的 : 多道程序在内存时, 让正在运行的程序或需要运行的程序获得更多的内存资源 原理 : 可将暂时不能运行的程序送到外存, 从而获得空闲内存空间. 操作系统把一个进程的整个地址空间的内容保存到外存中(换出 swap out), 而将外存中的某个进程的地址空间读入到内存中(换入 swap in). 换入换出内容的大小为整个程序的地址空间. 缺点: 交换的程序如果内存很大, 那么开销就非常大
用户11097514
2024/05/30
2140
虚拟内存管理技术
计算机系统基础:虚拟存储管理知识笔记
一个计算机任务只需要部分装入主存便可以启动运行,其余部分留在磁盘上,在需要的时候装入主存,这样可以提高主存空间的利用率。这样该系统所具有的主存容量会比实际主存容量大很多,这样的存储器称为虚拟存储器。
小明互联网技术分享社区
2023/11/29
5010
计算机系统基础:虚拟存储管理知识笔记
操作系统学习笔记-虚拟内存
那么我们由此可以思考:如果保有上述这两个特点,在程序执行中,不需要进程的所有部分(页或段)都被加载到内存中,如果内存中保存有待取的下一条指令的所在块(页或段)以及待访问的下一个数据单元所在的块,那么进程可以持续运行下去。
花猪
2022/02/16
1.2K0
操作系统学习笔记-虚拟内存
操作系统第六篇【存储器管理】
存储器的基础知识 首先,一般的存储器我们就会认为它包含着三部分: 寄存器 速度最快,但是造价高 主存储器 速度次之,被通俗称为内存 外存 速度最慢,用于存储文件数据,因为上边两种一旦断电,数据就会丢失。这个用来做持久化存储的。 因此,我们的存储器往往是使用三层结构的。 程序的装入和链接 在操作系统的角度而言,我们面对存储器就是面对程序的装入和连接 一般地,用户程序向要在系统上运行,就要经历下面几个步骤: 编译:对用户源程序进行遍历,形成若干个目标模块 链接:将目标模块以及他们所需要的库函数链接在一起,形成完
Java3y
2018/06/11
1.5K0
操作系统:第五章 虚拟存储管理
程序执行时会呈现出局部性规律,即在一较短的时间内,程序的执行仅局限于某个部分,相应地,所访问的存储空间也局限于某个区域。
Here_SDUT
2022/08/08
1.7K0
操作系统:第五章 虚拟存储管理
《现代操作系统》——内存管理
内存管理是操作系统中经典的话题。小型嵌入式系统一次只需要执行一个任务,对内存管理没有要求。现代的操作系统通常要同时执行多个进程,多个进程所占用的内存之和通常超出物理内存的容量大小。即便内存容量也在不断的增长,但始终跟不上软件体积膨胀的速度。甚至有些庞大的程序所需要的内存就足以塞满整个物理内存空间。所以,现代操作系统的设计者就要想办法来调和系统的多任务同时运行、软件体积膨胀和有限的物理内存容量之间的冲突,想尽办法做到鱼和熊掌兼得。这就是本文所介绍的操作系统的内存管理。本文所介绍的主要是:
VV木公子
2021/10/05
1.1K0
《现代操作系统》——内存管理
深入剖析虚拟内存工作原理
作者:allanpan,腾讯 IEG 后台开发工程师 导言 虚拟内存是当今计算机系统中最重要的抽象概念之一,它的提出是为了更加有效地管理内存并且降低内存出错的概率。虚拟内存影响着计算机的方方面面,包括硬件设计、文件系统、共享对象和进程/线程调度等等,每一个致力于编写高效且出错概率低的程序的程序员都应该深入学习虚拟内存。 本文全面而深入地剖析了虚拟内存的工作原理,帮助读者快速而深刻地理解这个重要的概念。 计算机存储器 存储器是计算机的核心部件之一,在完全理想的状态下,存储器应该要同时具备以下三种特性:
腾讯技术工程官方号
2021/05/08
3.3K0
分页和分段的联系和区别
    用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。
bear_fish
2018/09/20
6.6K0
浅谈计算机中的存储模型(一)物理内存
今天,我们来了解一下计算机中的存储模型,大雄将这部分知识分成了三块,也就是我们会对这部分的知识推送三次。
老九君
2018/07/30
7910
浅谈计算机中的存储模型(一)物理内存
廖威雄: 学习Linux必备的硬件基础一网打尽
廖威雄,目前就职于珠海全志科技股份有限公司从事linux嵌入式系统(Tina Linux)的开发,主要负责文件系统和存储的开发和维护,兼顾linux测试系统的设计和持续集成的维护。
Linux阅码场
2019/07/31
1.1K0
廖威雄: 学习Linux必备的硬件基础一网打尽
操作系统(五)虚拟存储器管理
一次性和驻留性严重地降低内存的利用率,显著地减少了系统吞吐量。 研究表明,程序在执行过程中呈现局部性原理。
看、未来
2020/08/25
2K0
存储器及其管理方式
“计算机存储器包括主存和辅存,本文中存储器管理的对象主要是主存,也称内存。它的主要功能包括分配和回收主存空间、提高主存利用率、扩充主存、对主存信息实现有效保护。”
搬砖俱乐部
2019/07/08
1.7K0
存储器及其管理方式
采用虚拟存储技术_虚拟存储管理
虚拟地址空间—–分配给进程的虚拟内存 虚拟地址—–在虚拟内存中指令或数据的位置,该位置可以被访问,仿佛它是内存的一部分。
全栈程序员站长
2022/11/09
1.4K0
采用虚拟存储技术_虚拟存储管理
漫谈虚拟内存
如上图,程序1、程序2、程序3装入到内存,而程序2运行完成被换出,内存空闲出20k,然后进来程序4,大小为25K,此时,只有两处空闲块,10K和20K,没有一处是符合条件的,应该怎么办?一个明显的办法就是将两块空闲区域进行合并,形成一个大小为30K的空闲块满足程序4。
木可大大
2018/04/03
5.2K6
漫谈虚拟内存
相关推荐
操作系统之存储器管理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档