目录
- 一 . 基本分页存储管理
- 分页存储的几个基本概念
- 页面 与 页面大小
- 地址结构
- 页表
- 基本地址变换机构
- 具有快表的地址变换机构
- 两级页表
- 二. 基本分段存储管理
- 分段
- 段表
- 地址变换机构
- 页表和分段的对比
- 段的共享与保护
- 三. 段页式存储管理
- 分页,分段管理优缺点
- 分页+分段=段页式管理
- 地址转换
一 . 基本分页存储管理
连续分配方式存储密度高于非连续存储。
- 非连续分配方式根据分区大小是否固定,分为分页存储管理和分段存储管理。
- 分页存储管理中,根据运行作业时是否需要将作业的所有页面都装入内存才能运行,分为基本分页存储管理和请求分页存储管理。
分页存储的几个基本概念
- 分页通过硬件机制实现,对用户完全透明,目的是提高内存利用率。
页面 与 页面大小
页、页面 VS 页框、页帧、物理页
- 进程的逻辑地址空间每个页面有一个编号,称为页号,从 0 开始。
- 内存空间(物理地址)中每个页框也有一个编号,称为页框号(或物理块号),从 0 开始。
- 进程执行时候,OS 以页框为单位为各个进程分配内存空间。进程的每个页面分别放入一个页框,产生一一对应关系。
各个页面不必连续存放,可以放到不相邻的页框。
- 为了方便地址转换,页面大小应该是 2 的整数次幂【如:4KB 等】。
- 页面太大:内存碎片增多,降低内存利用率。
- 页面太小:使得进程的页面数过多,页表就会过长,占用大量内存,同时也会增加硬件地址转换开销,降低页面换入/换出效率。
地址结构
某个分页存储管理的逻辑地址结构如下所示:
31 … 12 | 11 … 0 |
---|---|
页号 P | 页内偏移 W |
页号 P 为 12~31 位,表示最多允许 2^20 页;
页内地址为 0~11 位,表示每页大小 2^12 B(按字节编址)。
页表
- 为了便于找到每个页面在内存中存放的位置,系统为每一个进程建立一张页面映射表(页表)。【通常存放在 PCB 中】
- 页表项:页号 + 块号。记录了页面在物理内存对应的物理块号。【由于页表中的页表项是连续存放的,故页号可以隐含,不占用存储空间】
- 作用:实现了从逻辑页号到物理块号的地址映射。
基本地址变换机构
- 地址变换:即将逻辑地址转换为内存中的物理地址。借助于页表来实现。
具有快表的地址变换机构
采用上面的地址变换过程时候,若页表全部放入内存,则取一个数据或指令至少需要访问两次内存:第一次访问页表,确定取出数据/指令的物理地址,第二次访问存储地址取数据/指令。显然比通常执行指令速度慢了一半。
快表(TLB):又称相联存储器,是一个具有并行查找能力的 高速缓存存储器。
- 用来存放访问过的若干表项,以加速地址变换过程。【对此,主存中的页表常被称为慢表】
两级页表
引入分页管理后,由于页表的存在,需要给页表分配内存空间,并且必须是连续的页地址。如果一个进程的页表项很多,就会出现仅仅页表就需要占用大量连续存储空间的情况,显然不切实际。
解决问题的方法有两个:
- 离散分配页表所需存储空间,用一张索引表记录各个页表的存放位置。这样就解决了页表占用连续内存空间的问题。【即采用多级页表】
- 只将当前需要的部分表项调入内存,其他页表仍驻留磁盘,需要时再调入(虚拟内存思想),以解决占用内存过多的问题。
二. 基本分段存储管理
分段管理考虑用户和程序员,以满足方便编程、信息保护和共享、动态增长以及动态链接等多方面需要。
分段
- 内存分配以段为单位。
- 分段系统将用户进程的逻辑地址空间按照自身逻辑关系划分为大小不等的段,每个段都有一个段名。
- 每段地址从0开始编址,并分配一段连续的地址空间(段内地址需要连续分配,段间不要求,进程的地址空间是二维的)。
例如,用户主程序由主程序段、两个子程序段、栈段和数据段组成。
- 分段系统中,段号和段内偏移必须由用户显示提供;高级程序设计语言中,该工作由编译程序完成。
段表
每个进程都有一张逻辑空间与内存空间映射的段表,进程的每个段对应一个段表项。段表项记录该段在内存中起始地址和长度。
地址变换机构
为了实现进程从逻辑地址到物理地址的转换,系统设置一个段表寄存器,用于存放段表起始地址 F 和段表长度 M。
页表和分段的对比
- 相似
- 都是非连续分配方式;
- 都需要提供地址映射机构实现地址变换。
- 不同:
- 页是信息的物理单位;段是信息的逻辑单位。
- 页的大小固定且由系统决定;段长不固定,取决于用户编写的程序。
- 分页管理地址是一维的;
- 段式管理不能通过给出一个整数确定对应的物理地址(由于段长不固定),无法通过除法得到段号和取余得到段内偏移,因此必须显示给出段号和段内偏移。因此分段管理地址空间是二维的。
段的共享与保护
分页系统中,虽然也能实现共享,但远不如分段系统来得方便。若被共享的代码占N个页框,则每个进程的页表中都要建立N个页表项,指向被共享的N个页框。
在分段系统中,不管该段有多大,都只需为该段设置一个段表项,因此非常容易实现共享。只需在每个进程的段表中设置一个段表项,指向被共享的同一个物理段。
不能被任何进程修改的代码称为可重入代码或纯代码(不属于临界资源),它是一种允许多个进程同时访问的代码。为了防止程序在执行时修改共享代码,在每个进程中都必须配以局部数据区,将在执行过程中可能改变的部分复制到数据区,这样,进程就可对该数据区中的内容进行修改。
与分页管理类似,分段管理的保护方法主要有两种:
- 一种是存取控制保护。
- 另一种是地址越界保护。地址越界保护将段表寄存器中的段表长度与逻辑地址中的段号比较,若段号大于段表长度,则产生越界中断;再将段表项中的段长和逻辑地址中的段内偏移进行比较,若段内偏移大于段长,也会产生越界中断。
分页管理只需要判断页号是否越界,页内偏移是不可能越界的。
三. 段页式存储管理
分页,分段管理优缺点
分页+分段=段页式管理
分页存储管理能有效地提高内存利用率,而分段存储管理能反映程序的逻辑结构并有利于段的共享和保护。将这两种存储管理方法结合起来,便形成了段页式存储管理方式。
在段页式系统中,进程的地址空间首先被分成若干逻辑段,每段都有自己的段号,然后将每段分成若干大小固定的页。对内存空间的管理仍然和分页存储管理一样,将其分成若干和页面大小相同的存储块,对内存的分配以存储块为单位。
为了实现地址变换,系统为每个进程建立一张段表,每个段对应一个段表项,每个段表项至少包括段号、页表长度和页表始址;每个段有一张页表,每个页表项至少包括页号和块号。此外,系统中还应有一个段表寄存器,指出进程的段表始址和段表长度(段表寄存器和页表寄存器的作用都有两个,一是在段表或页表中寻址,二是判断是否越界)。
地址转换
在进行地址变换时,首先通过段表查到页表始址,然后通过页表找到物理块号,最后形成物理地址。进行一次访问实际需要三次访问主存,这里同样可以使用快表来加快查找速度,其关键字由段号、页号组成。