CSAPP第九章:虚拟存储器

来源:互联网 发布:广告网站源码 编辑:程序博客网 时间:2024/04/29 23:00

为什么需要虚拟存储器:进程需要的地址空间比较大;那么当一个程序没有空间的时候,进程就没有办法运行。


虚拟存储器是对主存的一种抽象;(VM)。虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互;他为每个进程提供一个大的,一致的,私有的地址空间。它在后台沉默。自动的工作

1)他将主存看做是一个存储在磁盘上的地址空间的高速缓存

2)为每个进程提供了一致的的地址空间(0-4G)

3)保护了每个进程的私有空间不被其他线程破坏。


两个角度:1)虚拟存储器是如何工作的。2)应用程序如何使用和管理虚拟存储器。

  • 物理寻址:主存从物理地址中取出4字节的字,返回给CPU,CPU将它放到一个寄存器里。
  • 虚拟寻址:CPU生成一个虚拟地址访问主存,在访问主存前,这个虚拟地址被先转换成了物理地址。这个过程叫做地址翻译;MMU负责地址翻译;它利用放在主存当中的查询表动态翻译地址;该表的内容有操作系统进行管理。
虚拟地址空间和物理地址空间的对应关系。

9.3 虚拟存储器作为缓存的工具:

1)VM系统是拿主存作为缓存的:虚拟存储器(VM)存储在磁盘上:其实就是扩展的地址空间:对于一个进程来说是4G;图9.3指的是如果物理地址(在内存中)缺页,进行的换页操作。也就是说:。
2)VM系统将虚拟存储器分割为块,称为虚拟页:一般分为3种:未分配的、缓存的、未缓存的。

3)页表;在物理存储器中,由操作系统和MMU管理,一般会有一个虚拟页和相对应的物理页缓存在内存中。页表是一个数据结构,里面存的是指针,对应的物理页存储的才是数据。虚拟页是一个虚类,其基本的对象是页表。一般大小是4KB。

页命中的概念:详见图9-5
缺页不是替换整个页表,而是替换其中的一部分。一个page;相对应的,从虚拟存储器拿出相对应的物理地址放到内存中去。

局部性:页面调度不会太破坏程序的性能,因为局部性保证了在任意时刻,程序往往在一个较小的活动页面工作(工作集)。如果经常发生换页的情况,叫做颠簸。

9.8 用户地址空间映射:图9-31
9.9 动态存储器分配:堆
  • 显示分配:new,malloc
  • 隐式分配:gc。
  • 显示分配注意不要引用野指针(即已经删除了的指针)。
  • 分配器通常采用启发式策略来做碎片处理。
9.10 垃圾收集:
  • 原因:未能回收已经分配的块:garbage collector
  • 基本知识:将存储器视为有向可达图;堆节点视为堆中的分配快;根节点一般是指向堆中的指针。(寄存器或者局部变量、全局变量)也就是说,如果不可达的话,将视为垃圾。
  • 收集器可以作为一个和应用并行的独立线程。
  • Mark&Sweep:1.输入指针,计算指向的堆的长度,并且mark出来;2.清除掉所有没有mark的对象。保守的收集器
9.11 常见的C语言存储器错误:
  • 引用坏指针
  • 读未初始化的存储器
  • 允许栈缓冲区溢出
  • 假定指针的大小和他们指向对象的大小是相同的
  • 错位错误
  • 引用指针而不是它们所指向的对象
  • 误解指针运算
  • 引用不存在的变量
  • 引用空闲堆块中的数据
  • 存储器泄露
小结:
  • 虚拟存储器是对主存的一个抽象
  • MMU+OS-》PTB

原创粉丝点击