学号20145332 《信息安全系统设计基础》第十四周学习总结
9.1 物理和虚拟寻址
物理地址:
计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址PA。
根据物理地址寻址的是物理寻址。
虚拟地址:
虚拟存储器被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。
使用虚拟寻址时,CPU通过生成一个虚拟地址VA来访问主存,这个虚拟地址在被送到存储器之前先转换成适当的物理地址
9.2 地址寻址
是一个非负整数地址的有序集合。如若地址空间中的整数是连续的,那么这就是一个线性地址空间
地址空间区分了数据对象(字节)和他们的属性(地址)
9.3 虚拟存储器作为缓存的工具
在任意时刻,虚拟页面的集合都被分为三个不相交的子集:
①未分配的:VM系统还没分配/创建的页,不占用任何磁盘空间。
②缓存的:当前缓存在物理存储器中的已分配页
③未缓存的:没有缓存在物理存储器中的已分配页
·DRAM缓存的组织结构:
①不命中处罚很大
②是全相联的——任何虚拟页都可以放在任何的物理页中。
③替换算法精密
④总是使用写回而不是直写。
·页表:是一个数据结构,存放在物理存储器中,将虚拟页映射到物理页。
就是一个页表条目PTE的数组
·缺页:就是指DRAM缓存不命中。
缺页异常:会调用内核中的缺页异常处理程序,选择一个牺牲页。
页:虚拟存储器的习惯说法,就是块
交换=页面调度:磁盘和存储器之间传送页的活动
按需页面调度:直到发生不命中时才换入页面的策略,所有现代系统都使用这个。
9.4 虚拟存储器作为存储器管理的工具
操作系统为每个进程提供了一个独立的页表,也就是一个独立的虚拟地址空间。
抖个虚拟页面可以映射到同一个共享物理页面上。
存储器映射:将一组连续的虚拟页映射到任意一个文件中的任意位置的表示法。
9.5 虚拟存储器作为存储器保护的工具
任何现代计算机系统必须为操作系统提供手段来控制对存储器系统的访问。
地址翻译机制以一种自然的方式扩展到提供更好的访问控制。每次CPU生成一个地址时,地址翻译硬件都会读一个PTE,所以通过在PTE上添加一些额外的许可位来控制对一个虚拟页面内容的访问十分简单。
9.6 地址翻译
1.地址翻译:是一个N元素的虚拟地址空间(VAS)中的元素和一个M元素的物理地址空间(PAS)中元素之间的映射。
2.页表基址寄存器:
CPU中的一个控制寄存器,叫做页表基址寄存器(page table base register,PTBR)指向当前页表。N位的虚拟地址包含两个部分:一个p位的VPO(virtual page offset,虚拟页面偏移)和一个n-p位的VPN(virtual page number)。MMU利用VPN来选择适当的PTE。如VPN0选择PTE0。因为物理和虚拟页面都是p字节的,所以PPO(physical page offset物理页面偏移)和VPO是相同的,所以,将页表条目中PPN(physical page number,物理页号)和虚拟地址中的VPO串联起来,就是相应的物理地址。
3.页面命中完全由硬件处理的,而处理缺页要求硬件和OS内核协作完成。
4.结合高速缓存和虚拟存储器
大多数系统是选择物理寻址的方式来访问高速缓存。使用物理寻址,多个进程同时在高速缓存中有存储块和共享来自相同虚拟页面的块成为简单的事情。而且,高速缓存无需处理保护的问题,因为访问权限的检查是地址翻译过程中一部分。
5.利用TLB加速地址翻译
在MMU中包括一个关于PTE的小的缓存,称为TLB。TLB是一个小的,虚拟寻址的缓存,其中每一行都保存着一个由单个PTE组成的块。
6.多级页表
多级页表——采用层次结构,用来压缩页表。
9.8 存储器映射
存储器映器:指Linux通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器区域的内容的过程。
共享对象:共享对象对于所有把它映射到自己的虚拟存储器进程来说都是可见的。即使映射到多个共享区域,物理存储器中也只需要存放共享对象的一个拷贝。
私有对象:私有对象运用的技术:写时拷贝,在物理存储器中只保存有私有对象的一份拷贝。
mmap函数要求内核创建一个新的虚拟存储器区域
9.9 动态存储器分配
·分配器的要求和目标:
要求:处理任意请求序列、立即响应请求、只使用堆、对齐块、不修改已分配的块
目标:最大化吞吐率(吞吐率:每个单位时间里完成的请求数)
最大化存储器利用率——峰值利用率最大化
·碎片(虽然有未使用的存储器,但是不能用来满足分配请求时,发生这种现象):
内部碎片:发生在一个已分配块比有效载荷大的时候
易于量化。
外部碎片:发生在当空闲存储器合计起来足够满足一个分配请求,但是没有一个单独的空间块足以处理这个请求时发生
难以量化,不可预测。
·隐式空闲链表
堆块的格式:由一个字的头部,有效荷载,和可能的额外填充组成。
·放置已分配的块
①首次适配:从头开始搜索空闲链表,选择第一个合适的空闲块
②下一次适配:从上一次搜索的结束位置开始搜索
③最佳适配:检索每个空闲块,选择适合所需请求大小的最小空闲块
·合并空闲块:合并是针对于假碎片问题的,任何实际的分配器都必须合并相邻的空闲块。
两种策略:立即合并、推迟合并。
·显式空闲链表:
区别:①分配时间:隐式的,分配时间是块总数的线性时间
但是显式的,是空闲块数量的线性时间。
②链表形式:隐式——隐式空闲链表
显式——双向链表,有前驱和后继,比头部脚部好使。
排序策略:后进先出、按照地址顺序维护
·分离的空闲链表
分离存储,是一种流行的减少分配时间的方法。一般思路是将所有可能的块大小分成一些等价类/大小类。
分配器维护着一个空闲链表数组,每个大小类一个空闲链表,按照大小的升序排列。
基本方法:
①简单分离存储每个大小类的空闲链表包含大小相等的块,每个块的大小就是这个大小类中最大元素的大小。
②分离适配:每个空闲链表是和一个大小类相关联的,并且被组织成某种类型的显示或隐式链表,每个链表包含潜在的大小不同的块,这些块的大小是大小类的成员。
这种方法快速并且对存储器使用很有效率。
③伙伴系统:其中每个大小类都是2的幂
这样,给定地址和块的大小,很容易计算出它的伙伴的地址,也就是说:一个块的地址和它的伙伴的地址只有一位不同。
9.10 垃圾收集
垃圾收集器:是一种动态存储分配器,它自动释放程序不再需要的已分配块。这些块称为垃圾。自动回收堆存储的过程叫做垃圾收集。
在对Mark&Sweep的描述中使用下列函数:其中ptr定义为typedef void *ptr