Operating Systems: Three Easy Pieces-13 Address Spaces

Operating Systems: Three Easy Pieces

第十三章:Address Spaces

之前,建立一个电脑操作系统是非常容易的事情,也许你会问为什么?因为用户的期望很低。是那些“该死”的用户们,期望“易用”,“性能高”,“可靠”等,才导致所有的这些另人头疼的事情。下次碰到这些用户时,别忘感谢他们,制造了所有的这些问题。

13.1早期的系统:

从内存的角度看,早期的机器没有将其抽象给用户,基本上,机器的物理内存看起来如图13.1

操作系统是一套程序(事实上,是一个库), 位于内存中(本例中公位于物理地址0), 同时会有一个运行的程序(一个进程) 位于物理内存中,本例中位于物理地址64K处。早期的系统没有一些不切实际的想法,用户对OS没有太多的期望,所以对OS开发者来说,日子比较好过,是不是?

13.2并行处理和分时系统

不久后,由于机器比较昂贵,人们开始更加有效的共享机器。因此并行处理时代来到了,这种情况下,多个进程就绪,可以同时运行,OS负责在他们之间切换,例如一个进程需要执行IO操作。这样做,增加了CPU的使用率。用这种方法增加效率有早些时间是非常重要的,当时的机器价值几十或者上百万美元(你认为你的MAC是昂贵的).

然而很快,对机器的需求越来越多,分时处理的时代到来。特别对程序员来说,他们认识到批处理计算的局限性,他们对长时间的编码-调试周期感到厌烦。交互性就变得非常重要,因为很可能很多用户同时使用一个机器,每个用户都在等待他们正在运行的程序的及时响应。

实现分时的一种方法就是短时间运行一个程序,给他访问所有内存的权限,之后暂停它,把它所有的状态保存到类似磁盘的介质中(包括所有的物理内存数据), 加载其它进程的状态,同样短时间运行,这样就实现了某种程度上的暴力机器共享。

不幸的是,这种实现有一个大问题:太慢,尤其对于内存增长来说更加显著。保存和加载毫寄存器级别的状态(如PC,通用寄存器)是相对来说比较快速的,但是保存所有的内存数据到磁盘中, 不夸张的说,没有效率。因此在切换进程时,宁愿将进程保存在内存中,OS中这种分时的实现是更加有效率一些。

在13.2图中,有三个进程,A,B,和C,每一个分配了512K物理内存,假定单CPU,OS选择执行一个进程,比如A,此时B和C位于就绪队列,等待执行。

随着分时变得越来越流行,或许你能猜到,对操作系统来说,就会有新的需求。特别对于允许多任务位于内存中,就使得“保护”变成一个重要的问题。你当然不希望一个进程可以读或者写其它进程的内存。

13.3 Address Space

然而,我们不得不在脑子里想着那些讨厌的用户,这样就需要OS对物理内存建立一个容易使用的抽象。我们叫这个抽象为address space,它是运行着的程序,在系统中看待内存的视角。理解这个基本的OS抽象,是理解内存抽象的关键。

进程的address space包含了运行程序的所有的内存状态。例如,位于内存中某一处的程序的代码指令,它们就在address space中。程序在运行的时候,用stack来记录他在调用序列中的位置,同时申请的局部变量,传递的参数返回的值都保存在stack中。最后,heap有于动态申请,用户管理的内存,如你可能用c语文中的malloc,或者面向对象语文C++或者JAVA中的new。当然,address space中还包含其它的东西,如静态初始化的变量,目前为止,我们假定只有三部分,code, stack和heap。

13.3中,介绍了一个address space只有16KB的例子。程序的code部分位于address space头部(从0开始,占据1KB的address space)。代码是静态的(因此容易存放到内存中),所以把它放在头部并且代码部分,在程序运行时也不会需要额外的空间。

下面,address space的另外两个区域,它们可能在程序运行时增长或者变小。顶部的heap和底部的stack。把它们这样放置,是因为这两部分空间都希望增长,通过将它们放在address space相反的两端,可以实现这种增长:它们只需要向相反的方向增长即可。heap起始地址位于code区域后,向下增长;stack起始于16KB向上增长。然而,这样放置heap和stack只是一种约定俗成,你可以按照你的方式安排address space地址空间。

当然,描述address space时,我们所述的是OS提供给运行程序的抽象。程序实际上不一定位于物理地址从0到16KB之间;实际上它位于物理地址的任意地址。例子中的进程A,B,和C,在图13.2中你可以看到每一个进程是怎样Load到内存中不同的地址的。因此就产生了一个问题:

OS是怎样在基于一个物理内存的基础上,为多个运行的程序建立这个抽象,私有,可能很大的地址空间?

OS这样做的时候,我们把它叫做虚拟内存,因为运行的程序认为,它们被加载到一个特定的地址,0地址,并且拥有一个很大的地址空间(32bits或者64bits), 事实并非如此。

例如,13.2图中的进程A,试图加载到0(我们叫它为虚拟地址)地址,某种程度上对OS来说,在硬件的帮助下,会确保不会加载到物理地址0处,而是加载到物理地址320KB的地址。这就是虚拟内存的关键点,它存在于所有的现代的操作系统当中。

13.4  目的

到这里,我们需要讲讲OS的虚拟内存了。OS不仅仅对内存虚拟化,它这样做遵循一套标准。确保OS这样做,我们需要列出一些指导目标,之前已经提到过这些目标,这里再看一遍,它们是非常值得再看一遍的。

对于虚拟内存系统的一个主要的目标就是,透明。OS实现虚拟内存时,要对运行的程序透明,这样程序不必关心内存是虚拟化的;并且 ,程序运行起来就像拥有自己的物理内存。在这个假象后面,OS(包含硬件)做了所有的事情。

另一个目标是效率。OS应用确保虚拟化尽可能高效,从时间和空间上来算均需要如此。实现时间高效的虚拟化,OS依赖于硬件,包括硬件的TLB等。

最后,VM的第三个目标是保护性,OS应该保护每一个进程。一个进程执行load,store或者取址时,不应该访问或者影响其它进程的内存。这种保护机制使每个进程运行在自己的独立的空间中,防止对其它进程造成恶意的破坏。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值