2017-2018-1 20155208 《信息安全系统设计基础》第十一周学习总结
学习目标
- 理解虚拟存储器的概念和作用
- 理解地址翻译的概念
- 理解存储器映射
- 掌握动态存储器分配的方法
- 理解垃圾收集的概念
- 了解C语言中与存储器有关的错误
教材学习内容总结
第九章 虚拟存储器
虚拟存储器的三个重要能力:
-
它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,高效的使用了主存
-
它为每个进程提供了一致的地址空间,从而简化了存储器管理
-
它保护了每个进程的地址空间不被其他进程破坏
虚拟存储器是中心的、强大的、危险的。
物理和虚拟寻址
- 物理寻址
主存被组织成一个由M个连续的字节大小的单元组成的数组,依次类推的寻址方式称为物理寻址。
- 虚拟寻址
CPU生成一个虚拟地址(VA)来访问主存,在被传送到存储器之前先转换成适当的物理地址。地址翻译通过CPU芯片上的存储器管理单元完成。
- 地址空间
地址空间是一个非负整数地址的有序集合:{0,1,2,……}
1、线性地址空间
地址空间中的整数是连续的。
2、虚拟地址空间
CPU从一个有 N=2^n 个地址的地址空间中生成虚拟地址,这个地址空间成为称为虚拟地址空间。
3、物理地址空间
与系统中的物理存储器的M个字节相对应。
4、地址空间的大小
由表示最大地址所需要的位数来描述。 N=2^n:n位地址空间
主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。
- 虚拟存储器作为缓存的工具
虚拟存储器——虚拟页VP,每个虚拟页大小为P=2^平字节
物理存储器——物理页PP,也叫页帧,大小也为P字节
任意时刻,虚拟页面的集合都被分为三个不相交的子集:
未分配的:VM系统还没分配/创建的页,不占用任何磁盘空间。
缓存的:当前缓存在物理存储器中的已分配页
未缓存的:没有缓存在物理存储器中的已分配页
DRAM缓存的组织结构
不命中处罚很大 是全相联的——任何虚拟页都可以放在任何的物理页中。 替换算法精密 总是使用写回而不是直写。
- 页表
页表:是一个数据结构,存放在物理存储器中,将虚拟页映射到物理页,就是一个页表条目的数组。
页表就是一个页表条目PTE的数组。
PTE:由一个有效位和一个n位地址字段组成的,表明了该虚拟页是否被缓存在DRAM中。
页表的组成:有效位+n位地址字段
如果设置了有效位:地址字段表示DRAM中相应的物理页的起始位置,这个物理页中缓存了该虚拟页。
如果没有设置有效位:
空地址:表示该虚拟页未被分配
不是空地址:这个地址指向该虚拟页在磁盘上的起始位置。
- 缺页
缺页:就是指DRAM缓存不命中。
缺页异常:会调用内核中的缺页异常处理程序,选择一个牺牲页。
页:虚拟存储器的习惯说法,就是块
交换=页面调度:磁盘和存储器之间传送页的活动
按需页面调度:直到发生不命中时才换入页面的策略,所有现代系统都使用这个。
- 虚拟存储器中的局部性
局部性原则保证了在任意时刻,程序将往往在一个较小的活动页面集合上工作,这个集合叫做工作集/常驻集。 所以只要程序有良好的时间局部性,虚拟存储器系统就能工作的相当好。
颠簸:工作集大小超出了物理存储器的大小。
作为存储器管理的工具
-
操作系统为每个进程提供了一个独立的页表,也就是一个独立的虚拟地址空间。
-
多个虚拟页面可以映射到同一个共享物理页面上。
-
存储器映射:将一组连续的虚拟页映射到任意一个文件中的任意位置的表示法。
-
按需页面调度和独立的虚拟地址空间的结合简化了链接和加载、代码和数据共享,以及应用程序的存储器分配。
-
简化链接:独立的地址空间允许每个进程的存储器映像使用相同的基本格式,而不管代码和数据实际存放在物理存储器的何处。
-
简化加载:虚拟存储器使得容易想存储器中加载可执行文件和共享文件对象。
-
简化共享:独立地址空间为操作系统提供了一个管理用户进程和操作系统自身之间共享的一致机制。
-
简化存储器分配:虚拟存储器为向用户进程提供一个简单的分配额外存储器的机制。
作为存储器保护的工具
通过在PTE上添加一些额外的许可来控制对一个虚拟页面的内容访问。
PTE的三个许可位:
-
SUP:表示进程是否必须运行在内核模式下才能访问该页
-
READ:读权限
-
WRITE:写权限
-
结合高速缓存和虚拟存储器
在既使用SRAM高速缓存又使用虚拟存储器的系统中,大多数系统选择物理寻址。 两者结合的主要思路是地址翻译发生在高速缓存之前。 页表目录可以缓存,就像其他的数据字一样。
- 利用TLB加速地址翻译
TLB:翻译后备缓冲器,是一个小的、虚拟存储的缓存,其中每一行都保存着一个由单个PTE组成的块
步骤 1、CPU产生一个虚拟地址
2、MMU从TLB中取出相应的PTE
3、MMU将这个虚拟地址翻译成一个物理地址,并且将它发送到高速缓存/主存 4、高速缓存/主存将所请求的数据字返回给CPU
存储器映射
指Linux通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器区域的内容的过程。
映射对象:
-
Unix文件系统中的普通文件
-
匿名文件(全都是二进制0)
execve函数:
创建新的虚拟存储器区域
参数:
start:这个区域从start开始
fd:文件描述符
length:连续的对象片大小
offset:距文件开始处的偏移量
prot:访问权限位,具体如下:
PROT_EXEC:由可以被CPU执行的指令组成
PROT_READ:可读
PROT_WRITE:可写
PROT_NONE:不能被访问
flag:由描述被映射对象类型的位组成,具体如下:
MAP_ANON:匿名对象,虚拟页面是二进制0
MAP_PRIVATE:私有的、写时拷贝的对象
MAP_SHARED:共享对象
碎片
内部碎片:发生在一个已分配块比有效载荷大的时候,易于量化。
外部碎片:发生在当空闲存储器合计起来足够满足一个分配请求,但是没有一个单独的空间块足以处理这个请求时发生。难以量化,不可预测。
隐式空闲链表
-
堆块的格式:由一个字的头部,有效荷载,和可能的额外填充组成。
-
将堆组织成一个连续的已分配块和空闲块的序列:
-
空闲块通过头部中的大小字段隐含地连接着,分配器可以通过遍历堆中所有的块,从而间接地遍历整个空闲块的集合。
-
需要:特殊标记的结束块。
垃圾收集
垃圾收集器是一种动态存储分配器。,自动释放程序已经不再需要的已分配块(垃圾)。
-
Mark&Sweep垃圾收集器
-
Mark&Sweep垃圾收集器由标记阶段和清除阶段组成,标记阶段标记出根节点所有可达的和已分配的后继,清除阶段释放每个未被标记的已分配块。
-
在对Mark&Sweep的描述中使用下列函数
ptr isPtr(ptr p):如果p指向一个已分配块中的某个字,那么就返回一个指向这个块起始位置的指针b,否则返回NULL。
int blockMarked(ptr b):如果已经标记了块b,就返回true。
int blockAllocated(ptr b):如果块b是已分配的,就返回true。
void markBlock(ptr b):标记块b。
int length(ptr b):返回块b的以字为单位的长度(不包括头部)。
void unmarkBlock(ptr b):将块b的状态由已标记的改为未标记的。
ptr nextBlock(ptr b):返回堆中块b的后继。
其他(感悟、思考等,可选)
对虚拟存储器的认识更深了,了解了垃圾处理,页等知识,物理和虚拟寻址的方法。
学习进度条
代码行数(新增/积累) | 博客量(新增/积累 | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 5/5 | 1/1 | 8/8 |
第二周 | 120/120 | 1/1 | 12/12 |
第三周 | 100/100 | 1/1 | 15/15 |
第四周 | 80/80 | 1/1 | 9/9 |
第五周 | 50/50 | 1/1 | 6/6 |
第六周 | 350/350 | 1/1 | 12/12 |
第七周 | 120/120 | 2/2 | 15/15 |
第八周 | 380/380 | 1/1 | 16/16 |
第九周 | 120/120 | 3/3 | 22/22 |
第十一周 | 50/50 | 2/2 | 18/18 |
参考资料
《深入理解计算机系统V3》学习指导