`
hideto
  • 浏览: 2652271 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深入理解计算机系统10,虚拟存储器 垃圾收集器

阅读更多
虚拟存储器是对主存的一个抽象
支持虚拟存储器的处理器通过使用一种叫虚拟寻址的间接形式来使用主存
处理器产生一个虚拟地址,在被发送到主存之前,这个地址被翻译成一个物理地址
从虚拟地址空间到物理地址空间的地址翻译要求硬件和软件紧密合作
专门的硬件通过使用页表来翻译虚拟地址,而页表的内容是由操作系统提供的

虚拟存储器的三个重要功能:
1,它在主存中自动缓存最近使用的存放磁盘上的虚拟地址空间的内容
虚拟存储器缓存中的块叫做页。对磁盘上页的引用会触发缺页,缺页将控制转移到操作系统中的一个缺页处理程序
缺页处理程序将页面从磁盘拷贝到主存缓存,如果必要,将写回被驱逐的页
2,虚拟存储器简化了存储器管理,进而又简化了链接、在进程间共享数据、进程的存储器分配、以及程序加载
3,虚拟存储器通过在每条页表条目中加入保护位,从而简化了存储器保护

地址翻译的过程必须和系统中任意硬件缓存的操作集成在一起
大多数页表条目位于L1高速缓存中,但是一个称为TLB的页表条目在芯片上的高速缓存,通常会消除访问在L1上的页表条目的开销

现代系统通过将虚拟存储器组块和磁盘上的文件组块关联起来,来初始化虚拟存储器组块,这个过程称为存储器映射
存储器映射为共享数据、创建新的进程以及加载程序,提供了一种高效的机制
应用可以使用mmap函数来手工地创建和删除虚拟地址空间的区域
然而大多数程序依赖于动态存储器分配器,如malloc,它管理虚拟地址空间区域内的一个称为堆的区域
动态存储器分配器是一个有系统级感觉的应用级程序,它直接操作存储器,而无需类型系统的很多帮助
分配器有两种类型:显示分配器要求应用显式地释放它们的存储器块:隐式分配器(垃圾收集器)自动释放任何无用的和不可达的块

对于C程序员来说,管理和使用虚拟存储器是一件困难和容易出错的任务
常见的错误示例包括:间接引用坏指针,读取未初始化的存储器,允许栈缓冲区溢出,假设指针和它们指向的对象大小相同,
引用指针而不是它所指向的对象,误解指针运算,引用不存在的变量,以及引起存储器泄漏

垃圾收集可以追溯到John McCarthy在20世纪60年代早期在MIT开发的Lisp系统
McCarthy独创的Mark&Sweep(标记&清除)算法可以建立在已存在的malloc包的基础之上,为C和C++程序提供垃圾收集

垃圾收集器将存储器视为一张有向可达图,该图的节点被分成一组根节点和一组堆节点
每个堆节点对应于堆中的一个已分配块,有向边p->q意味着块p中的某个位置指向块q中的某个位置
根节点对应于不在堆中的位置,它们中包含着指向堆中的指针
这些位置可以是寄存器、栈里的变量或者是虚拟存储器中读写数据区域内的全局变量
当存在一条从任意根节点出发并到达p的有向路径时,我们说一个节点p是可达的
在任何时刻,和垃圾对应的不可达节点是不能被应用再次使用的
垃圾收集器的角色是维护可达图的某种表示,并通过释放不可达节点并将它们返回给空闲链表,来定期地回收它们

ML和Java这样的语言的垃圾收集器对应用如何创建和使用指针有很严格的控制,能够维护可达图的一种精确的表示,因此也就能够回收所有垃圾
而诸如C和C++这样的语言的收集器通常不能维持可达图的精确表示,这样的收集器也叫保守的垃圾收集器

收集器可以按需提供它们的服务,或者它们可以作为一个和应用并行的独立线程,不断地更新可达图和回收垃圾

Mark&Sweep垃圾收集器由标记阶段和清除阶段组成
标记阶段标记出根节点的所有可达的和已分配的后继,而后面的清除阶段释放每个未被标记的已分配块
典型地,块头部中空闲的低位中的一位用来表示这个块是否被标记了

C程序的Mark&Sweep收集器必须是保守的,其根本原因是C语言不会用类型信息来标记存储器位置
因此,像int或者float这样的标量可以伪装成指针
例如,假设某个可达的已分配块在它的有效载荷中包含一个int,其值碰巧对应于某个其他已分配块b的有效载荷中的一个地址
对收集器而言,是没有办法推断出这个数据实际是int而不是指针
因此,分配器必须保守地将块b标记为可达,尽管事实上它可能是不可达的
分享到:
评论

相关推荐

    计算机操作系统 虚拟存储器

    虚拟存储 虚拟存储器.cpp : Defines the entry point for the application.

    虚拟存储器_操作系统实验报告

    大学计算机专业,操作系统实验报告,虚拟存储器

    操作系统管理---虚拟存储器-实验报告-代码(1).doc

    操作系统管理---虚拟存储器-实验报告-代码(1).doc

    操作系统虚拟存储器实验报告

    包括源程序、实验报告

    深入理解计算机系统(清晰版)

    深入理解计算机系统各个版本 深入理解计算机系统各个版本 (1张) 底层的内存中的数据表示、流水线指令的构成、虚拟存储器、编译系统、动态加载库,以及用户应用等。书中提供了大量实际操作,可以帮助读者更好地理解...

    深入理解计算机系统(中文版)

    深入理解计算机系统各个版本 深入理解计算机系统各个版本 (1张) 底层的内存中的数据表示、流水线指令的构成、虚拟存储器、编译系统、动态加载库,以及用户应用等。书中提供了大量实际操作,可以帮助读者更好地理解...

    深入理解计算机系统-中英文

    《深入理解计算机系统》(英文版)主要介绍了计算机系统的基本概念,包括最底层的内存中的数据表示、流水线指令的构成、虚拟存储器、编译系统、动态加载库,以及用户应用等。书中提供了大量实际操作,可以帮助读者更好...

    深入理解计算机系统 原书第2版 中文版 完整 (第2共2部分)

    《深入理解计算机系统 原书第2版 》从程序员的视角详细阐述计算机系统的本质概念 并展示这些概念如何实实在在地影响应用程序的正确性 性能和实用性 《深入理解计算机系统 原书第2版 》共12章 主要内容包括信息的表示...

    操作系统课程设计 虚拟存储器

    操作系统课程设计 虚拟存储器 #include<stdio.h>#define block_length 128#define page_length 7#define length 4 //加载的物理块个数int pages[4]={0,1,2,3}; //该数组保存物理块对应的页号int k; // 该数组的队列...

    深入理解计算机系统(英文版)

    本书的最大优点是帮助读者理解概念,让读者很清楚地在脑海中构造一个层次型的计算机系统,从最低层数据在内存中的表示(如我们一直陌生的浮点数表示),到流水线指令的构成,到虚拟存储器,到编译系统,到动态加载库...

    操作系统原理实验-虚拟存储器

    比较适合大学生的操作系统课程应用解说,尤其是大学操作系统原理实验,是一个必学项目

    深入理解计算机系统(原书第2版)

    《计算机科学丛书:深入理解计算机系统(原书第2版)》从程序员的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性、性能和实用性。全书共12章,主要内容包括信息的表示和处理...

    深入理解计算机系统-中文版-ppt6b

    本书主要介绍了计算机系统的基本概念,包括最底层的内存中的数据表示、流水线指令的构成、虚拟存储器、编译系统、动态加载库,以及用户应用等。书中提供了大量实际操作,可以帮助读者更好地理解程序执行的方式,改进...

    深入理解计算机系统-中文版-ppt5

    本书主要介绍了计算机系统的基本概念,包括最底层的内存中的数据表示、流水线指令的构成、虚拟存储器、编译系统、动态加载库,以及用户应用等。书中提供了大量实际操作,可以帮助读者更好地理解程序执行的方式,改进...

    深入理解计算机系统-中文版-ppt3e

    本书主要介绍了计算机系统的基本概念,包括最底层的内存中的数据表示、流水线指令的构成、虚拟存储器、编译系统、动态加载库,以及用户应用等。书中提供了大量实际操作,可以帮助读者更好地理解程序执行的方式,改进...

    深入理解计算机操作系统第三章习题答案

    《深入理解计算机系统》一书有两个版本,分别由Randal E.Bryant /和David R.O’Hallaron编著。书中主要介绍了计算机系统的基本概念,包括最底层的内存中的数据表示、流水线指令的构成、虚拟存储器、编译系统、动态...

    深入理解计算机系统 原书第2版 中文版 完整 (第1共2部分)

    《深入理解计算机系统 原书第2版 》从程序员的视角详细阐述计算机系统的本质概念 并展示这些概念如何实实在在地影响应用程序的正确性 性能和实用性 《深入理解计算机系统 原书第2版 》共12章 主要内容包括信息的表示...

    深入理解计算机系统(英文原版)

    深入理解计算机系统各个版本 深入理解计算机系统各个版本(1张) 底层的内存中的数据表示、流水线指令的构成、虚拟存储器、编译系统、动态加载库,以及用户应用等。书中提供了大量实际操作,可以帮助读者更好地理解...

    虚拟存储器 操作系统 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断

    在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间总和可以超出主存的绝对地址空间。用这种办法扩充主存储器称为虚拟存储器。通过本实验帮助...

    操作系统课程设计虚拟存储器各页面置换算法的实现与比较

    操作系统课程设计虚拟存储器各页面置换算法的实现与比较 C源代码

Global site tag (gtag.js) - Google Analytics