四、操作系统导论——内存进阶(知识点总结)

/ 操作系统导论 / 没有评论 / 688浏览

分段

1、分段的思想:

2、代码段、堆段、栈段物理地址:
test1
test2

代码段和堆段的物理地址 = 虚拟地址 - 偏移量 + 物理基址(正向增长)

根据上图求堆中虚拟地址4200的物理地址?   
解:   
4200 - 4(KB) + 34(KB) = 34920

栈段的物理地址 = 物理基址 - (虚拟地址 - 偏移量)(反向增长)

根据上图求栈中虚拟地址15KB的物理地址?   
解:
28KB - (15KB - 14KB) = 27KB

3、支持共享:
为了支持共享,需要一些额外的硬件支持,这就是保护位(protection bit)。基本为每个段增加了几个位,标识程序是否能够读写该段,或执行其中的代码。通过将代码段标记为只读,同样的代码可以被多个进程共享,而不用担心破坏隔离。

4、管理物理内存的空闲空间:

分页:介绍

1、分页的思想:将空间分割成固定长度的分片。把物理内存看成是定长槽块的阵列,叫作页帧(page frame)。

2、分页的优点:提供空闲空间管理的简单性和灵活性(操作系统能够高效地提供地址空间的抽象,不管进程如何使用地址空间。)

3、页表:

4、页号的地址转换:
虚拟页号,又称VPN,需要操作系统使用PFN(物理页号)进行转换,偏移量则不用,保持不变。

虚拟地址 = VPN + 偏移量
物理地址 = PFN + 偏移量

test3

5、页表的具体表述:

页表就是一种数据结构,用于将虚拟地址(或者实际上,是虚拟页号)映射到物理地址(物理帧号)。
最简单的形式称为线性页表(linear page table),就是一个数组。操作系统通过虚拟页号(VPN)检索该数组,并在该索引处查找页表项(PTE),以便找到期望的物理帧号(PFN)。

6、PTE的部分内容:

分页:快速地址转换(TLB)

1、TLB(地址转换缓存):就是频繁发生的虚拟到物理地址转换的硬件缓存(cache)。也称地址转换旁路缓冲存储器。

2、虚拟地址转换为为物理地址过程(复习一下):

虚拟地址 = VPN + 偏移量  ==>>  物理地址 = PFN + 偏移量

3、TLB硬件的基本算法:
首先从虚拟地址中提取页号(VPN)。然后检查TLB 是否有该VPN 的转换映射。接下来有两种情况:

上述未命中系列操作开销较大,主要是因为访问页表需要额外的内存引用。

4、硬件缓存背后的思想是利用指令和数据引用的局部性(locality):

  • 时间局部性:时间局部性是指,最近访问过的指令或数据项可能很快会再次访问。
  • 空间局部性:空间局部性是指,当程序访问内存地址x 时,可能很快会访问邻近x 的内存。

5、一个区别:

6、缓存替换(cache replacement):当TLB满了,插入新项,将替换旧项,常见的两种策略:

分页:较小的表

1、一个假设:
假设32位地址空间(即4GB内存大小),页大小为4KB,每个页表项为4字节。
==>> 则一个这样的地址空间中会有100w虚拟页面。
==>> 则每个页表大小为4MB左右。
==>> 一个进程一个页表。

假设100个进程同时运行,则需要400M大小的地址存页表。这,显然不合理。

2、简单的解决方案:增大页,比如页从4KB,增大到16KB,一个页表就减小到1M。
缺点:增大页,会导致更多的内部碎片。

3、混合方法(杂合方法):不为进程的整个地址空间提供单个页表,而是为每个逻辑分段提供一个。

4、二级页表方法: 增加一个“页目录”的新结构,将线性页表变成了类似树的结构。页目录项(PageDirectory Entries,PDE)

基本思想(着重理解):首先,将页表分成页大小的单元。然后,如果整页的页表项(PTE)无效,就完全不分配该页的页表。为了追踪页表的页是否有效(以及如果有效,它在内存中的位置),使用了名为页目录(page directory)的新结构。页目录因此可以告诉你页表的页在哪里,或者页表的整个页不包含有效页。

缺点:在TLB命中时,性能和线性页表相同,在TLB 未命中时,需要从内存加载两次,才能从页表中获取正确的地址转换信息(一次用于页目录,另一次用于PTE 本身),而用线性页表只需要一次加载。

一旦从VPN 中提取了页目录索引(简称PDIndex),我们就可以通过简单的计算来找到页目录项(PDE)的地址:PDEAddr = PageDirBase +(PDIndex×sizeof(PDE))
这里就不展开了。

5、引申出的多级页表:
由于页目录可能也过大无法放入1页中,所以又引申出多级页表。
构建多级页表的目标:使页表的每一部分都能放入一个页。

6、其他想法: