现代操作系统学习笔记——分页存储

背景知识

内存是现代计算机系统操作的核心。内存由大量的字或字节队列构成,每个字或字节都有它自己的地址。CPU根据程序计数器的值从内存中取指令(fetch instruction)。这些指令可能会从指定的内存地址读取数据或将数据存入到指定的内存地址

例如,在一个典型的指令执行周期(instruction-execution cycle)里,首先要从内存中取出一条指令。然后,对这条指令进行解码(decode),这有可能需要从内存中取出操作数。在用这个操作数执行指令之后,可能需要将结果存储回内存中。内存单元只会看到内存地址流



地址绑定

通常程序以二进制可执行文件的方式驻留在磁盘中。必须要把程序装入内存并将其置于一个进程中才可以执行它。根据所采用的内存管理策略,进程在执行期间可能会在磁盘和内存之间移动。在磁盘中等待执行的进程形成了输入队列(input queue)

通常是从输入队列中选择一个进程并将其装入内存。进程在执行过程中从内存中获取指令和数据。最终,进程终止,宣告释放它所占用的内存空间

指令和数据到内存地址空间的绑定通常有如下的几步:

  • 编译时间(compile time):如果在编译时间知道进程将处于内存什么位置,那么就可以产生绝对代码
  • 装入时间(load time):如果在编译时间不知道进程将处于内存的什么位置,那么编译程序必须要产生可重定位代码
  • 执行时间(execution time):如果在进程执行期间可以把它从内存的一段移动到另一段,那么必须要把绑定延迟到运行时间(run time)

逻辑地址空间和物理地址空间

CPU产生的地址通常被称为逻辑地址(logical address).而物理地址(physical address)则是内存单元的地址,也就是被装入内存的内存地址寄存器(memory-address register)的地址

编译时和装入时的地址绑定产生的逻辑地址和物理地址是一样的。然而,执行时间地址绑定机制则产生不同的逻辑地址和物理地址。此时,我们往往把逻辑地址视为虚拟地址(ps:这里逻辑地址和虚拟地址是用一概念)。程序产生的所有逻辑地址形成的逻辑地址空间(logical-address space);这些逻辑地址空间对应的物理地址构成了物理地址空间(physical-address space)。因此,在执行时地址绑定机制中,逻辑地址和物理地址是不同的

运行时从虚拟地址到物理地址的映射由一个硬件设备完成,它被称为内存管理单元(MMU, memory-management unit)。有多种不容的方法可以完成这种映射。

现在把基址寄存器(base register)称为重定位寄存器(relocation register)。用户程序产生的地址在发送到内存时与重定位寄存器的值相加。例如,如果基地址是14000,那么用户访问的地址346将被映射到14346.

我们现在知道了两种不同类型的地址:逻辑地址(范围从0到max)和物理地址(对于基地址R,物理地址范围是从R+0到R+max)。用户只产生逻辑地址并认为进程运行在从0到max这样的地址空间中。用户提供逻辑地址,在使用逻辑地址之前必须要把它们转换成物理地址

现代操作系统学习笔记——分页存储_第1张图片


动态装入

讨论至今,必须要把整个程序和进程的数据装入到内存才可执行进程。进程的大小受物理内存大小的限制。为了获得更好的利用率,我们使用动态装入。利用动态装入,程序只有在执行之前才能被装入内存。所有的程序可以重定位装入格式保留在磁盘中。主程序被装入内存并执行。当一个程序调用另一个程序时,这个程序首先检查另一个程序(被调用的程序)是否已经被装入内存。如果没有,那么调用可重定位链接装入程序,把所需的程序装入内存并更新程序的地址表来反应这次变动。然后把控制转交给新装入的程序

动态装入的优点是无需把不需执行的程序装入内存。如果程序中有大量的代码是用来处理不常发生的事件(如错误处理函数),那么动态装入是十分有用的。在这种情况下,虽然整个程序可能非常庞大,但是使用的部分很小

内存保护

在讨论内存分配之前,必须讨论内存保护的问题——保护操作系统免于用户进程的侵扰,并保护用户进程免于其他用户进程的侵扰。通过一个重定位寄存器(relocation register)和一个界限寄存器(limit register)可以提供这种保护。重定位寄存器存储的是物理地址的最小值; 界限寄存器存储了逻辑地址空间的大小(例如:relocation = 100040, limit = 74600)。利用重定位寄存器和界限寄存器,要求逻辑地址必须小于界限寄存器的值; MMU将重定位寄存器的值与逻辑地址相加既可以把逻辑地址映射为物理地址。映射产生的地址被发送到内存

现代操作系统学习笔记——分页存储_第2张图片


内存分配

最简单的内存分配方法是将内存分为多个固定大小的区(partition)。这样,多道程序受限于区的数目。在这种多分区分配方法(multiple-partition method)中,当一个区被释放时,就从输入队列中选择一个进程并将其载入一个空闲区中。当这个进程终止后,这个分区又可以为其它进程所用。这种方法最在被用于IBM OS/360操作系统,现在不再使用。

