分页存储管理

2023-12-13 06:00:34
页框和页面

将内存空间分为一个个大小相等的分区 (比如:每个分区4KB),每个分区就是一个“页框”(页框=页=内存块=物理块=物理页面)。每个页框有一个编号,即“页框号”(页框号=页帧号=内存块号=物理块号=物理页号),页框号从0开始。

为了将各个进程的数据放到页框当中,将进程的逻辑地址空间也分为与页框大小相等的一个个部分,每个部分称为一个“页”或“页面”。每个页面也有一个编号,即“页号”,页号也是从0开始。

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

页框指的是内存物理上被划分为的一个一个块,页面指的是进程逻辑上被划分的一个一个块

那么进程的页面是怎么记录这种与页框的一一对应的关系的呢?

页表

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

注:页表通常存在PCB(进程控制块)中

页表的结构

每个页表项的大小:

内存块号的数量---->页表项中块号至少占多少字节

页框的大小=页面大小=4KB=2^{12}B? ? ? ? 4GB=2^{32}字节

所以4GB的内存可被分为2^{32}/2^{12}=2^{20}个内存块

内存块号的范围应该是0~2^{20}-1,内存块号至少要用20bit表示,而计算机分配内存空间以字节为单位,所以至少要用3B来表示块号(3*8=24bit)

页号占的字节:

页表项连续存放,因此页号可以是隐含的,不占存储空间 (类比数组)

由于页号不占存储空间,只有块号占存储空间,所以存储0~n页则需要3*(n+1)B

注意:页表记录的只是内存块号,而不是内存块的起始地址,J号内存块的起始地址 =J* 内存块大小

逻辑地址到物理地址的转换

进程在内存中连续存放时,操作系统是如何实现逻辑地址到物理地址的转换的?

物理地址是绝对的地址,而内存块只需要将其

逻辑地址(相对于起始位置的偏移量)+进程在内存中的起始地址

就能得到物理地址?

将进程地址空间分页之后,操作系统该如何实现逻辑地址到物理地址的转换?

虽然进程的各个页面是离散存放的,但是页面内部是连续存放的
如果要访问逻辑地址 A,则
①确定逻辑地址A对应的“页号”P

②找到P号页面在内存中的起始地址(需要页表)

③确定逻辑地址A的“页内偏移量”w

逻辑地址A对应的物理地址 =P号页面在内存中的起始地址+页内偏移量w

如何确定一个逻辑地址对应的页号、页内偏移量?

注:在计算机内部,地址是用二进制表示的如果页面大小 刚好是 2 的整数幂,则计算机硬件可以很快速的把逻辑地址拆分成(页号,页内偏移量)

可以看到末尾的12为就是页内偏移量,而前面的20位就是页号

采用之前的公式验证一下:

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

页内偏移量 = 逻辑地址%页面长度(取除法的余数部分)

文章来源:https://blog.csdn.net/weixin_69884785/article/details/134820514
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。