教材内容总结
1.理解虚拟存储器的概念和作用
2.理解地址翻译的概念
3.理解存储器映射
4.掌握动态存储器分配的方法
5.理解垃圾收集的概念
6.了解C语言中与存储器有关的错误
下面就对第九章的内容做一个详细的总结
虚拟存储器
为了更加有效地管理存储器并且少出错,现代系统提供了一种对主存的抽象概念,叫做虚拟存储器(VM)。虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。通过一个很清晰的机制,虚拟存储器提供了三个重要的能力:1)它将主存看成是一个存储在磁盘上的地址空间同,主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。2)它为每个进程提供了一致的地址空间,从而简化了存储器管理。3)它保护了每个进程的地址空间不被其他进程破坏。
虚拟存储器是中心的。
虚拟存储器是强大的。
细腻存储器是危险的。
物理和虚拟寻址
当CPU执行这条加载指令时,它会生成一个有效物理地址,通过存储器总线,把它传递给主存。主存取出从物理地址4处开始的4字节的字,并将它返回给CPU,CPU会将它存放在一个寄存器里。现代处理器使用的是一种称为虚拟寻址的寻址形式。
将一个虚拟地址转化为物理地址的任务叫做地址翻译。CPU芯片上叫做存储器管理单元的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容是由操作系统管理的。
虚拟存储器作为缓存的工具
VM系统通过将虚拟存储器分割为称为虚拟页的大小固定的块来处理这个问题。物理存储器被分割为物理页大小也为P字节(物理页也称为页帧)。
在任意时刻,虚拟页面的集合都分为三个不相交的子集:
未分配的:VM系统还未分配(回或者创建)的页。
缓存的:当前缓存在物理存储器中的已分配页。
未缓存的:没有缓存在物理存储器中的已分配页。
9.3.1 DRAM缓存的组织结构
我们使用术语SRAM缓存来表示位于CPU和主存之间的L1、L2和L3高速缓存,并且用术语DRAM缓存来表示虚拟存储器系统的缓存,它在主存中缓存虚拟页。
在存储层次结构中,DRAM缓存的位置对它的组织结构有很大的影响。
因为对磁盘的访问时间很长,DRAM缓存总是使用写回,而不是直写。
9.3.2 页表
这些功能是由许多软硬件联合提供的,包括操作系统软件、MMU(存储器管理单元)中的地址翻译硬件和一个存放在物理存储器中叫做页表的数据结构,页表将虚拟页映射到物理页。
页表就是一个页表条目的数组。
9.3.3 页命中
9.3.4 缺页
在虚拟存储器的习惯说法中,DRAM缓存不命中称为缺页。
缺页异常调用内核中的缺页异常处理程序,该程序会选择一个牺牲页。
9.3.5 分配页面
当操作系统分配一个新的虚拟存储器页时对我们示例页表的影响。
教材问题及解决
1.间接引用坏指针?
在这种情况下,scanf将把val的内容解释为一个地址,并试图将一个字写到这个位置。在最好的情况下,程序立即以异常中止。在最糟糕的情况下,val的内容对应于虚拟存储器的某合法的读/写区域,于是我们就覆盖了存储器,这通常会在相当长的段时间以后造成灾难性的、令人困惑的后果。
解决:间接引用坏指针的一个常见示例是经典的scanf错误,假设我们想要使用scanf从stdin读一个整数到一个变量,正确的方法是传递给scanf一个格式串和变量的地址:
scanf(“%d”,&val)
代码调试及解决:
本周代码并未发现什么问题。
学习与感悟
本周通过学习虚拟存储器的相关知识,对于计算机系统中存储器部分又有了更深一步的了解。虚拟存储器作为现代操作系统中不可或缺的一部分,贡献着它自己的作用。学期接近尾声,计算机存储器这一部分的知识也已经基本学习完毕,在学习这一部分知识的时候,由于虚拟存储器的特性导致一些概念需要一定的时间琢磨,除了课本上的知识,互联网上也有一些关于虚拟存储器的知识值得我们去学习。
《深入理解计算机系统》这本书已经差不多要学习完毕了,是不是会反思自己,书的确是看完了,博客也写完了。可是知识呢?技能呢?是否都掌握了?想了想,的确又些知识掌握的不牢固,有些技能不熟练,这都在平时的测验中暴露出来,希望自己往后能够将知识、技能掌握得更加牢固一点,这样才能不枉费自己用在学习上的大量时间。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 10 /10 | 1/1 | 10/10 |
第二周 | 40 /70 | 2/4 | 18/38 |
第三周 | 150/200 | 3/7 | 15/60 |
第四周 | 160/210 | 6/8 | 23/70 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
参考:软件工程软件的估计为什么这么难,软件工程 估计方法
计划学习时间:20小时
实际学习时间:23小时
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)
参考资料
《深入理解计算机系统V3》学习指导