操作系统保留着一个表来指示内存中的哪一部分可用,哪一部分被占用。最初,所有内存对用户进程有效,并被当作一个大的有效内存块,一个分区。当一个进程到达并需要内存时,我们为它寻找一个足够大的分区。如果找到一个,我们只分配所需的内存,留下其余有效内存满足日后所用。

进程进入系统之后被置于输入队列中。操作系统计算每个进程的内存需求和有效内存空间来决定分配给每个进程多少内存。进程分配到内存后被载入内存并开始竞争CPU。当进程终止时,它释放占用的内存,操作系统可以把这段内存分配给输入队列中的另一个进程

我们随时有一个有效块大小列表和输入队列列表。操作系统根据调度算法对输入队列排序。操作系统把内存分配给各个进程,直到所剩的内存不满足下一个进程,或者说没有足够大的有效内存块容纳这个进程。然后,操作系统等到出现下一个足够大的有效内存块,或者跳过这个进程,沿输入队列向下搜寻,看看能不能找到内存需求较小的进程

动态内存分配问题(dynamic storage-allocation problem) 考虑如何从空闲分区列表中找到内存满足大小为n的请求。有许多方法可以解决这个问题。系统搜寻整个空闲分区列表来决定最好分配哪个连续空间。最常用的策略是首先适应(first-fit)、最佳适应(best-fit)、最差适应(worst-fit)策略
  • 首先适应策略:分配第一个足够大的连续空间。可以从连续空间列表的最开头开始搜寻,也可以从上一次搜寻的结尾开始。找到一个足够的大空闲空间时停止搜寻
  • 最佳适应策略:分配空间足够大的连续空间中最小的那个。必须搜寻整个列表,除非列表按大小排序。这个策略将产生最小的剩余空间
  • 最差适应策略:分配最大的连续空间。也必须搜寻整个列表,除非列表按大小排序

碎片

碎片有外部碎片和内部碎片
  • 外部碎片:伴随着进程的装入和移除,空闲内存空间被分成了众多的小块。当这些存储的内存空间的总大小可以满足一个请求时,外部碎片存在,但它是不连续的(这样就不能满足请求了)
  • 内部碎片:考虑一个连续空间是18464byte,假设一个进程需要18462byte内存。如果我们分配内存,就会剩下2byte的连续空间。通常把物理内存分成固定大小的块(fixed-sized block),以块大小为单元分配内存。利用这种方法,分配给进程的内存可能会比请求的内存稍大。块内多余的内存就是内部碎片(inter fragmentation)——内存在一个块内部,但是不被使用

The difference between these two numbers is internal fragmentation -- memory that is internal to a partition but is not used

外部碎片问题的一个解决方法是紧凑(compaction).紧凑是为了将内存中的内容移动到一起以合并零碎的空闲内存空间。紧凑并不总是可行。如果采用静态重定位,在汇编或装入时完成,那么就不可以进行紧凑;只有采用动态重定位,在执行时完成,才可以进行紧凑。当可以紧凑时,我们就要判断紧凑的代价。

最简单的方法是将所有的进程向内存的一侧移动;所有的空闲分区就会移动到令一侧,产生一个很大的可用连续分区。这种方法代价太高了

另一种方法是允许不连续的连续逻辑地址空间,这样可以把进程分配到不连续的物理内存中。有两种互补的机制可以实现这种算法:分页机制和分段机制。这两种机制也可以组合在一起使用

分页机制

分页机制(paging)是一种内存管理策略,这种策略允许进程拥有不连续的物理地址空间。

基本方法

我们把物理内存分成固定大小的块,称为帧(frame)。也把逻辑内存分成同样大小的块,称为页(page)。当一个进程执行时,它的页从后备存储器装入到有效物理帧中。后备存储器也被分为固定大小的块,这些块的大小与内存帧的大小相同。

分页机制的硬件支持如图所示。CPU产生的地址分为两个部分:页号(page number)和页偏移(page offset)。页号用于索引页表(page table)。页表包含了物理内存中每个页的基地址。把这个基地址与页偏移相结合生成发送到内存单元的物理地址。

现代操作系统学习笔记——分页存储_第3张图片



页的大小(也就是帧的大小)由硬件定义,通常是2的幂,根据计算机体系结构,通常每页在512byte到16M之间。通常选择2的幂作为页面大小可以很容易的把逻辑地址转换成页号和页偏移。如果逻辑地址空间是2^m,页面大小是2^n(byte),那么逻辑地址的高m-n位是页号,低n位是页偏移。这样,逻辑地址的形式如下:



作一个具体的例子。一道面试题目(腾讯)

页式存储系统的逻辑地址是由页号和页内地址两部分组成,地址变换过程如下图所示。假定页面大小为8K,图中所示的十进制逻辑地址9612经过地址变换后,形成的物理地址a应为十进制的所少?

现代操作系统学习笔记——分页存储_第4张图片

分析如下:

页号 = 9612 / 8 × 1024 = 1

页内偏移 = 9612 % (8 × 1024) = 1420

逻辑地址的页号1对应物理地址页号3, 因此物理地址 = 3 × 8 × 1024 + 1420 = 25996


你可能感兴趣的:(现代操作系统学习笔记——分页存储)