0%

非连续内存管理-分页存储

为什么使用非连续内存分配

考虑多道程序设计连续内存分配两种管理方式

  1. 固定分配,缺乏灵活性,大量内部内存分片产生,内存利用率低
  2. 动态分配,大量外部内存分片产生,可通过”紧凑”技术解决,但是紧凑效率低
    基于这一思想,产生了”非连续分配方式”

非连续内存管理方式分为下图几种
img.png

分页存储

分页存储思想

假设进程A大小为23MB,但是每个分区大小只有10MB,如果进程只能占用一个分区,那显然放不下。

解决思路:如果允许进程占用多个分区,那么可以把进程拆分成10MB+10MB+3MB三个部分,再把这三个部分分别放到三个分区中(这些分区不要求连续)

进程A的最后一个部分是3MB,放入分区后会产生 7MB 的内部碎片。

如果每个分区大小为 2MB,那么进程A可以拆分成 11* 2MB + 1MB 共12个部分,只有最后一部分 1MB占不满分区,会产生 1MB 的内部碎片。

显然,如果把分区大小设置的更小一些,内部碎片会更小,内存利用率会更高。

分页存储管理的重要概念

将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个“页框”,或称“页帧” “内存块” “物理块” 。每个页框有一个编号,即“页框号” (或 者“内存块号” “页帧号” “物理块号〞,页框号从O开 始 将用户进程的地址空问也分为与页框大人相等的一个个区城, 称为“页”或“页面” 。每个页面也有 一个编号,即“页号” 页号也是从0开始。

(注:进程的最后一个页面可能没有一个页框那么大。因此, 页框不能太大,否则可能产生过大的内部碎片)

操作系统以页框为单位为各个进程分配内存空间。进程的每个页面分别放入一个页框中。也就是说,进程的页面与内存的页 框有一对应的关系。 各个页面不必连续存放,也不必按先后顺序来,可以放到不相邻的各个页框中。

地址转化

操作系统如何实现逻辑地址到物理地址的转化

假设每页大小50b
img.png

逻辑地址为80的内存单元: 应该在1号页,该页在内存中的起始位置为450,逻辑地址为80的内存单元相对于该页的起始地址而言, “偏移量”应该是30。 实际物理地址450+30=480

  1. 要算出逻辑地址对应的页号
  2. 要知道该页号对应页面在内存中的起始地址
  3. 要算出逻辑地址在医面内的“偏移 量”
  4. 物理地址=页面始址+页内偏移量

偏移量和页号计算

页号:80 / 50 = 1

偏移量:80 % 50 = 30

1号页在内存的起始位置为450

为了方便计算页号,偏移量和页面大小一般为2的幂次方

逻辑地址 4097,用二进制表示应该是 00000000000000000001000000000001 若 1号页在内存中的起始地址为x,则逻辑地址4097对应的物理地址应该是x+1000000000001

如何计算: 页号=逻辑地址/ 页面长度(取除法的整数部分)

为了方便计算 页而大小一般 页内偏移量=逻辑地址 % 页面长度(取除法的余数部分)
假设用32个二进制位表示逻辑地址,页面大小为 210B=1024B= 1KB

0号页的逻辑地址空间应该是 0~1023,用二进制表示应该是: 00000000000000000000000000000000 ~ 00000000000000000000001111111111

1号页的逻辑地址空间应该是 1024~2047,用二进制表示恩该是: 00000000000000000000010000000000 ~ 00000000000000000000011111111111

2号页的逻辑地址空间应该是 2048~3021,用二进制表示应该是: 00000000000000000000100000000000 ~ 00000000000000000000101111111111

结论:如果每个页面大小为 2^B,用二进制数表示逻辑地址,则末尾K位即为页内便宜量,其余部分就是页号,因此,如果让每个页面的大小为2的整数幂,计算机就可以很方便地得出一个逻辑地址和页内偏移量。

为什么是2的幂次方?

例如计算1026和2055的页号和页面偏移量
1026的32位二进制表示为00000000000000000000010000000010

如果每个页面大小为2^10,末尾10位为0000000010,可得出页面偏移量为2,其余部分为0000000000000000000001,可得出在1号页

2055的32位二进制表示为00000000000000000000100000000111

如果每个页面大小为2^10,末尾10位为0000000111,可得出页面偏移量为7,其余部分为0000000000000000000010,可得出在2号页

如何知道页面在内存的起始位置

这里引入一个新概念页表

为了能知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表。

  1. 一个进程对应一张页表
  2. 进程每一页对应一个页表项
  3. 每个页表由页号和块号组成
  4. 页表记录进程页面和世纪存放的内存块对应关系
  5. 每个页表项的长度是相同的,页号是隐含的

参考文献:王道计算机考研-操作系统