虚拟存储 分段分页段页解读

目录

虚拟存储概念

背景

局部性原理 

虚拟存储器定义 

 虚拟存储器的实现?

分页存储管理 

分页存储的背景

分页存储管理的基本方法

​编辑分页存储的地址变换

扫描二维码关注公众号,回复: 15608961 查看本文章

访问内存的有效时间

两级和多级页表

反置页表(Inverted Page Table)

分段存储管理

分段存储管理方式的引入

分段系统的基本原理

分页和分段的主要区别 

信息共享

分页系统中对程序和数据的共享

分段系统中程序和数据的共享 

段页式存储管理

基本原理

地址变换过程 


虚拟存储概念

背景

如果一个作业,需要全部装入内存后方能运行,会有什么情况?
(1) 有的作业很大,其所要求的内存空间超过了内存总容量,作业不能全部被装入内存,致使该作业无法运行;
(2) 有大量作业要求运行,但由于内存容量不足以容纳所有这些作业,只能将少数作业装入内存让它们先运行,而将其它大量的作业留在外存上等待

特点:
(1) 一次性
(2) 驻留性

局部性原理 

程序运行时存在的局部性现象,很早就已被人发现,但直到1968年,P.Denning才真正指出:程序在执行时将呈现出局部性规律,即在一较短的时间内,程序的执行仅局限于某个部分,相应地,它所访问的存储空间也局限于某个区域。

(1) 时间局限性。
(2) 空间局限性。

应用程序在运行之前没有必要将之全部装入内存,而仅须将那些当前要运行的少数部分数据先装入内存便可运行,其余部分暂留在盘上。

虚拟存储器定义 

当用户看到自己的程序能在系统中正常运行时,他会认为,该系统所具有的内存容量一定比自己的程序大,或者说,用户所感觉到的内存容量会比实际内存容量大得多。但用户所看到的大容量只是一种错觉,是虚的,故人们把这样的存储器称为虚拟存储器。

虚拟存储器的三个重要特征:
(1) 多次性。
(2) 对换性。
(3) 虚拟性。

 虚拟存储器的实现?

具体怎么实现呢?是将整个程序一起载入内存中吗?

不是!采用离散存储方式

离散存储方式
(1) 分页存储管理方式。
(2) 分段存储管理方式。
(3) 段页式存储管理方式。

分页存储管理 

分页存储的背景

引入分页: 解决内存分区导致的内存效率问题。

为了让面包没有谁都不想要的碎末:将面包切成片,将内存分成页!针对每个内存请求,系统一页一页的分配。

内存分页中,每页的大小通常是固定的,常见的页大小有 4KB、8KB、16KB、32KB 等。选择页大小时需要考虑以下因素:
1. 内存利用率:较小的页大小可以更好地利用内存空间。但是,页越小,页表的项数就越多,页表占用的内存空间就越大。
2. 外部碎片:过小的页大小容易导致外部碎片,即内存中的一些空闲区域无法被利用。
3. 内部碎片:过大的页大小容易导致内部碎片,即实际使用的空间比页的大小小,导致浪费。

通常来说,4KB 是最常用的页大小,因为它可以更好地平衡内存利用率和页表大小。而对于需要处理大量大型数据的应用程序,较大的页大小可以提高数据访问速度,但是可能会降低内存利用率。

分页存储管理的基本方法

页面和物理块
(1) 页面。
(2) 页面大小。

地址结构
分页地址中的地址结构如下:

对某特定机器,其地址结构是一定的。若给定一个逻辑地址空间中的地址为A,页面的大小为L,则页号P和页内地址d可按下式求得: 

 

 页表

在分页系统中,允许将进程的各个页离散地存储在内存的任一物理块中,为保证进程仍然能够正确地运行,即能在内存中找到每个页面所对应的物理块,系统又为每个进程建立了一张页面映像表,简称页表。

分页存储的地址变换

基本的地址变换机构

进程在运行期间,需要对程序和数据的地址进行变换,即将用户地址空间中的逻辑地址变换为内存空间中的物理地址,由于它执行的频率非常高,每条指令的地址都需要进行变换,因此需要采用硬件来实现(MMU)。页表功能是由一组专门的寄存器来实现的。一个页表项用一个寄存器

 页表指针存在PCB中

具有快表的地址变换机构

由于页表是存放在内存中的,这使CPU在每存取一个数据时,都要两次访问内存。第一次是访问内存中的页表,从中找到指定页的物理块号,再将块号与页内偏移量W拼接,以形成物理地址。第二次访问内存时,才是从第一次所得地址中获得所需数据(或向此地址中写入数据)。因此,采用这种方式将使计算机的处理速度降低近1/2。可见,以此高昂代价来换取存储器空间利用率的提高,是得不偿失的。

访问内存的有效时间

