层次结构存储系统

目录

6.5 虚拟存储器

  • 虚拟存储器的基本概念
  • 虚拟地址空间
  • 虚拟存储器的实现
  • 存储保护

6.6 IA-32/Linux中的地址转换

  • 逻辑地址到线性地址的转换
  • 线性地址到物理地址的转换

6.7 小结


虚拟存储器

其基本思想是,程序员在一个不受物理内存空间限制并且比物理内存空间大得多的虚拟的逻辑地址空间中编写程序,就好像每个程序都独立拥有一个巨大的存储空间一样。程序执行的过程中,把当前执行的一部分程序和相应的数据调入主存,其他暂不用的部分暂时存放在磁盘上。

6.5.1 虚拟存储器的基本概念

在采用虚拟存储技术的计算机中,指令执行时,通过存储器管理部件将指令中的逻辑地址(也称虚拟地址虚地址)转换为主存的物理地址(也称主存地址实地址)。在地址转换过程中由硬件检查是否发生了访问信息不存在或者地址越界或者访问越权等情况。若发现信息不在主存,则由操作系统将数据从磁盘读到主存。若发生地址越界或访问越权,则由操作系统进行相应的异常处理。由此可以看出,虚拟存储技术既解决了编程空间受限的问题,又解决了多道程序共享主存代理的安全等问题。

层次结构存储系统_第1张图片
image.png

一般情况下,地址空间包括:

  • 只读区(代码和只读数据)
  • 可读可写数据区(初始化数据和未初始化数据)
  • 动态的堆区和栈区

6.5.2 虚拟地址空间
虚拟存储机制为程序提供了一个极大的虚拟地址空间(也称为逻辑地址空间),它是主存和磁盘存储器的抽象。虚存机制带来了一个抽象,使得每个进程好像都独占使用主存,并且主存空间极大。这有三个好处:

  • 每个进程具有一致的虚拟地址空间,从而可以简化存储管理
  • 它把主存看成是磁盘存储器的一个缓存,在主存中仅保存当前活动的程序段和数据区,并根据需要在磁盘和主存之间进行信息交换,通过这种方式,使有限的主存空间得到了有效利用
  • 每个进程的虚拟地址空间是私有的,因此,可以保护各自进程不被其他进程破坏


    层次结构存储系统_第2张图片
    image.png

虚拟地址空间分为两大部分:

  • 内核虚拟存储空间(内核空间)
  • 用户虚拟存储空间(用户空间)

内核空间在0xc0000000以上的高端地址上,用来存放操作系统内核代码和数据等,其中内核代码和数据区在每个进程的地址空间中都相同。用户程序没有权限访问内核区。

用户空间用来存放进程的代码和数据等,它又被分为以下几个区域:

  • 用户栈。用来存放程序运行时过程调用的参数、返回值、返回地址、过程局部变量等,随着程序的执行,该区会不断动态地从高地址向低地址增长或反方向减退。
  • 共享库。用来存放公共的共享函数库代码。
  • 。用于动态申请存储区。申请一块内存时,动态地从低地址向高地址增长。
  • 可读写数据区。存放进程中的静态全局变量,堆区从该区域的结尾处开始向高地址增长。
  • 只读数据和代码区。存放进程中的代码和只读数据。

每个区域都有相应的起始位置,堆区和栈区相向生长,栈区从内核起始位置0xc0000000开始向低地址增长,栈区和堆区合起来称为堆栈,其中的共享库映射区从0x40000000开始向高地址增长。只读区(代码和只读数据)从0x08048000开始向高地址增长。

为了便于对存储空间的管理和存储保护,在规划存储映像时,通常将内核空间和用户空间分在两端。在用户空间又把动态区域和静态区域分在两端。静态区域中把可读写区和只读区分在两端。这样的存储映像,便于每个区域的访问权限设置,因而有利于存储保护和存储管理。

从上图可以看出,一个进程的虚拟地址空间中有一些“空洞”。例如,堆区和栈区都是动态生长的,因而在栈和共享库映射区之间、堆和共享库映射区之间都可能没有内容存在。这些没有任何内容相关联的页称为“未分配页”;对于代码和数据等有内容的区域所关联的页面,称为“已分配页”。已分配页中又有两类:已调入主存而被缓存在DRAM中的页面称为“缓存页”;未调入主存而存在磁盘上的页称为“未缓存页”。因此,任何时刻一个进程中的所有页面被划分为三个不同页面的集合:

  • 未分配页集合
  • 缓存页集合
  • 未缓存页集合

6.5.3 虚拟缓存器的实现

要实现虚拟存储器,必须考虑交换块大小问题、映射问题、替换问题、写一致性问题等。根据对这些问题解决方法的不同,虚拟存储器分成三种不同的类型:

  • 分页式
  • 分段式
  • 段页式
  1. 分页式虚拟存储器

在分页式虚拟存储器中,主存储器和虚拟地址空间都被划分成大小相等的页面,磁盘和主存之间按页为单位交换信息。通常把虚拟地址空间中的页称为虚拟页、逻辑页或虚页;主存空间中的页称为页框、物理页或实页。

虚拟存储器管理方式采用“请求分页”思想,每次访问仅将当前需要的页面调入主存,而进程中其他不活跃的页面放在磁盘上。当访问某个信息所在页不在主存时发生缺页异常,此时,硬件将调出OS内核中的缺页处理程序,将缺失页面从磁盘调入主存。

与主存块相比,虚拟页的大小要大得多。因为DRAM比SRAM大约慢10~100倍,而磁盘比DRAM大约慢100000多倍,所以进行缺页处理所花的代价比cache缺失损失大得多而且,根据磁盘的特性,磁盘扇区定位所用的时间要比磁盘读写一个数据的时间长大约100000倍,也即对扇区第一个数据的读写比随后数据的读写慢100000倍。考虑到缺页代价的巨大和磁盘访问第一个数据的开销,通常将主存和磁盘之间交换的页设定得比较大。

因为缺页处理代价较大,所以提高命中率是关键。因此,在主存页框和虚拟页之间采用全相联映射方式。此外,当进行写操作时,由于磁盘访问速度很慢,所以,不能每次写操作都同时写DRAM和磁盘,因而,在处理一致性问题时,采用回写(write back)方式,而不用全写(write through)方式。

因为在虚拟存储机制中采用全相联映射,所以每个虚拟页可以存放到对应主存区域的任何一个空闲页框中。因此,与cache一样,必须要有一种方法来确定虚拟地址空间中各个虚拟页所存放的主存页框号或者在磁盘上的存储位置。虚拟存储管理机制中用页表来描述这种对应关系。

你可能感兴趣的:(层次结构存储系统)