读懂操作系统之虚拟内存(一)

由于个人对虚拟内存这块特别感兴趣,所以就直接暂且跳过其他,接下来将通过几篇文章进行详细讲解,当然其他基础内容后续在我进行相应整体学习后也会同步输出文章,比如操作系统概念、程序链接、进程管理、页面置换算法、流水线、浮点指令、内存管理、磁盘管理等内容。不管周遭的环境如何,毕竟还很菜,坚持每天让自己进步一点点,放下暂时的焦虑,不如专注于眼前的学习,跟着我一起学习操作系统吧。

虚拟存储器设计初衷

缓存从高到低,主存可作为磁盘的缓存,我们将这项技术称作为虚拟存储器,基于历史观点,构造虚拟存储器的主要出于两个目的,其一是允许云计算在多个虚拟机之间有效而安全的共享存储器,其二则是受限的主存容量对程序设计所造成的极大影响。

有了虚拟存储器这样可确保每个程序只能对划分给它的那部分主存进行读写操作,而主存只需存放程序中的活跃区域。虚拟存储器实现程序地址空间到物理地址的转换,通过这种转换处理加强了各个程序地址之间的保护。若用户加载多个程序直接到主存,很显然最终可能会超过主存的容量,如此一来,将程序进行卸载或转入成为程序员不可推卸的责任,加重了程序员的负担,那么怎样才能将程序员从这种情况中解放出来呢?现代操作系统将主存提供了一种对主存的抽象概念,叫作虚拟内存,虚拟内存是硬件异常,硬件地址翻译、主存、磁盘文件和内核软件的完美交互,虚拟内存主要提供了三种能力:

(1)将主存看成是一个存储在磁盘上的地址空间的高速缓存(作为缓存)

(2)为每个进程提供一致的地址空间,从而简化内存管理(作为内存管理)

(3)防止每个进程的地址空间被其他进程所破坏(作为内存保护)。

映射原理:CPU生成一个虚拟地址(Virtual Address简称VA)来访问主存,但是在此之前需要将虚拟地址转换为物理地址,这个过程称作为地址转换或地址映射或地址翻译,为进行此操作需要CPU硬件和操作系统合作,通过内存管理单元(Memory Management Unit)上的地址翻译硬件,利用存储在主存上的查询表来翻译虚拟地址,该表的内容由操作系统管理。

地址翻译

虚拟内存系统将虚拟内存划分为固定大小的块,这个块我们称作为虚拟页(Virtual Page简称VP),同理将物理内存划分为物理页(Physical Page简称PP),也叫页帧(Page Frame)。这里我们需要明白虚拟地址、虚拟页、物理地址、物理页这四者之间的联系。如下图,通过CPU产生虚拟地址访问主存的物理地址,而虚拟存储器和物理存储器分别被划分成虚拟页和物理页,所以结果变成将虚拟页映射到物理页。

在虚拟存储器中,地址被划分为虚页号(Virtual Page Number简称VPN)和虚拟页页偏移(Virtual Page Offset简称VPO),如下为从虚拟页到物理页号(Physical Page Number简称PPN)的转换。物理页构成物理地址的高位部分,而页偏移保持不变,构成物理地址的低位部分。页偏移的位数决定了页的大小,当然,虚拟页地址可寻址的页数与物理地址可寻址的页数可以不同。

例如具有32位逻辑地址的操作系统,如果每个页面的大小为4KB,由于上述物理页号有18位,那么存储器物理页数为2^18,因此,逻辑上最多可以支持1GB的主存,但是实际上虚拟地址空间可支持4GB,如此为解决主存的受限控制。

和缓存机制一样,我们必须有某种机制来判断一个虚拟页是否缓存在DRAM中某一个地方,如果是,那么系统必须确定这个虚拟页存放在哪个物理页中,如果未命中,系统必须确定这个虚拟页存储在磁盘的哪个位置,然后在物理内存中选择一个牺牲页,并将虚拟页从磁盘复制到DRAM中,然后替换这个牺牲页。

此功能由软硬件共同提供,包括操作系统软件、MMU中的地址翻译硬件、存放在物理内存中的页表(Page Table简称PT)所决定,上述将虚拟页映射到物理页就是通过查询页表实现,一个页表是由页表条目(Page Table Entry简称PTE)的数组组成。如下为页表简要信息版本:

我们看到上述每个PTE是由一个有效位和一个包含物理页号或磁盘地址组成,有效位标识虚拟页是否被缓存在主存中, 若为1则说明该虚拟页已被缓存在主存中,若为0分为两种情况,可能是虚拟内存未创建虚拟页,也有可能是已创建虚拟页但还未缓存到主存,所以虚拟页集合由3个子集组成:

(1)虚拟内存系统还未分配或未创建

(2)已缓存在物理内存中的已分配页

(3)未缓存在物理内存中的已分配页

页表在主存中的位置由硬件决定,硬件包含一个指向页表首地址的页表基址寄存器(Page Table Base Register简称PTBR)。简要翻译过程如下图所示

