操作系统存储器管理实验报告_读懂操作系统之虚拟内存(一)

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

虚拟存储器设计初衷

缓存从高到低,主存可作为磁盘的缓存,我们将这项技术称作为虚拟存储器,基于历史观点,构造虚拟存储器的主要出于两个目的,其一是允许云计算在多个虚拟机之间有效而安全的共享存储器,其二则是受限的主存容量对程序设计所造成的极大影响。 有了虚拟存储器这样可确保每个程序只能对划分给它的那部分主存进行读写操作,而主存只需存放程序中的活跃区域。虚拟存储器实现程序地址空间到物理地址的转换,通过这种转换处理加强了各个程序地址之间的保护。若用户加载多个程序直接到主存,很显然最终可能会超过主存的容量,如此一来,将程序进行卸载或转入成为程序员不可推卸的责任,加重了程序员的负担,那么怎样才能将程序员从这种情况中解放出来呢?现代操作系统将主存提供了一种对主存的抽象概念,叫作虚拟内存,虚拟内存是硬件异常,硬件地址翻译、主存、磁盘文件和内核软件的完美交互,虚拟内存主要提供了三种能力: 2b3f1f221e69e6b6997687fd32df17f9.gif

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

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

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

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

地址翻译

虚拟内存系统将虚拟内存划分为固定大小的块,这个块我们称作为虚拟页(Virtual Page简称VP),同理将物理内存划分为物理页(Physical Page简称PP),也叫页帧(Page Frame)。这里我们需要明白虚拟地址、虚拟页、物理地址、物理页这四者之间的联系。如下图,通过CPU产生虚拟地址访问主存的物理地址,而虚拟存储器和物理存储器分别被划分成虚拟页和物理页,所以结果变成将虚拟页映射到物理页。 b50b160519bc065dd48351b74bd8ddec.png 在虚拟存储器中,地址被划分为虚页号(Virtual Page Number简称VPN)和虚拟页页偏移(Virtual Page Offset简称VPO),如下为从虚拟页到物理页号(Physical Page Number简称PPN)的转换。物理页构成物理地址的高位部分,而页偏移保持不变,构成物理地址的低位部分。页偏移的位数决定了页的大小,当然,虚拟页地址可寻址的页数与物理地址可寻址的页数可以不同。 e61c5c3e2fc6870ca73e55408b2c0a90.png 例如具有32位逻辑地址的操作系统,如果每个页面的大小为4KB,由于上述物理页号有18位,那么存储器物理页数为2^18,因此,逻辑上最多可以支持1GB的主存,但是实际上虚拟地址空间可支持4GB,如此为解决主存的受限控制。 和缓存机制一样,我们必须有某种机制来判断一个虚拟页是否缓存在DRAM中某一个地方,如果是,那么系统必须确定这个虚拟页存放在哪个物理页中,如果未命中,系统必须确定这个虚拟页存储在磁盘的哪个位置,然后在物理内存中选择一个牺牲页,并将虚拟页从磁盘复制到DRAM中,然后替换这个牺牲页。 此功能由软硬件共同提供,包括操作系统软件、MMU中的地址翻译硬件、存放在物理内存中的页表(Page Table简称PT)所决定,上述将虚拟页映射到物理页就是通过查询页表实现,一个页表是由页表条目(Page Table Entry简称PTE)的数组组成。如下为页表简要信息版本: dde282bfaa82d255b51e752c60ccb4c8.png

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

2b3f1f221e69e6b6997687fd32df17f9.gif

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

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

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

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

a71d1ab28d5bda9f19f4eec6e736e540.png

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

4ef1e11e0fa314525a53865278f9fcda.png

进程的地址空间以及它在主存中可以访问的所有数据,都由驻存在主存中的页表所定义,操作系统只是简单的加载页表寄存器用来指向它所想激活的进程页表,而不是保存整个页表。 由于不同进程使用相同的虚拟地址,因此每个进程有各自的页表,操作系统负责分配物理主存和更新页表,因为我们通过将页表分离来保护进程,进而保证不同进程的虚拟地址空间不会发生任何冲突。上述我们已经得知,一个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。如下图所示

