2024.06.09:计算机组成原理学习笔记
第11节 虚拟存储器*
- 1.1 分页思想
- 1.1.1 虚拟地址/逻辑地址
- 1.1.2 主存地址/物理地址
- 1.1.3 页表
- 1.1.4 分页方式的缺陷
- 1.2 分段思想
- 1.2.1 虚拟地址/逻辑地址
- 1.2.2 主存地址/物理地址
- 1.2.3 段表
- 1.3 段页式思想
- 1.3.1 虚拟地址/逻辑地址
- 1.3.2 主存地址/物理地址
- 1.4 页式虚拟存储器
- 1.4.1 虚拟存储器的思想
- 1.4.2 实页与虚页
- 1.4.3 请求页表
- 1.4.4 地址转换
- 1.4.5 页表的缺陷(块表)
- (1) 全相联映射块表
- (2) 2路组相联块表
- 1.4.7 CPU访存过程
- (1) TLB命中,则页表一定命中
- (2) TLB缺失,但页表命中
- (3) TLB缺失,且页表也缺失
- 主存中无空闲页框
- 主存中有空闲页框
- 1.5 段式虚拟存储器
- 1.6 段页式虚拟存储器(了解不考)
存储系统中考频最高的一个考点。
基于操作系统中的内存管理来延展的
1.1 分页思想
学完cache之后,我们应该对分单位块这种思路非常熟悉。就像cache和主存一样,单单给主存划分是不够的,因为你想要做的是,在主存和cache之间找到一个数据交换的单位,这里也是一样的,在主存和进程之间找到一个数据交换的单位
- 分页思想就是将主存划分固定长且比较小的存储块,称为页框(page frame)或物理块。
- 将进程划分为固定长的程序块,称为页(page)
- 页框==页
一旦出现这种给两个对象划分单元的情况,就是因为我们想要做数据交换或者信息交换
- 程序运行时,进程的页会离散地装入到主存的页框中(分页思想的好处)
1.1.1 虚拟地址/逻辑地址
- 进程里面的地址,程序员编程所使用的地址就是虚拟地址,不考虑进程有没有装到主存里去
- 程序中所用的地址,并非最终放到主存后的地址
- 逻辑地址的构成:页号 + 页内偏移量
1.1.2 主存地址/物理地址
- 程序真正运行时被调入主存后所用的地址
- 物理地址的构成:页框号 + 页内偏移量
如何得知进程的某一页会放入主存的哪个页面?
1.1.3 页表
- 页表记录一个进程从页号到页框号的映射
- 页表项(一行):页号 + 页框号
- 由于页面大小固定,且页表会记录进程所有页面对应的页框号,因此页表中的页号可以隐含
- 借助页表,我们就能知道某个逻辑地址对应的单元装入内存后的物理地址
此处注意映射的先后关系!
- 主存与cache之间映射的先后关系
- 主存与进程之间映射的先后关系
1.1.4 分页方式的缺陷
分页方式要求一个进程的所有页面都要一次性调入主存,这种方式没有考虑到局部性原理,使有限的页框资源被不活跃的页占有,浪费主存
1.2 分段思想
- 将用户进程的逻辑地址空间划分成(大小不等的段)
- 分段思想是面向(程序员)的思想,程序员可以根据代码里面不同的逻辑段将进程分段,由程序员自行决定
- 分段思想只给进程分段,而不对主存进行操作
可以根据逻辑对段的大小进行划分,但是主存你找不到逻辑
- 段内的物理地址连续,段间可以离散(与分页的共同点)
1.2.1 虚拟地址/逻辑地址
- 程序中所用的地址,并非最终放到主存之后的地址
- 段号:段号的位数决定每个进程的段的最大数量
- 段内偏移量:段内偏移量的位数决定进程内单个段的最大大小
由于段的大小不同,你无法找到固定的段内偏移量。因此选择最大的段内偏移量,才能囊括
分段思想是为了方便程序员而提出的内存管理方案
- 段号和段内偏移量这两个字段必须由用户显示提供
1.2.2 主存地址/物理地址
- 程序真正运行时被调入主存后所用的地址
- 由于段式系统的特殊性,并未将主存划分成任何单位,因此物理地址也不划分字段
- 只要知道某段在主存内的基地址和段长,即可推出段中每个存储单元的物理地址
1.2.3 段表
- 每个进程都有一张逻辑空间与内存空间映射的段表
- 短号+段长+基址
- 进程的短号顺序递增,因此在段表中可以隐含
- 基址+段长就可以定位一个段在主存中的连续地址空间
1.3 段页式思想
1.3.1 虚拟地址/逻辑地址
程序中所用的地址,并非最终放到主存后的地址
- 系统为每个进程建立一张段表
- 每个段对应一个段表项
- 一个段表项引出一张页表
- 页表记录一个段占用了主存的哪些页框
1.3.2 主存地址/物理地址
步入正题:虚拟存储器
1.4 页式虚拟存储器
1.4.1 虚拟存储器的思想
前面的各种思想没有考虑到局部性原理,虚拟存储器的思想与cache类似,二者都考虑到了局部性原理
- 虚拟存储器会将硬盘的一部分空间作为扩展的内存来使用,对用户虚拟出一片巨大的内存空间
- 进程运行时,只将活跃的页面调入内存,用不到的页面存放在外存中,一旦需要就换入到内存
用户不知道
- 每个程序都认为自己在使用一个连续的、私有的地址空间,实际上它们使用的地址是虚拟地址
- 操作系统通过一个映射表来将这些虚拟地址转换为物理地址
1.4.2 实页与虚页
- 在分页存储,就是还没有虚拟的时候,进程划分的页,我们就把它叫做页
- 在页式虚拟存储器里面,进程划分的这个单元我们就把它划分称虚页
- 主存在普通的分页管理里面,它就叫做页框或者物理块
- 在页式虚拟存储器里面,它叫实页,和虚页做对比
操作系统给每个进程都提供同样大小的虚拟地址空间
- 每个进程的最大虚页数个数是确定的
- 进程不一定把这些虚拟全部用完
- 但是最大虚页个数决定了虚拟地址的虚页号
虚页个数比实页个数要多,否则引入虚存就毫无意义。因此,虚拟地址位数往往比物理地址位数要多
1.4.3 请求页表
每个虚拟页在页表中都会有一个对应表项
- 状态位(存在位P):请求分页系统中只会将进程的一部分调入内存,还有一部分仍在外存的磁盘上,故需要页表中增加存在位字段指示该页是否已调入内存,供进程参考。
- 访问字段A:用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未访问,提供给置换算法在选择换出页面时参考
- 修改位M:标识该页在调入内存后是否被修改过,若被修改必须将该页重写到外存上,以保证外存中所保留的副本始终是最新的,供置换页面时参考
- 外存地址:用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考
1.4.4 地址转换
虚拟存储系统中,指令给出的地址是虚拟地址,因此CPU执行指令时,必须将虚拟地址转换成物理地址才可以访存
- 页表基址寄存器:每个进程都有一个页表基址寄存器用于存放该进程的页表首地址
1.首先页表基址寄存器会把页表的基地址告诉你,你就会知道这个页表从哪里去查(告诉你图中绿色表在哪里)
2.接下来,根据虚拟地址里面的虚页号去查这张请求页表(去绿色表里查装入位,1为有,实页号有效)
3.最后,根据实页号去完成虚拟地址到物理地址的转换
1.4.5 页表的缺陷(块表)
- 页表常驻内存,每次访问都需要访存,效率较低
- 可以模仿cache的设计思路,设计一个“存放常用页表项的cache”以提升效率
- 块表又叫TLB,是一种特殊的硬件,用于存放经常访问的虚页的页表项,可加速虚拟地址到物理地址的转换过程
(1) 全相联映射块表
在全相联映射下,TLB的tag就是虚页号
(2) 2路组相联块表
1.4.7 CPU访存过程
(1) TLB命中,则页表一定命中
根据虚页号在TLB中逐个对比每个表项的tag,若相等且有效位为1,则可将表象中的实页号和页内地址进行拼接,得到物理地址(主存地址)
(2) TLB缺失,但页表命中
路线:根据CPU给出的虚拟地址,得到1个物理地址,我们要访存!!!
- 若tag相等但有效位为0,或TLB中不存在该表项,需要进行TLB缺失处理
- 页表命中,将页表中的实页号与页内地址拼接在一起即可得到主存地址
- 更新TLB表
(3) TLB缺失,且页表也缺失
缺失处理属于异常,发生异常时会中断指令的执行,处理结束后需要重新执行本条指令
主存中无空闲页框
- 若页表中表项的有效位为0,则页表缺失,需要进行缺页处理,将需要的虚页从外存调入主存
- 此时主存所有的页框都被占用,根据页置换算法将主存中某个页框中的虚页调出
- 腾出的页框就会留给缺失的虚页,调入后存放在主存的此位置
主存中有空闲页框
根据请求页表里面的外存地址字段,从外存中读出虚页到主存的空闲页框
1.5 段式虚拟存储器
虚拟存储系统中,指令给出的地址是虚拟地址,因此CPU执行指令时必须将虚拟地址转换成物理地址才可以访存
1.6 段页式虚拟存储器(了解不考)
虚拟存储系统中,指令给出的地址是虚拟地址,因此CPU执行指令时必须将虚拟地址转换成物理地址才可以访存