我们进一步得出MMU将虚拟地址映射为物理地址的详细过程:CPU产生虚拟地址,然后从虚拟地址中得到虚拟页号,接下来通过将虚拟页号作为索引去查找页表,通过得到对应PTE上的有效位来判断当前虚拟页是否在主存中,若命中则将对应PTE上的物理页号和虚拟地址中的虚拟页偏移进行串联从而构造出主存中的物理地址,否则未命中(专业名词称为“缺页”),此时MMU将引发缺页异常,从CPU传递到操作系统内核处理缺页异常处理程序,此时将选择一个牺牲页并将对应所缺虚拟页调入并更新页表上的PTE,缺页处理程序再次返回到原来的进程,再次执行缺页指令,CPU重新将虚拟地址发给MMU,此时虚拟页已存在物理内存中,所以命中,最终将请求的字返回给处理器。详细过程如下:

进程的地址空间以及它在主存中可以访问的所有数据,都由驻存在主存中的页表所定义,操作系统只是简单的加载页表寄存器用来指向它所想激活的进程页表,而不是保存整个页表。

由于不同进程使用相同的虚拟地址,因此每个进程有各自的页表,操作系统负责分配物理主存和更新页表,因为我们通过将页表分离来保护进程,进而保证不同进程的虚拟地址空间不会发生任何冲突。上述我们已经得知,一个32位逻辑地址空间的系统,每个页面的大小为4KB(2^12),那么页表将包含(2^32/2^12)= 大约100万个页表条目即PTE,假设每个条目占4个字节,那么每个进程的页表将占用(4*(2^32/2^12))= 4MB的内存。

TLB加快地址翻译

我们知道每次CPU产生一个虚拟地址就必须通过MMU去查询页表从而得到PTE,但是页表存储在主存中,因此程序访存至少需要两次:第一次访存获取物理地址、第二次访存获得数据。

提高访问性能的关键在于依靠页表的访问局部性,当一个转换的虚拟页号被使用时,它可能在不久的将来会被再次用到,因为对该页中字的引用同时具有时间局部性和空间局部性。

为了消除这样的开销,在MMU中包括一个关于PTE的小的缓存,称为翻译后备缓冲器(Translation-Lookasice Buffer简称TLB),有些书中被称为快表,所以TLB存在的目的是:用于记录最近使用地址的映射信息的高速缓存,从而可以避免每次都访问页表。TLB是一个小的、虚拟寻址的缓存,其中每一行都保存着一个由单个PTE组成的块,TLB大概包含64-1024个PTE。如下图所示

从虚拟页号中提取出用于组选择和行匹配的索引和标记字段,如果TLB有 T= 2^t个组,那么TLB索引(TLBI)是由VPN的t个最低位组成,而TLB标记(TLBT)是由VPN中剩余的位组成。上述我们了解到虚拟地址由虚拟页号和虚拟页偏移量组成,在这里再进行补充:虚拟地址由虚拟页号(VPN)、虚拟页偏移量(VPO)、TLBI(TLB索引)、TLBT(TLB标记)组成,对于物理地址由物理页号(PPN)、物理页偏移量(PPO)、缓冲块内的字节偏移量(CO)、高速缓存索引(CI)、高速缓存标记(CT)组成。

那么利用TLB加快地址翻译的整个大概过程是怎样的呢?CPU产生一个虚拟地址,MMU从虚拟地址中提取出虚拟页号,然后从TLB中根据虚拟页号取出相应的PTE,进而通过物理页号和虚拟页偏移构造出物理地址,将其发送到高速缓存/主存,高速缓存/主存将返回的数据返回给CPU

现代操作系统都已有SRAM的高速缓存(一级缓存、二级缓存、三级缓存)

因为地址翻译硬件发生在访问高速缓存之前,所以我们到底是通过虚拟地址还是物理地址访问高速缓存呢?大多数都是选择物理地址访问高速缓存。整个过程如下图:

本节属于小试牛刀,只是从整体上去分析虚拟内存地址翻译原理,里面仍涉及太多细节,比如页面交换策略、页表和TLB所包含详细内容,多级页表、TLB查找PTE、TLB缺失等,下一节我们分析TLB缺失和页面交换具体原理。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Java基础]反射练习之越过泛型检查,运行配置文件制定内容

