文章目录
基本分页存储管理(一般考二级页表)
请求分页存储管理
存储系统考法
方向一:虚拟地址转换为物理地址的过程。
方向二:通过物理地址访问cache的过程。
CPU访问数据(无TLB且第一次访问页表就命中)
访问两次内存
- 通过虚拟地址查物理地址(访问一次内存)
- 实际访问内存(访问一次内存)
CPU访问数据(有TLB且第一次访问TLB就命中)
访问一次内存
- 通过虚拟地址查物理地址(TLB命中)
- 实际访问内存(访问一次内存)
CPU访问数据(TLB缺失访问页表命中)
访问两次内存
- 通过虚拟地址查物理地址(TLB缺失,访问页表命中)
- 实际访问内存(访问一次内存)
CPU访问数据(TLB缺失访问页表缺失)(缺页)
访问两次内存
- 通过虚拟地址查物理地址(TLB缺失,访问页表缺失,访问一次内存)
- 缺失后进行调页,TLB命中。
- 实际访问内存(访问一次内存)
CPU访问数据(无TLB访问页表缺失)(缺页)
访问三次内存
- 通过虚拟地址查物理地址(访问页表缺失,访问一次内存)
- 缺失后进行调页,访问页表命中(访问一次内存)。
- 实际访问内存(访问一次内存)
转换地址的时候发生缺页了会访问两次/三次内存(详细版)
缺页中断处理过程
- 第一次访问内存(页表查找):
- 当CPU尝试访问一个虚拟地址时,它首先会在页表中查找该虚拟地址对应的物理地址。
- 如果页表中没有该虚拟地址的映射信息(即发生缺页),那么CPU会触发一个缺页中断。
- 缺页中断处理:
- 操作系统会接管缺页中断的处理。
- 它需要确定缺失的页面是否仍在磁盘上(如果是,则为正常缺页;如果不在,则可能是非法访问)。
- 如果页面在磁盘上,操作系统会将其加载到内存中,并更新页表以反映新的映射关系。
- 这可能涉及到磁盘I/O操作,因此会消耗一定的时间。
- 第二次访问内存(页表再次查找)【无TLB】:
- 在缺页中断处理完成后,CPU会再次尝试访问该虚拟地址。
- 这一次,页表中应该已经有了该虚拟地址的映射信息。
- CPU会再次访问页表,以获取物理地址。
- 第三次访问内存(实际数据访问)
- 在获取了物理地址之后,CPU会访问内存中的实际数据。
- 这是第三次访问内存,也是真正的数据访问。
特殊情况【有TLB】 - 如果系统使用了TLB(Translation Lookaside Buffer)来缓存页表项,那么在缺页中断处理完成后,新的页表项可能会被加载到TLB中。
- 在这种情况下,当CPU再次尝试访问该虚拟地址时,它可能会首先检查TLB。
- 如果TLB中有该虚拟地址的映射信息(即TLB命中),那么CPU可以直接从TLB中获取物理地址,而无需再次访问页表。
- 这可以减少一次内存访问。
特殊情况【有cache】
- 如果系统使用了cache,根据物理地址访问cache
- Cache是为了解决CPU和内存之间速度不匹配的问题而引入的。它存储了内存中一些常用或即将被访问的数据和指令的副本。
- 当CPU尝试访问某个数据时,它会首先检查cache中是否已经有该数据的副本。如果cache命中(即找到了数据),则CPU可以直接从cache中读取数据,而无需访问内存。
- 如果cache未命中(即没有找到数据),则CPU需要访问内存来获取数据,并可能将该数据存入cache中以供将来使用。
- 虚拟地址表示:
- 在操作系统中,每一条指令或每一个数据在内存中的存储地址都是用虚拟地址来表示。
- 进程内部的所有地址引用都是基于虚拟地址。
- 页表机制:
- 虚拟地址会根据存储管理的规则,通过页表来转换为物理地址。
- 页表可以是一级、二级或更多级。.
- 快表(TLB)查找(发生在CPU内部):
- 当需要转换一个虚拟地址时,首先会在快表(Translation Lookaside Buffer, TLB)中查找。
- 快表TLB属于CPU内部MMU部件的一个子功能。
- 如果快表命中,即找到了对应的虚拟页号和物理页框号的映射关系:
- 直接从快表中获取物理页框号。
- 将物理页框号与页内偏移量拼接,得到完整的物理地址(PA)
- 慢表(内存中的页表)查找:
- 如果快表没有命中,即未找到对应的映射关系/或者没有快表机构:
- 当前进程的进程控制块(PCB)有一个变量记录了这个进程。
- 页表始址寄存器指明当前运行进程的页表存储在内存中的什么地方(物理地址)。
- 使用虚拟页号在内存中的慢表(即页表本身)中查找。
- 找到了(有效位等于1)
- 从慢表中找到对应的物理页框号。查到页表项后将之加载到TLB中。
- 将物理页框号与页内偏移量拼接,得到完整的物理地址。
- 没找到(有效位等于0)
- 发生缺页异常
- 缺页处理:
操作系统根据外存当中的地址去外存中找到缺失的页面。把它调入内存,更新页表和TLB的页表项。
- 在慢表查找过程中,有可能发生缺页情况:
- 如果在慢表中找到了对应的物理页框号,则不存在缺页。
- 如果在慢表中未找到对应的物理页框号(即页表项无效或不存在),则发生缺页。
- 此时,操作系统需要处理缺页异常,通常是通过从磁盘加载缺失的页面到内存中来解决。
- 得到物理地址之后
完整的物理地址放在MAR寄存器中。可以根据MAR访问主存。
- 如果TLB命中,说明虚拟页号和物理页框号的映射关系已经在TLB中缓存,因此不存在缺页。
- 只有当TLB不命中,需要查慢表时,才有可能发生缺页(缺页中断是在指令执行期间由于访问的页面不在内存中而触发的,需要访问磁盘)。
虚拟地址到物理地址:
不能在自己编写的Hello World程序里面访问自己的PCB
进程之间共享(灰色)操作系统内核区
进程即将执行某条指令时,这条指令位于该进程的虚拟地址空间中。进程即将执行某条位于虚拟地址0x00FFF的指令时,这个虚拟地址会被加载到程序计数器(程序计数器用于存储下一条即将执行的指令。当CPU执行完当前指令后,它会从程序计数器中读取下一条指令的地址,并继续执行。)中。
页表指明了这个进程的某一个虚拟地址。和物理地址之间的对应关系。
虚拟地址可能来自于PC寄存器或IR指定寄存器。只有把虚拟地址转换为物理地址(经过MMU部件)之后才会被写到MAR(MMU里逻辑上有MAR、MDR、TLB、页表寄存器…)里面。
慢表
慢表:进程的页表存储在内存中。内存里的页表查询的比较慢。有时候称为慢表。慢表必须是在物理连续存放的(为了支持根据页表起始地址和页号找到目标页表项,struct 数组,一个页表项里边需要包含有效位,页框号,)
TLB的每一项中包含
- 有效位(valid)。现在的计算机基本都是使用虚拟存储器,简单来说就是假如你要打开一个很大的程序,它不会把所有的文件都加载进内存。当需要用的内容不在内存上时,它再去硬盘上找并加载到内存。故,有效位的作用就是,假如是0,就代表该页不在内存中,需要去硬盘中找。
- 引用位(reference)。由于TLB中的项数是一定的,所以当有新的TLB项需要进来但是又满了的话,如果根据LRU算法,就将最近最少使用的项替换成新的项。故需要引用位。同时要注意的是,页表中也有引用位。
- 脏位(dirty)。现在的计算机基本都是使用虚拟存储器,简单来说就是假如你要打开一个很大的程序,它不会把所有的文件都加载进内存。当需要用的内容不在内存上时,它再去硬盘上找并加载到内存。故脏位的作用就是,当内存上的某个块需要被新的块替换时,它需要根据脏位判断这个块之前有没有被修改过,如果被修改过,先把这个块更新到硬盘再替换,否则就直接替换。
物理页号。
引用位、脏位何时更新?
- 页表和TLB都有这两个标志位
- 如果是TLB命中,那么引用位就会被置1,
- 当TLB或页表满时,就会根据该引用位选择适合的替换位置。
- 如果TLB命中且这个访存操作是个写操作,那么脏位就会被置1,表明该页被修改过,当该页要从内存中移除时会先执行将该页写会外存的操作,保证数据被正确修改。
- 当TLB的某一项要被替换时,它的引用位和脏位都会被更新会页表。
数据A,数据B进行相等比较
比较数据使用异或门比较快,相等采用数据B去非,与数据A进行异或,每个位都等于1才相等。
TLB全相联的并行比较的实现:
- TLB使用上述结果每个位进行相与,得到的结果1/0(相等/不等)
- 将相与的信号作为TLB寄存器的三态门的选通信号
TLB需要关注的内容
①VA多少位,虚页号多少位
页号、页内地址
②TLB的映射关系
- 组相联
- 全相联
- 直接映射(x可能出现频繁抖动的问题,效率低)
③替换算法
同cache
TLB地址结构
虚页号=(Tag位)+(组号)
Tag|有效位|页框号|(替换算法信息位
- Tag(一定存在)
- 有效位
- 页框号(一定存在)
看页框数量 - 替换算法信息位
物理地址增加了两位:受影响的有页框号
VA(虚拟页号增加了两位):受影响的有Tag标记位
TLB全相联映射
一、TLB全相联的基本概念
全相联映射:在全相联映射方式下,TLB中的每一个表项都可以与任何输入的虚拟地址进行比较。这意味着,当需要查找某个虚拟地址对应的物理地址时,TLB会并行地搜索所有表项,以找到匹配的虚拟地址。
高速性:由于全相联映射允许并行搜索多个表项,因此它可以在很短的时间内找到匹配的虚拟地址,从而提高了地址转换的速度。
二、TLB全相联的工作原理
虚拟地址输入:当CPU需要访问某个虚拟地址时,该虚拟地址首先被发送到TLB。
并行搜索:TLB会并行地搜索其所有表项,以找到与输入的虚拟地址相匹配的表项。
匹配与输出:如果找到匹配的表项,则TLB会输出该表项中存储的物理地址,从而完成地址转换。如果没有找到匹配的表项,则TLB会触发页表查找过程,以获取物理地址,并将该映射关系缓存到TLB中。
三、TLB全相联的优缺点
优点:
- 高速性:由于可以并行搜索多个表项,因此全相联映射方式提供了快速的地址转换速度。
- 灵活性:全相联映射方式允许任意虚拟地址映射到TLB中的任意表项,因此具有很高的灵活性。
缺点: - 成本高昂:构造一个很大很快的全相联TLB是非常昂贵的,因为它需要复杂的电路来并行搜索多个表项。因此,
- 全相联TLB通常只适用于小型缓存。
- 功耗较高:由于需要并行搜索多个表项,因此全相联TLB的功耗通常较高。
四、TLB全相联的应用场景
全相联TLB通常用于需要高速地址转换的场景,例如在现代计算机系统中,为了提高内存访问速度,通常会使用多级缓存结构,其中TLB作为最靠近CPU的一级缓存,用于缓存虚拟地址与物理地址之间的映射关系。此外,全相联TLB还广泛应用于需要快速地址翻译的嵌入式系统、网络设备等领域。
二级页表+TLB
TLB不命中,二级页表命中的时候。更新TLB表项,需要将完整一级页号(985H)和二级页号(211H),同时作为TLB表项的标记位。(也就是说TLB命中得到的是最终的页框号。而不是二级页表的页框号)
当页面被换出时,其页表项的有效位被设置为0,记录页面在外存存储的地址。并且与之相关的TLB条目也需要被标记为无效或删除。
对于不在内存中的页面(即被置换出去的页面),页表项中可能会记录一个指向外存中该页面存储位置的指针或标识符。
当程序运行时,只有部分页面(或段)被调入内存,其余部分则留在外存(如磁盘)上。为了有效地管理这些页面,操作系统需要知道每个页面在外存中的位置,以便在需要时将其调入内存。
页面置换和调入:
当程序尝试访问一个不在内存中的页面时,会发生缺页中断。
操作系统需要响应这个中断,从外存中调入缺失的页面到内存。为了做到这一点,它必须知道该页面在外存中的确切位置。
同时,如果内存已满,无法再装入新页面,操作系统还需要通过置换功能将内存中暂时不用的页面调至外存,腾出足够的内存空间。这也需要知道页面在外存中的地址。
Cache
cache未命中而内存命中了需要的数据
在使用虚拟地址访问内存的过程中,如果cache未命中而内存命中了,通常需要将内存命中的数据加载(或称写入)到cache中,以便未来对相同数据的访问可以更快地命中cache,从而提高系统性能。
当cache未命中而内存命中时,系统会从内存中读取所需的数据,并可能将该数据存入cache中。这个过程通常被称为cache的填充(Fill)或加载(Load)。将内存中的数据加载到cache中后,cache会更新其状态,以便未来对相同数据的访问可以更快地命中cache。
cache未命中可能的替换策略:
- 在Cache未命中的情况下,如果Cache还有空闲空间,则可以直接将内存中的数据加载到Cache中。
- 如果Cache已满且没有空闲空间,则需要根据替换算法选择一个数据块进行替换。
(cache满的时候)替换算法
- 随机算法(RAND):
- 随机选择一个数据块进行替换。
- 这种算法实现简单,但命中率较低,因为它没有考虑到数据的访问模式。
- 先进先出算法(FIFO):
- 替换最早被加载到Cache中的数据块。
- 这种算法也没有考虑到数据的访问模式,可能会导致频繁访问的数据被替换掉。
- 近期最少使用算法(LRU):
- 替换最近最少被访问的数据块。
- 这种算法基于局部性原理,认为最近被访问的数据在未来也可能被频繁访问。因此,它通常具有较高的命中率。
- 最近不经常使用算法(LFU):
- 替换访问次数最少的数据块。
- 这种算法考虑了数据的访问频率,但可能没有很好地利用局部性原理,因为曾经被频繁访问的数据在未来不一定会被再次访问。
将内存中的数据写入cache的过程并不是简单的复制。cache通常会采用复杂的替换策略和一致性协议来管理其内部数据。
当cache已满且需要为新的数据块腾出空间时,cache可能会选择替换掉最近最少使用(LRU)或最不常使用(LFU)的数据块。
为了确保数据的一致性,cache和内存之间可能会采用写回(Write Back)或写直达(Write Through)等策略来处理数据的修改。
cache构成
静态分析
- cache地址结构
- 直接映射|Tag标记 |行号|块内地址
- 组相联映射 |Tag标记|组号|块内地址
- 全相联映射|Tag标记|块内地址
cache需要关注的条件
关注条件
① 物理地址位数
② cache总行数
③ cache块大小 (cache总大小和cache数据区大小是有区别的)
④ 映射方式
⑤ 写策略 全写法|回写法 一致性问题 (直写法|回写法)
脏位(回写法需要)表示数据块有没有被修改过
⑥ 替换算法
- 随机算法(不需要替换信息位)
- FIFO
(行数n,全相联每一行后面增加 l o g 2 n log_2{n} log2n的替换信息位)
组相联位数取决于路数(四路组相联需要两行, l o g 2 路数 log_2{路数} log2路数)
直接映射不需要替换位 - LRU 近期最少使用算法
- 最近不常使用算法
组相联需要关注“路数”
cache行完整构成
- 有效位(一定存在)
- Tag标记
- 数据块
- 替换信息位
- 脏位
动态分析
- PA访问序列
- cache命中率
- cache替换
- ①直接PA
- ②数组元素访问
- ③机器级代码形式给出
组相联缺失过程
Cache访问过程
拆分物理地址(PA):
- 将PA拆分成三个部分:组索引(Group Index)、行偏移(Offset)和tag标记位(Tag)。
- 每个部分占用的比特数取决于cache的组数、每组的行数(即cache的相联度)和每行的字节数(即块大小)。
定位cache组:
在一组的每个路中进行比对Tag,看是否匹配的上
匹配的上检查有效位
比较tag标记位: - 在该组中,使用tag标记位与要访问的指令的tag进行比较。
- 如果找到匹配的tag,则进一步检查有效位(Valid Bit)。
检查有效位: - 如果有效位为1,表示该cache行有效,即包含所需的指令,直接访问该cache行。
- 如果有效位为0,表示该cache行无效,即发生cache缺失。
Cache缺失处理过程
识别缺失:
当发现cache行无效(有效位为0)时,识别出cache缺失。
从主存读取块:
根据缺失的指令的物理地址,从主存中读取包含该指令的64字节块(或其他大小的块,取决于cache的块大小)。
分配cache行:
在发生缺失的cache组中,选择一个空闲的cache行(如果所有行都有效,则根据LRU替换算法选择一个行进行替换)。
更新cache行内容:
将从主存读取的块内容写入所选的cache行中。
修改cache行信息:
- 更新所选cache行的tag标记位,以反映新加载的块的地址。
- 将有效位设置为1,表示该cache行现在有效。
- 更新LRU替换算法位。
- 如果有脏位(表示cache行是否被修改过,需要写回主存),则根据具体情况设置。