1c7742d78279117873b5ccf2809e8e37.png 从虚拟页号中提取出用于组选择和行匹配的索引和标记字段,如果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的高速缓存(一级缓存、二级缓存、三级缓存) 因为地址翻译硬件发生在访问高速缓存之前,所以我们到底是通过虚拟地址还是物理地址访问高速缓存呢?大多数都是选择物理地址访问高速缓存。整个过程如下图: 65083cf07bd371caeaade8fe752b6bef.png

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

完整虚拟存储管理器实验报告!一、实验目的请求页式虚存管理是常用的虚拟存储管理方案之一。通过请求页式虚存管理中对页面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求页式虚存管理的页面调度算法的理解。二、实验环境 Turbo C 2.0/3.0或VC++6.0三、实验内容本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFO和LRU算法进行页面置换的情形。其中虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。程序应允许通过为该进程分配不同的实页数,来比较两种置换算法的稳定性。四、实验说明 1.设计中虚页和实页的表示本设计利用C语言的结构体来描述虚页和实页的结构。pnpfntimepnpfnnext 虚页结构 实页结构在虚页结构中,pn代表虚页号,因为共10个虚页,所以pn的取值范围是0—9。pfn代表实页号,当一虚页未装入实页时,此项值为-1;当该虚页已装入某一实页时,此项值为所装入的实页的实页号pfn。time项在FIFO算法中不使用,在LRU中用来存放对该虚页的最近访问时间。在实页结构中,pn代表虚页号,表示pn所代表的虚页目前正放在此实页中。pfn代表实页号,取值范围(0—n-1)由动态指派的实页数n所决定。next是一个指向实页结构体的指针,用于多个实页以链表形式组织起来,关于实页链表的组织详见下面第4点。2.关于缺页次数的统计为计算命中率,需要统计在20次的虚页访问中命中的次数。为此,程序应设置一个计数器count,来统计虚页命中发生的次数。每当所访问的虚页的pfn项值不为-1,表示此虚页已被装入某实页内,此虚页被命中,count加1。最终命中率=count/20*100%。3.LRU算法中“最近最久未用”页面的确定为了能找到“最近最久未用”的虚页面,程序中可引入一个时间计数器countime,每当要访问一个虚页面时,countime的值加1,然后将所要访问的虚页的time项值设置为增值后的当前countime值,表示该虚页的最后一次被访问时间。当LRU算法需要置换时,从所有已分配实页的虚页中找出time值为最小的虚页就是“最近最久未用”的虚页面,应该将它置换出去。4.算法中实页的组织因为能分配的实页数n是在程序运行时由用户动态指派的,所以应使用链表组织动态产生的多个实页。为了调度算法实现的方便,可以考虑引入free和busy两个链表:free链表用于组织未分配出去的实页,首指针为free_head,初始时n个实页都处于free链表中;busy链表用于组织已分配出去的实页,首指针为busy_head,尾指针为busy_tail,初始值都为null。当所要访问的一个虚页不在实页中时,将产生缺页中断。此时若free链表不为空,就取下链表首指针所指的实页,并分配给该虚页。若free链表为空,则说明n个实页已全部分配出去,此时应进行页面置换:对于FIFO算法要将busy_head 所指的实页从busy链表中取下,分配给该虚页,然后再将该实页插入到busy链表尾部;对于LRU算法则要从所有已分配实页的虚页中找出time值为最小的虚页,将该虚页从装载它的那个实页中置换出去,并在该实页中装入当前正要访问的虚页。~
【实验目的】 1. 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解; 2. 熟悉虚存管理的各种页面淘汰算法; 3. 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 【实验准备】 1.虚拟存储器的管理方式  段式管理  页式管理  段页式管理 2.页面置换算法  先进先出置换算法  最近最久未使用置换算法  Clock置换算法  其他置换算法 【实验内容】 1. 实验题目 设计一个请求页式存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列,使得 50%的指令是顺序执行的。25%的指令均匀地散布在前地址部分,25%的地址是均匀地散布在后地址部分。为简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。 2. 具体做法 产生一个需要访问的指令地址流;指令合适的页面尺寸(例如以 1K或2K为1页);指定内存页表的最大长度,并对页表进行初始化;每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况;逐个地址访问,直到所有地址访问完毕。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值