一、概要
基本概念: 操作系统对内存的划分和动态管理。
带来的好处: 方便用户实用存储器、提高内存利用率、通过虚拟技术从逻辑上扩充内存。
OS提供的功能: ①内存空间的分配和回收 ②地址转化 ③内存扩充 ④存储保护
二、连续和非连续的比较
(1)回顾:
上期的博客中,我们梳理了,操作系统内存分配的连续分配管理方式,分别有:单一分配、固定分配、动态分配。本期我们梳理关于非连续分配管理方式
(2)简述:
连续分配管理方式是将程序整个装入一块连续的内存空间,如果用户需要1GB的内存空间,连续分配方式就是在内存空间中为用户分配一块连续的1GB内存。但是如果没有连续的1GB的空间,则该作业仍然是无法运行的。所以我们引入非连续分配管理方式,使得该作业可以分散地在内存地各个区域,当然,也需要额外地空间区存储它们(分散区域)的索引。这也导致连续分配管理方式的存储密度相比连续更低。
(3)分类:
根据运行作业是否要把作业的所有页面装入内存才能运行,又细分为:基本分页和请求分页。
三、分页?
(1)引入:
固定分区会产生内存碎片,动态分区会产生外部碎片,这两种技术对内存的利用率都比较低。我们希望内存的使用能够尽量避免碎片的产生,就引入了分页的思想:把内存划分为大小相等且固定的“块”,“块”相对较小,作为主存的基本单位。把进程也分为以“块”为单位进行划分,进程在执行时,以块为单位逐个申请内存空间。 (注意这里的块在后续叫法有变)
(2)区分:块、页、页框、页帧、内存块、物理页面、物理块?
区分:
进程的”称为:页(page或者页面);内存中的“块”称为页框(Page Frame或者页帧);外存中称为块(Block) ——《王道考研》
进程的地址空间被划分为若干个相等大小的区域,称为:页或页面;内存的存储空间也分为与页面大小相等的区域,称为:块或物理块;在为作业分配存储空间时,以块为单位来分配,可以将作业中的任意一页放到内存的任意一块中。内存中与页面大小相等的块也可以称为:页框 ——《天勤考研》
(3)页表:
为了将逻辑地址上连续的页号映射到物理地址上,需要将页面和每个物理块一一对应,这就有操作系统建立页表 来体现这种映射关系。
1) 每个页表项多大?占几个字节?
块号: 必须满足能够存放块号的所有范围。
页号: 页表项连续存放, 因此页号可以是隐含的,不占存储空间(类比数组) 【重点后续会用到】
页表项中块号起记录作用,但是它本身也需要存放在内存中,并且连续存放。
如果每个页表项占 4字节,则每个页框刚好可存放 1024个页表项1024 号页表项虽然是存放在下一个页框中的,但是它的地址依然可以用 X + 41024 得出:
*结论:理论上,页表项长度为 3B 即可表示内存块号的范围,但是,为了方便页表的查询,常常会让一个页表项占更多的字节,使得每个页面恰好可以装得下整数个页表项。
2)如何通过页表实现逻辑地址到物理地址的转换?
首先我们需要找到逻辑地址对应的页号和偏移量。
3)如何确定一个逻辑地址对应的页号、页内偏移量?
重要结论:
①在计算机内部,地址是用二进制表示的,如果页面大小 刚好是 2 的整数幂,则计算机硬件可以很快速的把逻辑地址拆分成(页号,页内偏移量)。
②如果每个页面大小为 2(K次)B,用二进制数表示逻辑地址,则末尾 K 位即为页内偏移量,其余部分就是页号。
重要结论:
①如果页面大小刚好是2的整数幂,则只需把页表中记录的物理块号拼接上页内偏移量就能得到对应的物理地址。
②根据页号可以查询页表,而页表中记录的只是内存块号,而不是内存块的起始地址!J 号内存块的起始地址 = J * 内存块大小
4)为何页面大小要取2的整数幂?
(3)逻辑地址结构:
页面的大小由机器的地址结构决定。在确定地址结构时,若选择的页面较小,可使页面内碎片较小,提高内存利用率;但是也会导致进程要求的页面过多,从而页表过长,占用内存过多,还会减低页面换进换出的效率。
四、基本分页存储
(1)基本地址变化机构
1)基本地址转化
2)练习题
注意: 在分页存储管理(页式管理)的系统中,只要确定了每个页面的大小,逻辑地址结构就确定了。 因此,页式管理中地址是一维的。即,只要给出一个逻辑地址,系统就可以自动地算出页号、页内偏移量 两个部分,并不需要显式地告诉系统这个逻辑地址中,页内偏移量占多少位
五、具有快表的地址变换机构
(1)什么是快表?
简单地说:是基本地址变换机构的改进版本。
(2)升级了那些?
流程对比:
表格对比:
(3)局部性原理:
(4)引入快表后地址的变化:
(5)能否把整个页表都放在TLB中?
那肯定不行,但是在快表满了的时候,我们可以通过置换算法将一些页表项进行替换。
六、两级页表
(1)单级页表存在的问题:
从页表大小的计算公式可知,页表大小和页表长度成正比,而页表长度又随着页号位数的增长而呈指数式增长。所以,如果系统的逻辑地址的位数比较多,页表会很大,而整张页表要求需要连续地存放在内存中,这是一件很困难地事情。所以引出两级页表。
(2)如何解决单级页表的问题?
①问题一:页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框。
解决办法: 把页表再分页并离散存储,然后再建立一张页表记录页表各个部分的存放位置,称为页目录表,或称外层页表,或称顶层页表。这样解决了需要给它分配一块很大的连续空间问题。
②问题二:没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。
(3)如何实现地址变换?
先用一级页号在一级页表上查找,找出单元内容是二级页表地首地址,页表地首地址加二级地址就是页表项地地址,取出里头数值,就是物理块号。然后物理块号与页内地址拼接就得到了物理地址。
(4)页的共享与保护
到改页面对应的块号,同时还要检查本次操作与存取控制字段允许的操作是否相符,若不相符由硬件捕获并发出保护中断。