从进程发出指定逻辑地址的访问请求,经过地址变换,到在内存中找到对应的实际物理地址单元并取出数据,所需要花费的总时间,称为内存的有效访问时间(Effective Access Time,EAT)。假设访问一次内存的时间为t:

1)在基本分页存储管理方式中,有效访问时间分为第一次访问内存时间(即查找页表对应的页表项所耗费的时间t)与第二次访问内存时间(即将页表项中的物理块号与页内地址拼接成实际物理地址所耗费的时间t)之和:

                                                   EAT = t + t = 2t

2)在引入快表的分页存储管理方式中,通过快表查询,可以直接得到逻辑页所对应的物理块号,由此拼接形成实际物理地址,减少了一次内存访问,缩短了进程访问内存的有效时间。但是,由于快表的容量限制,不可能将一个进程的整个页表全部装入快表,所以在快表中查找到所需表项存在着命中率的问题。所谓命中率,是指使用快表并在其中成功查找到所需页面的表项的比率。这样,在引入快表的分页存储管理方式中,有效访问时间的计算公式即为: 

                                        EAT=а×λ+(t+λ)(1-а)+t=2t+λ-t×а

 上式中,λ表示查找快表所需要的时间,а表示命中率,t表示访问一次内存所需要的时间。

两级和多级页表

两级页表(Two-Level Page Table)
针对难于找到大的连续的内存空间来存放页表的问题,可利用将页表进行分页的方法,使每个页面的大小与内存物理块的大小相同,并为它们进行编号,即依次为0# 页、1# 页,...,n# 页,然后离散地将各个页面分别存放在不同的物理块中。同样,也要为离散分配的页表再建立一张页表,称为外层页表(Outer Page Table),在每个页表项中记录了页表页面的物理块号。

 两级页表的地址变换

需要增设一个外层页表寄存器,用于存放外层页表的始址,并利用逻辑地址中的外层页号作为外层页表的索引,从中找到指定页表分页的始址,再利用P2作为指定页表分页的索引,找到指定的页表项,其中即含有该页在内存的物理块号,用该块号P和页内地址d即可构成访问的内存物理地址。图示出了两级页表时的地址变换机构。

多级页表

对于32位的机器,采用两级页表结构是合适的,但对于64位的机器,采用两级页表是否仍然合适,须做以下简单分析。如果页面大小仍采用4 KB即212 B,那么还剩下52位,假定仍按物理块的大小(212位)来划分页表,则将余下的42位用于外层页号。此时在外层页表中可能有4096 G个页表项,要占用16384 GB的连续内存空间。因此,需要多级页表。

多级页表是将虚拟地址划分成多个级别,每个级别都有一个对应的页表,每个页表都只包含一部分虚拟地址的映射信息。其地址变换同两级页表类似,只是中间有多级索引。

优点:
可以处理大量的虚拟地址空间,因为每个页表只需要包含部分虚拟地址的映射信息。此外,多级页表还可以减少页表的大小,因为每个页表都只包含一部分虚拟地址映射信息。减少了每个页表的大小,提高了内存利用率。

缺点:
在查找物理地址时需要多次访问页表,从而导致性能下降。

反置页表(Inverted Page Table)

1. 反置页表的引入
在分页系统中,为每个进程配置了一张页表,进程逻辑地址空间中的每一页,在页表中都对应有一个页表项。在现代计算机系统中,通常允许一个进程的逻辑地址空间非常大,因此就需要有许多的页表项,而因此也会占用大量的内存空间。所以引入反置页表。

2. 反置页表的原理
将每一块物理内存映射到一个页面表项上,而不是将每一个虚拟地址映射到一个页面表项上。这种数据结构的优点是可以降低页面表的大小,因为每个进程只需要一个反置页表,而不是每个进程都需要一个页面表。此外,反置页表还可以提高页面替换算法的效率,因为它可以快速地找到某个物理页面所对应的虚拟页面,从而在进行页面替换时可以快速找到需要替换的页面。

缺点,比如查找某个虚拟地址所对应的物理地址时需要遍历整个反置页表,会给性能带来一些影响。

3. 地址变换
在利用反置页表进行地址变换时,是根据进程标识符和页号,去检索反置页表。如果检索到与之匹配的页表项,则该页表项(中)的序号i便是该页所在的物理块号,可用该块号与页内地址一起构成物理地址送内存地址寄存器。若检索了整个反置页表仍未找到匹配的页表项,则表明此页尚未装入内存。对于不具有请求调页功能的存储器管理系统,此时则表示地址出错。对于具有请求调页功能的存储器管理系统,此时应产生请求调页中断,系统将把此页调入内存。 

分段存储管理

分段存储管理方式的引入

怎么样支持大地址空间? 设想有一个32位地址空间,通常的程序只会使用几兆的内存,怎么支持?

