操作系统 - 页式内存管理

页式内存管理是一种内存空间存储管理的技术,由于它不要求进程的程序段和数据在内存中连续存放,从而有效地解决了碎片问题。

页式内存管理

一般来说,页式内存管理会将内存的物理空间分成若干个固定大小的 ,在 Linux 下,一般为 4KB。同时将进程的逻辑空间也分成和块大小相同的。 然后将进程的每一页离散的存储到对应的块中。由于进程的最后一页经常不能用完,会产生页面内碎片。

进程和内存的映射

地址结构

对于特定的机器结构,其地址结构是一样的。给定一个逻辑地址 A,页面的大小为 L,则页号和页内偏移量可由如下图所示公示求得。

逻辑地址

页号 P = 取整 (A / L)

页内偏移量 W = A % L

逻辑地址转换

如下图所示,如果要访问该进程逻辑地址为130的物理地址,该如何转换?

地址映射

  1. 逻辑地址为130,找到对应的页号,即2号页。
  2. 逻辑地址为130相较于2号页的首地址100,偏移量为30。
  3. 找到2号页在内存中的物理首地址,在图中箭头所指部分,为450。
  4. 逻辑地址为130对应的实际物理地址为在内存中的起始位置450+偏移量30=480

逻辑地址A对应的物理地址 = 页面对应的物理块号起始地址 + 页内偏移量

页表

在地址转换中,会有根据页号查找内存中的物理首地址这一步,该步骤就会用到页表

操作系统会为每个进程建立一张页表,以知晓进程的每个页面在内存中的位置,页表通常放在 PCB(进程控制块)中。

  1. 一个进程对应一张页表
  2. 进程的每个页面对应一个页表项
  3. 每个页表项由“页号”和“块号”组成
  4. 页表记录进程页面和实际存放内存块的映射关系

页表

基本地址变换机构

综合实现从逻辑地址到物理地址的转换。

一般地,在系统中只设置一个页表寄存器 PTR(Page-Table Register),在其中存放页表在内存的始址和页表的长度。 平时,进程未执行时,页表的始址和页表长度存放在本进程的 PCB 中。当调度程序调度到某进程时,才将这两个数据装入页表寄存器中。

基本地址变换

  1. 根据逻辑地址 A 计算出页号、页内偏移量。
  2. 判断页号是超超过页表长度,如果超过,则越界中断。
  3. 若未越界,则根据页号 P 找到对应的块号6。
  4. 内存块号6的首地址加上页内偏移量 W 即为实际的物理地址。

例题解析

【例1】已知某分页系统,主存容量为 64K 字节,页面大小为 1K,对一个 4 页的作业,其 0、1、2、3 页分别被 分配到内存的 2、4、6、7 块中,试

(1) 将十进制的逻辑地址 1023、2500、3500、4500转换成物理地址;

(2) 以十进制的逻辑地址 1023 为例画出地址变换过程图。

  • 由题可知,页面大小 L = 1KB = 1024b,分别计算上述逻辑地址对应的页号 P 和 页内偏移量(页内地址)W。
  • 根据公式: 页号 P = 逻辑地址 / 页面大小 ; 页内地址 W = 逻辑地址 % 页面大小 分别计算上述逻辑地址。
  • 根据页表找到对应的块号,再根据公式: 逻辑地址对应的物理地址 = 页号对应的块号 * 页面大小 + 页内地址 分别求其物理地址。

答: (1) 对上述逻辑地址,可先计算出它们的页号和页内地址,然后通过页表转换得到其物理地址。 具体计算如下:

1023 的页号 = 1023 / 1024 = 0,页内地址 = 1023 % 1024 = 1023,物理地址 = 2 * 1024 + 1023 = 3071

2500 的页号 = 2500 / 1024 = 2,页内地址 = 2500 % 1024 = 452,物理地址 = 6 * 1024 + 452 = 6596

3500 的页号 = 3500 / 1024 = 3,页内地址 = 3500 % 1024 = 438,物理地址 = 7 * 1024 + 438 = 7596

4500 的页号 = 4500 / 1024 = 4,超过了页面长度 4,越界。

(2)