20135201李辰希第十四周总结

学习计时:共xxx小时

读书:

代码:

作业:

博客:

一、学习目标

理解虚拟存储器的概念和作用

理解地址翻译的概念

理解存储器映射

掌握动态存储器分配的方法

理解垃圾收集的概念

了解C语言中与存储器有关的错误

二、学习资源

1. 教材:第九章《虚拟存储器》

2. 课程资料:https://www.shiyanlou.com/courses/413   实验十,课程邀请码:W7FQKW4Y

3. 教材中代码和习题中代码运行、思考一下,读代码的学习方法见这。

 

三、学习方法

1.  进度很重要:必须跟上每周的进度,阅读,练习,问答,项目。我会认真对待每一位同学,请你不要因为困难半途而废。

2. 问答很重要:遇到知识难点请多多提问,这是你的权利更是您对自己负责的义务。问答到博客园讨论小组:http://group.cnblogs.com/103791/
3. 实践很重要:解决书中习题,实践书中实例,完成每周项目,才算真的消化了这本好书。通过实验楼环境或自己安装的虚拟机在实践中进行学习
4. 实验报告很重要:详细记录你完成项目任务的思路,获得老师点评和帮助自己复习。学习完成后在博客园中(http://www.cnblogs.com/)把学习过程通过博客发表,博客标题“信息安全系统设计基础第十四周学习总结”

 

四、学习任务

1. 阅读教材,完成课后练习(书中有参考答案)

2. 考核:练习题把数据变换一下

3. 加分题:课后作业最多两人一组,互相不能重复,1星题目每人最多加一分,2星题目每人最多加二分,3星题目每人最多加三分,4星题目每人最多加四分。

 

、后续学习预告(可选):

 

、学习过程

 

.系统中的进程是共享CPU和主存资源的,所形成的挑战:

1.进程以平滑方式慢了下来

2.某些进程无法运行

3.存储器容易被破坏

4.进程写了其他进程的存储器

 

.为了有效的管理存储器,提供了对主存的抽象概念:虚拟存储器

 

.虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,为每个进程提供了一个大的、一致的和私有的空间。三个重要能力:

 

(1)它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域, 并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。 (2)它为每个进程提供了一致的地址空间,从而简化了存储器管理。 (3)它保护了每个进程的地址空间不被其他进程破坏。

 

.理解虚拟存储器:

 

虚拟存储器是中心的 虚拟存储器是强大的 虚拟存储器是危险的


.物理和虚拟地址

1.主存被组织成一个由M个连续的字节大小的单元组成的数组。

2.每字节都有一个唯一的物理地址(Physical Address,PA)。第一个字节的地址为0,累加。

3.物理寻址:CPU访问存储器的最自然的方式就是使用物理地址。早期的PC、数字信号处理器、嵌入式微控制器、Cray超级计算机这样的系统仍然使用物理寻址。

4.虚拟寻址:使用虚拟寻址时,CPU通过生成一个虚拟地址来访问主存,这个虚拟地址在被送到存储器之前先转换成适当的物理地址。将一个虚拟地址转

换为物理地址的任务叫做地址翻译。 CPU芯片上叫做存储器管理单元的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容是由操作系统管理。

.地址空间

1.地址空间是一个非整数地址的有序集合:{0,1,2,...}

2.如果地址空间中的整数是连续的,那么我们说它是一个线性地址空间。

3.在一个带虚拟存储器的系统中,CPU从一个有N = 2 ^ n个地址空间中生成虚拟地址,这个地址空间称为虚拟地址空间:{0,1,2,3,...,N-1}

4.一个地址空间的大小是由表示最大地址所需要的位数来描述的。例如,一个包含N=2^n个地址的虚拟地址空间叫做一个n位地址空间。现在系统典型地支持32位或者64位虚拟地址空间是。

地址空间的概念是很重要的,因为它清楚地区分了数据对象(字节)和它们的属性(地址)。一旦认识到了这种区别,那么我们就可以将其推广,允许每个数据对象有多个独立的地址,其中每个地址都选自一个不同的地址空间。这就是虚拟存储器的基本思想。主存中每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。



.虚拟存储器作为缓存的工具

1.虚拟存储器被组织为一个由存放在磁盘上N个连续的字节大小的单元组成的数组。每个字节都有一个唯一的虚拟地址,这个唯一的虚拟地址

是作为到数组的索引的。

2.每个虚拟页的大小为P = 2 ^ n字节。物理存储器被分割为物理页(PP),大小也为P字节(物理页也称为页帧)。

3.在任意时刻,虚拟页面的集合都分为三个不相交的子集:未分配的、缓存的、未缓存的

 

.页表

同任何缓存一样,虚拟存储器系统必须有某种方法来判定一个虚拟页是否存放在DRAM中的某个地方。如果是,系统还必须确定这个虚拟页存放在哪个物理页中。如果不命中,系统必须判断这个虚拟页存放在磁盘的哪个位置,在物理存储器中选择一个牺牲页,并将虚拟页从磁盘拷贝到DRAM中,替换这个牺牲页。

这些功能是由许多软硬件联合提供的,包括操作系统软件,MMU(存储器管理单元)中地址翻译硬件和一个存放在物理存储器中叫做页表(page table)的数据结构。

1.页表将虚拟页映射到物理页。

2.页表就是一个页表条目的数组。

3.每个PTE由一个有效位和一个n位地址字段组成

 

.缺页

1.缺页(page fault):DRAM缓存不命中。

2.在磁盘和存储器之间传送页的活动叫做交换或者页面调度

3.按需页面调度:当有不命中发生时,才换入页面的策略。

 

.虚拟存储器作为存储器管理的工具

1、存储器映射:将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器区域的内容,一旦一个虚拟页面被初始化了,

他就在一个由内核维护的专门的交换文件之间换来换去。

2.简化链接、简化加载、简化共享、简化存储器分配

 

十一.虚拟存储器作为存储器保护的工具

1.计算机系统必须为操作系统提供手段来控制对存储器系统的访问。

2.地址翻译机制可以以一种自然的方式扩展到提供更好的访问控制:

 

十二.地址翻译

翻译整个过程:

地址翻译单元从虚拟地址中拿到虚拟页号,检查TLB,看是否存在TPE的缓存,如果有返回,若没有,查询主存的页表,页表可以实现多级,

拿到物理页号,如没有产生中断,调入地址,内核重新发送解析指令,最终返回物理地址;得到物理地址之后,将物理地址发给L1缓存,L1

没有L2、L3、主存。

十三.Linux虚拟存储器系统

1. Linux虚拟存储器区域

每个存在的虚拟页存在某个区域中,而不属于某个区域的虚拟页是不存在的,并且不能被进程引用。

2.一个具体区域结构包含的字段:

(1)vm_start:指向这个区域的起始处。
(2)vm_end:指向这个区域的结束处。
(3)vm_prot:描述这个区域的内包含的所有页的读写许可权限。
(4)vm_flags:描述这个区域内页面是与其他进程共享的,还是这个进程私有的(还描述了其他一些信息)。
(5)vm_next:指向链表中下一个区域结构。

 

十四.存储器映射

Linux(以及其他一些形式的Unix)通过将一个虚拟存储器区域与一个磁盘上的对象(object)关联起来,以初始化这个虚拟存储器区域的内容,这个过程称为存储器映射(memory mapping)。虚拟存储器区域可以映射到两种类型的对象的一种:

1.Unix文件上的普通文件:一个区域可以映射到一个普通磁盘文件的连续部分,例如一个可执行目标文件。文件区(section)被分成页大小的片,每一片包含一个虚拟页面的初始化内容。因为按需进行页面高度,所以这些虚拟页面没有实际进行物理存储器,直到CPU第一次引用到页面(即发射一个虚拟地址,落在地址空间这个页面的范围之内)。如果区域文件区要大,那么就用零来填充这个区域的余下部分。

2.匿名文件:一个区域也可以映射到一个匿名文件,匿名文件是由内核创建的,包含的全是二进制零。CPU第一次引用这样一个区域内的虚拟页面时,内核就在物理存储器中找到一个合适的牺牲页面,如果该页面被修改过,就将这个页面换出来,用二进制零覆盖牺牲页面并更新页表,将这个页面标记为是驻留在存储器中的。注意在磁盘和存储器之间没有实际的数据传送。因为这个原因,映射到匿名文件的区域中的页面有时也叫做请求二进制零的页(demand-zero page)。

 

无论在哪种情况下,一旦一个虚拟页面被初始化了, 它就在一个由内核维护的专门的交换文件(swap file)之间换来换去。交换文件也叫做交换空间(swap space)或者交换区域(swap area)。需要意识到的很重要的一点,在任何时刻,交换空间都限制着当前运行着的进程能够分配的虚拟页面的总数。

 

十五.动态存储分配

1.堆:一个动态存储器分配器维护着一个进程的虚拟存储器区域。

堆是一个请求二进制0的区域;对于每个进程,内核维护着一个变量brk,它指向堆的顶部。

分配器将堆视为一组不同大小的块的集合来维护。每个块就是一个连续的虚拟存储器组块,要么是已分配的,要么是未分配的。

2.显式分配器、隐式分配器

3.不修改已分配的块:分配器只能操作或者改变空闲块。一旦被分配,就不允许修改或者移动它。

4.碎片

外部碎片、内部碎片

5.放置分配的块的策略有:

首次适配、下一次适配、最佳适配

 

十六.垃圾收集

1.垃圾收集器:一种动态存储分配器,它自动释放程序不再需要的已分配块。

2.垃圾:程序不再需要的已分配块。

3.垃圾收集:自动回收堆存储的过程。

在一个支持垃圾收集的系统中,应用显式分配堆块,但是从不显式地释放。

(1)垃圾收集器的基本知识

垃圾收集器将存储器视为一张有向可达图。

节点可达的:存在一条从任意根节点出发并到达p的有向路径。 不可达节点对应于垃圾。
  • ML和JAVA的垃圾收集器,对如何创建和使用指针有严格的控制,能够维护可达图的一种精确表示,因此能够回收所有垃圾。

  • C和C++的垃圾收集器是保守的垃圾收集器,不能维护可达图的精确表示。每个可达图块都被正确的标记为可达,而一些不可达节点却可能被错误的标记为可达。

(2)Mark&Sweep垃圾收集器

Mark&Sweep垃圾收集器:

标记阶段: 清除阶段:

(3)C程序的保守Mark&Sweep

C程序的Mark&Sweep收集器必须是保守的,根本原因是C语言不会用类型信息来标记存储器位置。

 

 

 

七、遇到的问题及解决

(提示:此处由学生填写,是重要的得分点,要写出遇到的问题和解决方案以及对出现问题的思考)

 

 

 

八、其他

本次是最后一次强制写博客了,虽然没有善始但想善终。本次内容很难而且很杂,光读书就花了不少时间,知识也没有完全掌握,以后再看看别的同学的博客来梳理一下知识点。

ps:老师抱歉,我又给写成文章了,我这里默认的就是文章,上周太激动就忘选随笔了.....

你可能感兴趣的:(20135201李辰希第十四周总结)