20155212 2017-2018-1 《信息安全系统设计》第11周学习总结
20155212 2017-2018-1 《信息安全系统设计》第11周学习总结
教材学习内容总结
Chapter 09
- 虚拟内存是对主存的抽象
- 虚拟内存是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。
- 虚拟内存三个重要能力
- 将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中保存活动区域,并根据需要在磁盘和内存之间来回传送数据,高效使用了主存
- 为每个进程提供了一直的地址空间,从而简化了内存管理
- 它保护了每个进程的地址空间不能被其他进程破坏
- 需要理解虚拟内存的原因
- 虚拟内存是核心的,有助于理解系统是如何工作的
- 虚拟内存是强大的,可以通过内存位置读改磁盘文件中的内容或者 非显式复制文件到内存
- 虚拟内存是危险的,虚拟内存使用不当,可能会出现与内存相关的复杂危险的错误
物理和虚拟寻址
-
主存被组织成一个由M个连续的字节大小的单元组成的数组。
-
物理寻址
-
虚拟地址
地址空间
- 地址空间是一个非负整数地址的有序集合。
- 若地址空间中的整数是连续的,它是线性地址空间。
- 地址空间的大小由表示最大地址所需要的位数来描述。现代操作系统通常支持32/64位
e.g. N=2^n 个地址的虚拟地址空间就叫做一个n位地址空间
- 物理地址对应于系统中物理内存的M个字节
- 虚拟内存的基本思想:允许每个数据对象有多个独立的地址,其中每个地址都选自一个不同的地址空间
虚拟内存作为缓存的工具
- 虚拟内存被组织成一个有存放在磁盘上的N个连续的字节大小的单元组成的数组,虚拟地址是索引,数组内容被缓存在主存中
- VM系统将虚拟内存分割为成为虚拟页的大小固定的块,作为传输单元。大小P=2^p字节
- 物理内存被分割为物理页,大小为P字节,物理页也被称为页帧
- 任意时刻,虚拟页面的集合都分为三个不相交的子集:
- 未分配的
- 缓存的
- 未缓存的
DRAM缓存的组织结构
- DRAM缓存的位置低它的组织结构有很大影响
- DRAM的缓存中的不命中比SRAM缓存的不命中要昂贵得多
- DRAM比SRAM要慢大约10倍,而磁盘要比DRAM慢大约100 000多倍
- DRAM缓存不命中有磁盘服务,SRAM缓存不命中通常是由基于DRAM的主存来服务
- 从磁盘的一个扇区读取第一个字节的时间开销比读这个扇区中连续的字节要慢大约100 000倍
- DRAM缓存的组织结构完全是由巨大的不命中开销驱动的
- 因为大的不命中处罚和访问第一个字节的开销,虚拟页往往很大,通常是4KB-2MB
- 由于大的不命中处罚,DRAM缓存是全相联的,即任何虚拟页都可以放置在任何的物理页中
- 因为磁盘的访问时间很长,DRAM缓存总是使用写回,而不是直写
页表
-
页表将虚拟页映射到物理页
-
操作系统负责维护页表的内容,以及在磁盘与DRAM之间来回传送页
-
页表的基本组织结构
缺页
- DRAM缓存不命中称为缺页
分配页面
局部性的应用
- 局部性原则保证了在任意时刻,程序将趋向于在一个较小的活动页面集合(工作集或常驻集合)上工作,因而整个运行过程中程序引用的不同页面的总数不会超过物理内存总的大小
- 如果工作集的大小超出了物理内存的大小,程序会产生抖动的状态
- 如果程序性能很慢,可以考虑是否发生了抖动
虚拟内存作为内存管理的工具
- 操作系统为系统中的每个进程都维护一个独立的页表
- VM在内存管理中的作用
- 简化链接
- 简化加载
- 简化共享
- 简化内存分配
- 将一组连续的虚拟页映射到任意一个文件中的任意位置的表示法称为内存映射
- Linux提供一个
mmap
的系统调用,允许应用程序自己做内存映射
虚拟内存作为内存保护的工具
-
通过在PTE上添加一些额外的许可位来控制对一个虚拟页面内容的访问
-
如果一条指令违反了许可条件,那么CPU就触发一个一般保护故障,将控制传递给一个内核中的异常处理程序。shell提示“段错误”
地址翻译
-
地址翻译符号小结
-
形式上说,地址翻译是一个N元素的虚拟地址空间中的元素和一个M元素的物理地址空间中元素之间的映射
-
使用页表的地址翻译
-
页面命中时,CPU硬件执行步骤
- 处理器生成一个虚拟地址,并把它传送给MMU
- MMU生成PTE地址,并从高速缓存/主存请求得到它
- 高速缓存/主存向MMU返回PTE
- MMU构造物理地址,并把它传送给高速缓存/主存
- 高速缓存/主存返回所请求的数据字给处理器
-
处理缺页
- 处理器生成一个虚拟地址,并把它传送给MMU
- MMU生成PTE地址,并从高速缓存/主存请求得到它
- 高速缓存/主存向MMU返回PTE
- PTE中的有效位是零,所以MMU触发了一次异常,传递CPU中的控制到操作系统内核中的缺页异常处理程序
- 缺页处理程序确定出物理内存中的牺牲页,如果这个页面已经被修改了,则把它换出到磁盘
- 缺页处理程序页面调入新的页面,并更新内存中的PTE
- 缺页处理程序返回到原来的进程,再次执行导致缺页的指令
结合高速缓存
- 大多数系统选择使用物理寻址访问SRAM高速缓存
- 地址翻译发生在高速缓存查找之前
利用TLB加速地址翻译
- TLB是一个小的、虚拟寻址的缓存,其中每一行都保存着一个由单个PTE组成的块
- 有着高度的相联度
- 如果T=2^t个组,那么TLB索引室友VPN的t个最低位组成的,而TLB表姐是由VPN中剩余的位组成的
- TLB命中的步骤(地址翻译在MMU执行,速度快)
- CPU产生一个虚拟地址
- MMU从TLB中取出相应的PTE
- MMU翻译成物理地址,送到高速缓存/主存
- 高速缓存/主存将所请求的数据字返回给CPU
- TLB不命中时,MMU必须从L1缓存中取出相应的PTE,新取出的PTE存放在TLB,可能覆盖
多级页表
- 使用层次结构的页表来压缩页表
Intel Core i7/Linux
- 处理器封装包括四个核、一个大的所有核共享的L3高速缓存、一个DDR3内存控制器
- 每个核包含一个层次结构的TLB、一个层次结构的数据和指令高速缓存、一组快速的点到点链路(基于QuickPath技术,是为了让一个核与其他其他核和外部I/O桥直接通信)
- TLB是虚拟寻址、四路组相联
- L1-3物理寻址,块大小为64字节
- L1-2是8路组相联的,L3是16路组相连的
Core i7地址翻译
虚拟内存系统
- Linux为每个进程维护了一个单独的虚拟地址空间
- Linux虚拟内存区域
- Linux将虚拟内存组织成一些区域(也叫做段)的集合。
- 一个区域就是已经存在的(已分配)虚拟内存连续片,这些页都是以某种方式相关联的
- 任务结构
- Linux缺页异常处理
- 判断虚拟地址是否合法,即判断虚拟地址在某个结构定义的区域内,缺页处理程序搜有区域结构的链表,如果不合法则触发段错误,终止进程
- 判断内存访问是否合法,即判断是否有权限。
- 如果内核知道缺页是由于对合法的虚拟地址进行合法的操作造成的,那么会选择一个牺牲页面,重新启动缺页指令
内存映射
- 对象
- Linux文件系统中的普通文件
- 匿名文件
- 在任何时刻,交换空间都限制着当前运行着的进程能够分配的虚拟页面的总数
共享对象
- 一个对象可以被映射到虚拟内存的区域,要么作为共享对象,要么作为私有对象
- 一个映射到共享对象的虚拟内存区域叫做共享区域,类似也有私有区域
- 私有对象写时复制
fork函数
- 内核为新进程创建各种数据结构,并分配PID
- 创建虚拟内存:创建当前进程mm_struct、区域结构和页表的原样副本,两个进程的页面标记只读,区域结构标记私有
- 新进程返回时,新进程的虚拟内存和fork存在的虚拟内存相同
execve函数
- 删除已存在的用户区域
- 映射私有区域
- 映射共享区域
- 设置程序计数器
mmap函数的用户级内存映射
-
mmap可视化解释
-
munmap()函数删除
动态内存分配
- 显式分配器
- 隐式分配器
- 便于维护
分配器的要求和目标
- 要求
- 处理任意请求序列
- 立即响应请求
- 只使用堆
- 对齐块
- 不修改已分配的块
- 目标
- 最大吞吐率
- 最大化内存利用率。前k+1个峰值利用率
碎片
- 造成堆利用率低的原因是碎片现象
- 内部碎片是在一个已分配块比有效载荷大时发生的,大小为之差
- 外部碎片是当空闲内存合计起来满足一个分配请求,但是没有一个单独的足够大的空闲块
- 外部碎片比内部碎片量化困难
- 启发式策略
隐式空闲链表
- 将堆组织为一个连续的已分配块和空闲块的序列,该结构成为隐式空闲链表
显式空闲链表
- 程序不需要一个空闲块的主体,隐式不合适
- 维护链表
- 后进先出
- 按地址顺序
分离的空闲链表
- 简单分离存储
- 分离适配
- 伙伴系统
垃圾收集
-
自动释放不需要的已分配块
-
垃圾收集器将内存视为一张有向图
-
Mark & Sweep垃圾收集器
-
C程序保守的Mark & Sweep垃圾收集器。根本原因在于C语言不会用类型信息来标记内存位置
C程序中常见的与内存有关的错误
- 间接引用坏指针
- 读未初始化的指针
- 允许栈缓冲区溢出
- 假设指针和它们指向的大小是相同的
- 造成错位错误
- 引用指针而不是它指向的对象
- 误解指针运算
- 引用不存在的变量
- 引用空闲堆块的变量
- 引起内存泄露
教材学习中的问题和解决过程
- 什么是直写?什么是写回?两者有什么区别?
- 直写达:又称全写法,当写Cache命中时,Cache与主存同时发生写修改,因而较好的维护了与主存的内容一致性。
- 写回法:当CPU写Cache命中时,只修改Cache的内容,而不立即写入主存;只有当此行被换出时才写回主存。
- 两种方式各有利弊,直写缓存方法利用了高速缓存中的数据始终与主存储器中数据匹配的特点。但是,需要的总线周期却非常耗时,从而降低性能。回写缓存可以维持性能,因为写入始终是在“爆发”中进行的,因而运行所需的总线周期将大大减少。
- Linux系统中有个交换分区,那就是用来交换文件的吗?
- 是。Linux 在安装的时候,一般需要划出一个分区作为 Linux 的“交换分区”,作为虚拟内存内容的保存分区。
- 目前的服务器上RAM都相当充足,那么是否可以考虑抛弃Swap交换分区呢?
- 不应该抛弃,这是有必要的
- Swap分区类似UPS,在异常情况下可以发挥重要作用
- 可以避免内存泄露
- 休眠时,需要使用Swap分区
- Advantages
- Provides overflow space when your memory fills up completely
- Can move rarely-needed items away from your high-speed memory
- Allows you to hibernate
- Disadvantages
- Takes up space on your hard drive as SWAP partitions do not resize dynamically
- Can increase wear and tear to your hard drive
- Does not necessarily improve performance (see below)
代码托管
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 96/96 | 1/1 | 15/15 | |
第二周 | 30/126 | 1/2 | 21/36 | |
第三周 | 30/156 | 1/3 | 21/57 | |
第四周 | 10/156 | 1/4 | 20/77 | |
第五周 | 23/189 | 3/7 | 20/97 | |
第六周 | 201/390 | 3/10 | 18/115 | |
第七周 | 0/390 | 2/12 | 20/135 | |
第八周 | 0/390 | 3/15 | 22/157 | |
第九周 | 284/674 | 3/18 | 25/182 | |
第十周 | 53/727 | 1/19 | 15/197 | |
第十一周 | 612/1339 | 2/21 | 26/223 | |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。 | ||||
耗时估计的公式 | ||||
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。 |
-
计划学习时间:25小时
-
实际学习时间:26小时
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)