20145202 《信息安全系统设计基础》第14周学习总结
教材学习内容总结
- 虚拟存储器的三个重要能力:
- 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,高效的使用了主存。
- 它为每个进程提供了一致的地址空间,从而简化了存储器管理。
- 它保护了每个进程的地址空间不被其他进程破坏。
- 程序员需要理解虚拟存储器的三个原因:
- 虚拟存储器是中心的:它是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的交互中心;
- 虚拟存储器是强大的:它可以创建和销毁存储器片、可以映射存储器片映射到磁盘某个部分等等;
- 虚拟存储器若操作不当则十分危险。
- 计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址(PA)。CPU根据物理地址访问存储器的方式是物理寻址。
- 使用虚拟寻址时,CPU通过生成一个虚拟地址VA来访问主存,这个虚拟地址在被送到存储器之前先转换成适当的物理地址,地址翻译通过CPU芯片上的存储器管理单元完成。
- 地址空间是一个非负整数地址的有序集合:{0,1,2,……}
- 线性地址空间:地址空间中的整数是连续的。
- 虚拟地址空间:CPU从一个有 N=2^n 个地址的地址空间中生成虚拟地址,这个地址空间成为称为虚拟地址空间。
- 地址空间的大小:由表示最大地址所需要的位数来描述。
- 物理地址空间:与系统中的物理存储器的M个字节相对应。
- 虚拟存储器的基本思想:主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。
- 虚拟存储器——虚拟页(VP),每个虚拟页大小为P=2^p字节。
- 物理存储器——物理页(PP),也叫页帧,大小也为P字节。
- 任意时刻,虚拟页面的集合都被分为三个不相交的子集:
- 未分配的:VM系统还没分配(创建)的页,不占用任何磁盘空间。
- 缓存的:当前缓存在物理存储器中的已分配页。
- 未缓存的:没有缓存在物理存储器中的已分配页。
- DRAM缓存的组织结构
- 不命中处罚很大
- 是全相联的——任何虚拟页都可以放在任何的物理页中
- 替换算法精密
- 总是使用写回而不是直写
- 页表:是一个数据结构,存放在物理存储器中,将虚拟页映射到物理页,就是一个页表条目的数组。
- 如果设置了有效位:地址字段表示DRAM中相应的物理页的起始位置,这个物理页中缓存了该虚拟页
- 当CPU读取一个字的时候,地址翻译硬件将虚拟地址作为一个索引来定位PTE,并从存储器中读取它。
- 局部性原则保证了在任意时刻,程序将往往在一个较小的活动页面集合上工作,这个集合叫做工作集/常驻集。
- 所以只要程序有良好的时间局部性,虚拟存储器系统就能工作的相当好。
- 颠簸:工作集大小超出了物理存储器的大小。
- 操作系统为每个进程提供了一个独立的页表,也就是一个独立的虚拟地址空间。
- 多个虚拟页面可以映射到同一个共享物理页面上。
- 存储器映射:将一组连续的虚拟页映射到任意一个文件中的任意位置的表示法。
- 按需页面调度和独立的虚拟地址空间的结合简化了链接和加载、代码和数据共享,以及应用程序的存储器分配。
- 当页面命中时,CPU硬件执行步骤
- 处理缺页时,CPU硬件执行步骤
- 在既使用SRAM高速缓存又使用虚拟存储器的系统中,大多数系统选择物理寻址。
- 两者结合的主要思路是地址翻译发生在高速缓存之前。
- 页表目录可以缓存,就像其他的数据字一样。
- TLB:翻译后备缓冲器,是一个小的、虚拟存储的缓存,其中每一行都保存着一个由单个PTE组成的块
- 多级页表——采用层次结构,用来压缩页表
- 存储器映射:Linux通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器区域的内容的过程。
- 一旦一个虚拟页面被初始化了,它就在一个由内核维护的专门的交换文件之间换来换去。交换文件也叫交换空间,或交换区域。
- 当运行时需要额外虚拟存储器时,使用动态存储器分配器维护一个进程的虚拟存储器区域。
- C程序中常见的与存储器有关的错误:
- 在进程的虚拟地址空间中有较大的洞,没有映射到任何有意义的数据,如果试图引用一个指向这些洞的指针,操作系统就会以段异常来终止程序。
- 间接引用坏指针
- 读未初始化的存储器
- 允许栈缓冲区溢出
- 引用空闲堆块中的数据
- 引起存储器泄露
代码的学习
- gcc编译的时候要加上-lpthread选项
- count.c:这是一个不加锁的创建两个线程共享同一变量都实现加一操作的程序,在这个程序中虽然每个线程都给count加了5000,但由于结果的互相覆盖,最终输出值不是10000,而是5000.
- cp_t.c:用法:./cp_t [源文件名] [目的文件名] [创建线程数]
- createthread.c:
pthread_create函数中四个参数的意思:
第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。
函数thr_fn不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。
托管链接
http://git.oschina.net/tuolemi/haha