代码如下: package ReflectTest01;import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList;public class ReflectTest01 {public static void main(String[] args) throws NoSuchMethodException, InvocationTarg…

【Ids4实战】深究配置——用户信息操作篇

(此花无日不春风)其实IdentityServer4的小项目已经基本完结了,但是我总感觉还是有很多东西没有深入挖掘和研究的,这不,二群里有小伙伴问到了一个常见的问题,因为我去年都见到了,一直没有想过去解…

题目 1885: [蓝桥杯][2017年第八届真题]分巧克力+二分

题目: 题目描述 儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。 为了公平起见,小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克…

Sql Server之旅——第九站 看看DML操作对索引的影响

我们都知道建索引是需要谨慎的,当只有利大于弊的时候才适合建,同时也知道建索引是需要维护成本的,这个维护也就在于DML操作,下面具体看看到底DML对索引都有哪些内幕。。。。一:delete操作现在大家都已经知道索引是以B树…

Coins POJ - 1742(多重背包+是否装满问题)

题意: 给定n种面值的硬币面值分别为WiW_{i}Wi​个数为CiC_{i}Ci​,问用这些硬币可以组成1~m之间的多少面值。 题目: People in Silverland use coins.They have coins of value A1,A2,A3…An Silverland dollar.One day Tony opened his m…

[Java基础]反射获取成员方法并使用

代码如下: package ClassObjectPack01;import ClassObjectPack.Student;import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;public class ReflectDemo05 {public static void main(String[] args)…

副业刚需? 恐怕并不靠谱!

点击蓝字关注,回复“职场进阶”获取职场进阶精品资料一份上一篇文章推了我的星球,两天时间就有接近200位读者加入。有「热心朋友」帮我计算了下:你这两天收入快2万啊,你这副业做的挺好啊。很不客气的说,如果写写公号&a…

Wooden Sticks POJ - 1065(最大上升子序列+动态规划状态转移思维)

题意&#xff1a; 给你n个木棍的长度和重量&#xff0c;让其成为上升序列&#xff0c;如果不能达到&#xff0c;就需要重新一分钟设置。 a&#xff09;第一个木棍的准备时间为1分钟。 b&#xff09;在处理长度为l和重量为w的棒之后&#xff0c;如果l < l’并且w < w’&a…

[Java基础]Junit测试

Junit测试: 代码如下: package CalculatorPack;public class Calculator {public int add(int a,int b){return ab;}public int sub(int a,int b){return a-b;}}package CalculatorPack;import org.junit.Assert; import org.junit.Test;public class CalculatorTest {Testp…

15分钟为自己架设优雅如Github的代码仓库

前言Github大家都熟悉。除了开源的项目外&#xff0c;有时候&#xff0c;大家也会把自己或团队、公司的项目传到Github的私有仓库里&#xff0c;把Github当成自己的私人Git Server。但是&#xff0c;用Github会有一些问题&#xff1a;Github从国内访问不是很稳定&#xff0c;有…

Pseudoprime numbers POJ - 3641(快速幂+判素数)

题意&#xff1a; 给你两个数&#xff0c;p和a&#xff1b;满足两个条件&#xff1a; 1.p不是素数&#xff1b; 2.apa^{p}ap %pa; 满足则输出yes&#xff0c;反之输出no。 题目&#xff1a; Fermat’s theorem states that for any prime number p and for any integer a &g…

[Java基础]反射案列

pro.properties文件(该文件与ReflectTest01同处在同一个文件夹)&#xff1b; className domain.Person methodName eat代码如下: package domain;public class Student {public void sleep(){System.out.println("sleep...");} }package domain;public class Per…

[推荐]大量 Blazor 学习资源(三)

大量 Blazor 学习资源系列文章&#xff1a;[推荐]大量 Blazor 学习资源&#xff08;一&#xff09;[推荐]大量 Blazor 学习资源&#xff08;二&#xff09;这次主要内容有 Blazor 相关视频&#xff0c;因为本身视频是英文的&#xff0c;所以就保持原样了&#xff0c;描述没有翻…

The Water Bowls POJ - 3185(开关问题+暴力)

题意&#xff1a; 给20个水碗。朝上为‘0’或朝下为‘1’&#xff0c;每次操作使三个碗翻转&#xff0c;问使所有20个水碗都朝上&#xff0c;至少翻多少次&#xff1f; 题目&#xff1a; The cows have a line of 20 water bowls from which they drink. The bowls can be e…

基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(二)

上一篇使用HtmlAgilityPack抓取壁纸数据成功将图片存入数据库&#xff0c;本篇继续来完成一个全网各大平台的热点新闻数据的抓取。同样的&#xff0c;可以先预览一下我个人博客中的成品&#xff1a;https://meowv.com/hot ????????????&#xff0c;和抓取壁纸的套路…

Linear world POJ - 2674(弹性碰撞+技巧)

题意&#xff1a; 给你n个居民的起始位置&#xff0c;各自在长度为l的平台&#xff0c;以同样的速度向左或向右走&#xff0c;当碰见时往相反方向走&#xff0c;问最后掉下去的居民花费的时间以及姓名。 题目&#xff1a; The Disc, being flat, has no real horizon. Any a…

TechEmpower Web 框架性能第19轮测试结果正式发布,ASP.NET Core在主流框架中拔得头筹...

TechEmpower第19轮编程语言框架性能排行榜2020年5月28日正式发布,详见官方博客&#xff1a;https://www.techempower.com/blog/2020/05/28/framework-benchmarks-round-19/&#xff0c;TechEmpower基准测试有许多场景&#xff08;也称为测试类型&#xff09;&#xff0c;此次评…