一、分页存储管理的基本概念
将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个页框或页帧或内存块或物理块。每个页框有一个编号,即页框号或内存块号或页帧号或物理块号,从0开始。
将用户进程的地址空间也分为与页框大小相等的一个个区域,称为页或页面。每个页面也有一个编号,即页号,页号也是从0开始。
注意:页框不能太大,否则可能产生过大的内部碎片
操作系统以页框为单位为各个进程分配内存空间。进程的每个页面分别放入一个页框中。也就是说,进程的页面与内存的页框有一一对应的关系。
各个页面不必连续存放,也不必按先后顺序来,可以放到不相邻的各个页框中。
如何实现逻辑地址与物理地址的转换:
①要算出逻辑地址对应的页号
②通过页号找到对应物理地址的起始地址
③算出逻辑地址在页面内的偏移量
④物理地址 = 页面起始地址+ 页内偏移量
页号 = 逻辑地址 / 页面长度
页内偏移量=逻辑地址%页面长度
页表
为了能知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表
基本地址变换机构:
基本地址变换机构可以借助进程的页表将逻辑地址转换为物理地址。
通常会在一个系统中设置一个页表寄存器,存放页表在内存中的起始地址F和页表长度M。
进程未执行时,页表的始址和页表长度放在进程控制块(PCB)中,当进程被调度的时候,操作系统内核会把它们放在页表寄存器中。
具有块表的地址变换机构:
时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很可能再次执行了如果某个数据被访问过,不久后改数据很可能再次被访问。(因为程序中存在大量的循环)
空间局部性:一旦程序访问了某个存储单元,在不久后,其附近的存储单元也很有可能被访问。(这是因为很多数据在内存中是连续存放的)
快表,又称联想寄存器(TLB),是一种访问速度比内存快很多的高速缓冲存储器,用来存放当前访问的若干页表项,以加速地址变换的过程,内存中的页表常称为慢表。
引入快表后,地址的变换过程:
两级页表:
单级页表存在的问题:
- 页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框。
- 没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。
为了避免页表占用过多的内存空间,可以将长长的页表进行分组,使每个内存块刚好可以放入一个分组,为离散分配的页表再建立一张页表,称为页目录表,或者外层页表或者顶层页表。
二、基本分段存储管理
进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名(在低级语言中,程序员使用段名来变成),每段从0开始编址。
内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各个段之间可以不相邻。
分段系统的逻辑地址结构由段号和端内地址所组成。如:
段号的位数决定了每个进程最多可以分几个段
段内地址位数决定了每个段的最大长度是多少
程序分多个段,各段离散地装入内存,为了保证程序能正常运行,就必须能从物理内存中找到各个逻辑段的存放位置。为此,需要为每个进程建立一张段表。
地址变换过程:
分段与分页的比较:
三、段页式管理方式