20145329 《信息安全系统设计基础》第十四周学习总结

20145329 《信息安全系统设计基础》第十四周学习总结

教材学习内容总结

1.理解虚拟存储器的概念和作用
2.理解地址翻译的概念
3.理解存储器映射
4.掌握动态存储器分配的方法
5.理解垃圾收集的概念
6.了解C语言中与存储器有关的错误

虚拟存储器

  • 概念
    为了更加有效的管理存储器,并且少出错,现代系统提供的一种对贮存的抽象概念,它是硬件异常、硬件地址翻译、贮存、磁盘文件和黑河文件的完美交互,它为每个进程提供一个大的、一致的和私有的地址空间。

  • 作用

  1. 将朱迅看成是一个存储在磁盘上的地址空间的高速缓存,在贮存中只保护活动区域,并根据需要在磁盘和主存中来回传送数据,搞笑使用了缓存。
  2. 为每个进程提供一致的地址空间,从而简化了存储管理器。
  3. 保护每个进程的地址空间不被其他程序破坏。
  • 地址翻译:将虚拟地址转化为物理地址。

  • 虚拟存储器基本思想
    每个数据对象有多个独立地址,其中每个地址都选自一个不同的地址空间,主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。

  • 虚拟页面的集合风味三个不相交的子集
    未分配的、缓存的和未缓存的。

  • SRAM
    位于CPU和主存之间的L1、L2、和L3高速缓存。

  • DRAM
    虚拟存储器系统的缓存。

  • 缺页
    DRAM缓存不命中称为缺页,缺页异常调度用内核中的缺页异常处理程序,该程序会选择一个牺牲页。

-页面调度
磁盘和存储器之间传送页的活动叫做页面调度或交换。页从磁盘换入DRAM和从DRAM换出磁盘。一直等待直到最后一刻,也就是当有不命中发生时,才换入页面的这种策略称为按需页面调度。

  • 工作集和颠簸
    程序往往在一个较小的活动页面集合上工作,这个集合叫做工作集。如果工作集的大小超出了物理存储器的大小,那么程序将产生一种不幸的状态,叫做颠簸,此时页面将不断的换进换出。

  • VM简化了链接和加载、代码和数据共享,以及应用程序的存心呼气分配。

地址翻译

  • 地址翻译:将虚拟地址转化为物理地址。

  • n位虚拟地址包含两个部分:一个P位的虚拟页面偏移和一个n-p位的虚拟页号。

  • 页面命中时,CPU执行的步骤

  1. 处理器生成一个虚拟地址,并把它传送给MMU。
  2. MMU生成PTE地址,并从高速缓存/主存请求得到它
  3. 高速缓存/主存向MMU返回PTE
  4. MMU构造物理地址,并把它传送给高速缓存/主存
  5. 高速缓存/主存返回所请求得数据字给处理器
  • 每次CPU产生一个虚拟地址,MMU必须查阅一个PTE,以便将虚拟地址翻译为物理地址。

  • 翻译后备缓冲器
    MMU中包含一个关于PTE的小的缓存

存储器映射

  • 概念
    Linux通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟虚拟存储区域的内容,这个过程称为存储器映射。

  • 虚拟存储器可以映射到两种对象中的一种

  1. Unix文件系统中的普通文件
  2. 匿名文件
  • 一个对象可以被映射到虚拟存储器的一个区域,要么作为共享对象,要么作为私有对象

  • 共享区域
    一个映射到共享对象的虚拟存储器区域叫做共享区域。

动态存储器分配


  • 动态存储器分配器维护者一个一个进程的虚拟存储器区域,称为堆。分配器将堆视为一组不同大小的块的集合来维护,每个块就是一个连续的虚拟存储器片,要么是已分配的要么是空闲的。

  • 分配器的两种风格

  1. 显式分配器
  2. 隐式分配器
  • 显式分配器工作条件
  1. 处理任意请求序列
  2. 只使用堆
  3. 对齐块
  4. 不修改已分配的块
  • 分配器编写目标
  1. 最大化吞吐率
  2. 最大化存储器利用率
    (以上两个性能目标通常相互冲突)

垃圾收集

  • 概念
    垃圾收集器是一种动态存储分配器,自动释放程序不再需要的已分配的块,这些块称为垃圾,自动回收堆存储的过程叫做垃圾收集。

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

  1. 间接引用坏指针
    在进程的虚拟地址空间中有较大的洞,没有映射到任何有意义的数据,如果试图引用一个指向这些洞的指针,操作系统就会以段异常来终止程序。

  2. 读未初始化的存储器
    常见的错误就是假设堆存储器被初始化为0。

  3. 允许栈缓冲区溢出
    如果一个程序不检查输入串的大小就写入栈中的目标缓冲区,程序就会出现缓冲区溢出错误。

  4. 假设指针和指向他们的对象大小是相同的。

  5. 造成错位错误。
    一种很常见的覆盖错误来源

  6. 引用指针,而不是他所指向的对象。

  7. 误解指针运算
    忘记了指针的算术操作是以它们指向的对象的大小为单位来进行,而这种大小单位不一定是字节。

  8. 引用不存在的变量。

  9. 引用空闲堆块中的数据。

  10. 引起存储器泄露

其他

本章学习内容和近期操作系统授课内容相近,当时每次学习都会获取新的知识。本书内容新加了实际理论映射到实际的更多介绍,但是自己代码实践还是欠缺灵活的领悟。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 50/50 1/1 20/20
第二周 50/100 1/2 30/50
第三周 100/200 1/3 20/70
第四周 0/200 0/3 20/90
第五周 50/250 1/4 20/110
第六周 50/300 1/5 20/130
第七周 0/300 1/6 20/150
第八周 0/300 1/7 20/170
第九周 100/400 2/9 20/190
第十周 0/400 1/10 20/210
第十一周 600/1000 2/11 30/230
第十二周 500/1500 2/13 30/260
第十三周 1174/2674 1/14 30/260
第十四周 0/2674 1/15 30/290

参考资料

posted @ 2016-12-18 21:43  20145329吉东云  阅读(119)  评论(1编辑  收藏  举报