程序由若干部分组成,每个部分有各自的特点、用途:代码段只读,代 码/数据段不会动态增长...

1. 方便编程
通常,用户把自己的作业按照逻辑关系划分为若干个段,每个段都从0开始编址,并有自己的名字和长度。因此,程序员们都迫切地需要访问的逻辑地址是由段名(段号)和段内偏移量(段内地址)决定的,这不仅可以方便程序员编程,也可使程序非常直观,更具可读性。例如,下述的两条指令便使用段名和段内地址:
LOAD 1,[A] |〈D〉;
STORE 1,[B] |〈C〉;

2. 信息共享
在实现对程序和数据的共享时,是以信息的逻辑单位为基础的。比如,为了共享某个过程、函数或文件。分页系统中的“页”只是存放信息的物理单位(块),并无完整的逻辑意义,这样,一个可被共享的过程往往可能需要占用数十个页面,这为实现共享增加了困难。

3. 信息保护
信息保护同样是以信息的逻辑单位为基础的,而且经常是以一个过程、函数或文件为基本单位进行保护的。

4. 动态增长
在实际应用中,往往存在着一些段,尤其是数据段,在它们的使用过程中,由于数据量的不断增加,而使数据段动态增长,相应地它所需要的存储空间也会动态增加。然而,对于数据段究竟会增长到多大,事先又很难确切地知道。对此,很难采取预先多分配的方法进行解决。

5. 动态链接
为了提高内存的利用率,系统只将真正要运行的目标程序装入内存,也就是说,动态链接在作业运行之前,并不是把所有的目标程序段都链接起来。当程序要运行时,首先将主程序和它立即需要用到的目标程序装入内存,即启动运行。而在程序运行过程中,当需要调用某个目标程序时,才将该段(目标程序)调入内存并进行链接。

分段系统的基本原理

1. 分段
在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。例如,有主程序段MAIN、子程序段X、数据段D及栈段S等,如图分段地址中的地址的结构


2. 段表
在前面所介绍的动态分区分配方式中,系统为整个进程分配一个连续的内存空间。而在分段式存储管理系统中,则是为每个分段分配一个连续的分区。进程中的各个段,可以离散地装入内存中不同的分区中。为保证程序能正常运行,就必须能从物理内存中找出每个逻辑段所对应的位置。

 3. 地址变换
为了实现进程从逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度TL。在进行地址变换时,系统将逻辑地址中的段号与段表长度TL进行比较。若S>TL,表示段号太大,是访问越界,于是产生越界中断信号。若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址。然后,再检查段内地址d是否超过该段的段长SL。若超过,即d>SL,同样发出越界中断信号。若未越界,则将该段的基址d与段内地址相加,即可得到要访问的内存物理地址。图示出了分段系统的地址变换过程。

分页和分段的主要区别 

(1) 页是信息的物理单位。
(2) 页的大小固定且由系统决定。
(3) 分页的用户程序地址空间是一维的。

信息共享

分页系统中对程序和数据的共享

在分页系统中,虽然也能实现对程序和数据的共享,但远不如分段系统来得方便。示例如下。

分段系统中程序和数据的共享 

在分段系统中,由于是以段为基本单位的,不管该段有多大,我们都只需为该段设置一个段表项,因此使实现共享变得非常容易。我们仍以共享editor为例,此时只需在(每个)进程1和进程2的段表中,为文本编辑程序设置一个段表项,让段表项中的基址(80)指向editor程序在内存的起始地址。如图所示是分段系统中共享editor的示意图。

段页式存储管理

基本原理

段页式系统的基本原理是分段和分页原理的结合,即先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。图(a)示出了一个作业地址空间的结构。该作业有三个段:主程序段、子程序段和数据段;页面大小为 4 KB。在段页式系统中,其地址结构由段号、段内页号及页内地址三部分所组成,如图(b)所示。

在段页式系统中,为了实现从逻辑地址到物理地址的变换,系统中需要同时配置段表和页表。段表的内容与分段系统略有不同,它不再是内存始址和段长,而是页表始址和页表长度。图示出了利用段表和页表进行从用户地址空间到物理(内存)空间的映射 

地址变换过程 

在段页式系统中,为了便于实现地址变换,须配置一个段表寄存器,其中存放段表始址和段长TL。进行地址变换时,首先利用段号S,将它与段长TL进行比较。若S < TL,表示未越界,于是利用段表始址和段号来求出该段所对应的段表项在段表中的位置,从中得到该段的页表始址,并利用逻辑地址中的段内页号P来获得对应页的页表项位置,从中读出该页所在的物理块号b,再利用块号b和页内地址来构成物理地址。图示出了段页式系统中的地址变换。

猜你喜欢

转载自blog.csdn.net/m0_62436868/article/details/131499312