一、两级页表
单级页表存在的问题?
问题一:页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框。
问题二:没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。
结合图像法来进行分析:
进而引出两级页表,
两级页表如何实现地址转换?
步骤:
①按照地址结构将逻辑地址拆分成三部分
②从PCB中读出页目录表始址,再根据一级页号查页目录表,找到下一级页表在内存中的存放位置
③根据二级页号查表,找到最终想访问的内存块号
④结合页内偏移量得到物理地址
例题:将逻辑地址(0000000000,0000000001,111111111111)转换为物理地址(用十进制表示)。
最终要访问的内存块号为4
该内存块的起始地址为4*4096=16384
页内偏移量为1023
最终的物理地址为16384+1023=17407
对于单级页表的问题二 应该如何解决?
【注】1.若采用多级页表机制,则各级页表的大小不能超过一个页面。(选择题、大题常考)
2.两级页表的访存次数分析(假设没有快表机构)
第一次访存:访问内存中的页目录表
第二次访存:访问内存中的二级页表
第三次访存:访问目标内存单元
n级页表缓存次数为(n+1)次
二、基本分段存储管理
分段
段表
问题:程序分多个段,各段离散地装入内存,为了保证程序能正常运行,就必须能从物理内存中
找到各个逻辑段的存放位置。为此,需为每个进程建立一张段映射表,简称“段表”。
1.每个段对应一个段表项,其中记录了该段在内存中的起始位置(又称“基址”)和段的长度。
2.各个段表项的长度是相同的。例如:某系统按字节寻址,采用分段存储管理,逻辑地址结构为(段号16位,段内地址16位),因此用16位即可表示最大段长。物理内存大小为4GB(可用32位表示整个物理内存地址空间)。因此,可以让每个段表项占16+32=48位,即6B。由于段表项长度相同,因此段号可以是隐含的,不占存储空间。若段表存放的起始地址为M,则K号段对应的段表项存放的地址为M+K*6。
段表实现地址变换?
思路图如下:
分段与分页的最大区别是——分页中每个页的长度是相同的,分段中每个段的长度是不同的。
分段与分页管理的对比
页是信息的物理单位。分页的主要目的是为了实现离散分配,提高内存利用率。分页仅仅是系统管
理上的需要,完全是系统行为,对用户是不可见的。
段是信息的逻辑单位。分段的主要目的是更好地满足用户需求。一个段通常包含着一组属于一个逻
辑模块的信息。分段对用户是可见的,用户编程时需要显式地给出段名。
页的大小固定且由系统决定。段的长度却不固定,决定于用户编写的程序。
分页的用户进程地址空间是一维的,程序员只需给出一个记忆符即可表示一个地址。
分段的用户进程地址空间是二维的,程序员在标识一个地址时,既要给出段名,也要给出段内地址。
总结如下:
特点 | 分页 | 分段 |
---|---|---|
物理单位 | 页面 | 段 |
目的 | 实现离散分配,提高内存利用率 | 更好地满足用户需求 |
是否可见 | 不可见 | 可见 |
大小 | 固定,由系统决定 | 不固定,取决于用户编写的程序 |
地址空间 | 一维 | 二维 |
地址表示 | 给出一个记忆符表示地址 | 需要同时给出段名和段内地址表示地址 |
分段比分页更容易实现信息的共享和保护
三、段页式存储管理
段页式存储管理的引入
段页式管理的逻辑地址结构
段表、页表
进行地址转换的思路图如下:
下一小节虚拟内存与请求分页、页面置换算法...敬请期待(* ̄︶ ̄)。