操作系统—王道考研学习笔记 <3.1_6> 分页存储管理
Posted 狱典司
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统—王道考研学习笔记 <3.1_6> 分页存储管理相关的知识,希望对你有一定的参考价值。
分页存储管理的先导知识:
非连续固定分区分配
导入正式概念:
注意:
(1)进程可以被分块,内存也可以被分块
(2)内存块 = 物理块 = 页框 = 页帧,是内存上的结构
(3)而对于进程来说,进程被分成的原单位为页面(页),且每个页面有页号,页号从0开始
动态重定位:
将进程放入内存时不着急计算物理地址,当需要调用时再计算物理地址,利用了重定位寄存器,重定位需要硬件支持
注意:二进制换算的一些小tips
(1)2的多n次方化成十进制数就是1后跟n个0,如2为10,8为1000,1024为1后跟10个0,4096为1后跟12个0
(2)2的n次方 - 1 为 n个1,如4095为 (2^12 -1) = 12个1
理解:
该题中共32位,页面大小位2的12次方,故页内地址由12位二进制数表示,共可有2^12=4096个基本存储单元(地址), 故0号页的逻辑地址空间应该是0~4095
-
前20位即代表了页号,注意!要找到是该页号的起始地址而不是整个进程的零号页的起始地址,因为进程页面在内存块中的位置分配大概率不是连续的!所以要找的是具体页号对应的内存中的起始物理地址
-
后12位代表了偏移量,所以当找到了该页号对应的起始地址x,则用x+后12位(页内偏移量)即可计算出其真实物理地址
页表:
系统会为每一个进程建立一个页表,而进程中的每一个页(面)都会对应页表中的一个页表项
-
前面的总结到:
计算机知道了一个页的逻辑地址和页面大小就可以很快的计算出其页号和页内偏移量 -
注意:
注意页表中 页号代表的是进程的页面的页号,块号代表的是内存的内存块号
注意理解:
何为页表项?
何为页表项长度?
- 由于页表中页号是”隐式“的,故页表中的每一个页表项只是内存块号,页表项长度即表示块号所需要的二进制位数(bit(能表示1位二进制位)->Byte(能表示八位二进制位)为单位)
为何页表中页号可以是"隐式"的?
- 这一部分完全讨论的是页表,因为页表也被存储在内存当中,而且页表中页表项的存储一定是连续的
- 故只要知道:
(1)页表存放在内存中的起始地址X
(2)页表项大小M
(3)目标页号N的物理起始地址D
则可以知道具体是哪个页号,即N = (D-X)/M
反向思考
若是已知页号N求该页在内存中的起始物理地址X:
则有 目标页号物理始址 D = X + N * M,(N * M即页号*页表项长度)
需要格外注意而不要混淆的是:
- 这里的操作只是为了在内存的页表中去目标页号对应页表项的内存地址中,取出那 M字节(页表项长度)的内存块号,得到了这个块号,才会去相应内存块查找页面的内容或计算逻辑地址相应的物理地址
- 虽然页表的存储是连续的,但是页面的存储是离散的。故对于页面的物理地址计算不能采用页表那种找出整个页表的首地址就计算的方法,一定要找到具体某个页面的首地址而不是整个页面集合(进程)的首地址。
注意:
该总结图中“如何实现地址转换”的一栏没有考虑到页表的问题,或者说是在第二步缺省了。若是考虑页表的问题,具体的步骤应如下:
分页式存储管理由逻辑地址计算物理地址(考虑页表)
- 根据逻辑地址计算出页号
- 根据页面大小K和内存大小C算出页表项长度M,即基于K这样的页面大小来划分内存块,则最大内存块/物理块/页框/页帧号最少需要用多少位二进制数来表示
- 根据页表的起始地址X 以及页表项长度M 算出页号对应页表项在内存的起始地址 D=X + N*M
- 去内存地址为D的地方取出该页号对应页面在内存中存储的内存块号U
- 将内存块号U * 页面大小K(也就是根据页面大小K而划分的内存块大小) 得到 具体页面在内存中的物理起始地址begin
- 逻辑地址 % 页面大小 = 偏移量offset
- 到现在终于可以得出一个进程的逻辑地址在内存中的物理地址 = 物理始址begin + 偏移量offset
以上是关于操作系统—王道考研学习笔记 <3.1_6> 分页存储管理的主要内容,如果未能解决你的问题,请参考以下文章