清华大学《操作系统》(七):虚拟存储、覆盖、交换

接下来几节都是对虚拟存储的讲解。虚拟存储是非连续存储管理的扩展。通过将内存中的数据暂存到外存的方式,为进程提供更大的内存空间。虚拟存储出现的主要原因是因为程序规模的增长速度远远大于存储器容量的增长速度,导致内存空间不够用。其实针对内存空间不够用的问题有多重解决方案,比如覆盖、交换、虚拟存储。它们的概念如下:

  • 覆盖:应用程序手动把需要的指令和数据加载到内存;
  • 交换:操作系统自动把暂时不能执行的程序保存到外存中;
  • 虚拟存储:在有限的内存中,以页为单位自动装入更多更大的程序

覆盖

目标:在较小的可用内存中运行较大的程序。

方法:依据程序逻辑,将程序划分为若干功能相对独立的模块,不会同时执行的模块共享同一块内存区域。具体有以下几点:

  • 必要部分(常用功能)的代码和数据常驻内存;
  • 可选部分(不常用功能)放在其它程序模块中,只在需要时加载到内存;
  • 不存在调用关系的模块可以相互覆盖,共用同一块内存区域。

具体操作如下:假设有一个程序总大小190K,调用关系如下图。我们按照上述原则对程序进行分组,比如A单独一组,B与C没有调用关系因此B、C一组,D、E、F没有调用关系分为一组,分配内存时按照组内最大的模块分配内存,如图中右侧,A划分20K,B、C这组分配50K,D、E、F这组分配40K,按照需求向内存中加载。这样这个程序可以在内存大小为110K的机器中运行。那么这种分组方式是不是最优的呢?答案是否定的,我们可以将大小相近的分到一组,比如A单独一组20K,B、E、F无调用关系50K,C、D无调用关系30K,总共需要100K内存。因此不同的分组方式对内存的需求是不一样的。想要严格讨论哪种方式内存需求最小是很复杂的。

缺点

  • 增加编程困难。需要程序员划分功能模块,并确定模块之间的覆盖关系,增加了编程的复杂度;
  • 增加执行时间。需要将各程序模块在内存模块中换入换出,实际是用时间换空间。

交换

交换与覆盖讨论的尺度是不太一样的。覆盖是一个程序内,如果无法全部加载到内存,而交换是内存足够放一个程序,而无法放多个程序。

目标:增加正在运行或需要运行的程序的内存。

实现方法:

  • 可将暂时不能运行的程序放到外存;
  • 换入换出的基本单位是进程;
  • 换出是把一个进程的整个地址空间保存到外存;
  • 换入是把一个进程的整个地址空间从外存加载到内存。

问题

  • 交换时机:只当内存空间不足或有不足的可能的时候才进行换入换出;
  • 交换区大小:存放所有用户进程的所有内存映像的拷贝;
  • 程序换入时的重定位:换入时不是放回原处,因此需要程序运行过程中采用动态地址映射。

覆盖与交换对比:

  • 覆盖:
  1. 只能发生在没有调用关系的模块之间;
  2. 程序员须给出模块之间的逻辑覆盖关系;
  3. 发生在运行程序的内部模块间。
  • 交换:
  1. 以进程为单位;
  2. 不需要模块间的逻辑覆盖关系;
  3. 发生在内存进程间。

交换是可以通过操作系统实现的,而覆盖是无法在操作系统中实现的,必须有程序员具体实现,增大了编程的难度。

虚拟存储

虚拟存储是想把一部分内存中的内容暂时存放到外存中,以提供更大的内存空间。例如

虚拟存储的目标:

  • 只把部分程序放到内存中,从而运行比物理内存大的程序。并且由操作系统完成,无需程序员的干涉。
  • 实现进程在内存和外存在之间交换,从而获得更多的空闲内存空间。在内存与外存之间只交换进程的部分内容。

局部性原理

具体讲虚拟存储之前先了解一下局部性原理。局部性原理是指程序在执行过程中的一个较短时期,所执行的指令地址和指令的操作数地址,分别局限于一定区域。比如通常指令在代码段,操作数在数据段。具体体现在以下几个方面:

  • 时间局部性。一条指令的一次执行和下次执行,一个数据的一次访问与下次访问都集中在一个较短时期内;
  • 空间局部性。当前指令和邻近的几条指令,当前访问的数据和邻近的几条数据都集中在一个较小的区域内;
  • 分支局部性。一条跳转指令的两次执行,很可能跳转到相同的内存位置。

由于局部性原理的存在,从理论上讲,虚拟存储技术是能够实现的,可以取得满意的效果。

虚拟存储基本概念:

  1. 思路:将不常用的部分内存块暂存到外存。
  2. 原理:装载程序时,只将当前指令执行需要的部分页面或段装入内存;指令执行中需要的指令或数据不在内存中(缺页或缺段)时,处理器通知操作系统将相应的页或段调入内存中;操作系统将内存中暂时不用的页面或段保存到外存中,如何判定哪些不常用,需要后续的置换算法。
  3. 实现方式:虚拟页式存储、虚拟段式存储。

虚拟存储的基本特征:

  1. 不连续性。物理内存分配非连续,虚拟地址空间使用非连续。
  2. 大用户空间。提供给用户的虚拟内存可大于实际的物理内存。
  3. 部分交换。虚拟存储支队部分虚拟地址空间进行调入和调出。

虚拟存储的支撑技术:

  • 硬件支持。页式或段式存储中的地址转换机制。除之前非连续内存管理中所讲的地址转换,还要增加判断所需要的内容不再内存中。
  • 操作系统支持。管理内存和外存间页面或段的换入和换出。

虚拟页式存储:

在页式存储管理的基础上,增加请求调页和页面置换。具体思路是当用户程序要装载到内存运行时,只装入部分页面就启动程序运行。进程在运行中发现有需要的代码或数据不在内存时,则向系统发出缺页异常请求。操作系统在处理缺页异常时,将外存中相应的页面调入内存,使得进程能够继续运行。如下图所示,在页表中加入标志位,当发现缺页时触发缺页异常,操作系统接管,找到相应页面置入内存,并将标志位修改为有效。

虚拟页式管理中,页表项结构有相应调整,如下图:增加了几个标志位。其中驻留位用来表示是否在内存中;修改位表示在内存中的该页是否被修改过,因为如果没有修改过而外存中又有这一页面时不需要置换,直接作废该页表项即可,如果被修改过则需要重新置换;访问位表示该页是否被访问过(读或写),用于置换算法,用于近似统计是否经常访问;保护位表示该页的允许访问方式,如可读可写。

示例:

下面是X86 32位系统以4K为页帧大小时的页表项结构:帧号项占20位,标志位中除了前面提到的驻留位、可写标志、访问位、修改位,还有几个没提到过的。一个是用户态标志,表示用户态是否可以访问;保留位,用于扩展,比如现在很多32位系统不仅支持4G内存;CD位,缓存是否有效,是否允许启用高速缓存;WT是否写通。

缺页异常:

缺页异常即发现需要的内存页不在内存中。缺页异常处理流程如下图:

执行命令时CPU给出需要的逻辑地址,查找页表;发现缺页,产生缺页异常;操作系统启用缺页异常例程,查找页面在外存中的位置;从物理内存中找空闲页帧并将页面换入空闲处;将页表项修改为有效;重新执行导致异常的指令。

可以看到这是最顺利的情况,如果换入时发现没有空闲页帧的话则需要额外几步:根据页面置换算法选择要被换出的页帧;判断该页帧是否被修改过,如果被修改过则写回外存,否则直接作废;将其对应的页表项改为无效;然后将需要的页帧换入空出来的区域,后续与最开始的流程一致。

虚拟页式存储中的外存是如何管理的呢?首先是在何处保存未被映射的页?因为必须能够方便地找到在外存中的页面内容,因此我们需要一个交换空间,有两种方式实现:磁盘或文件。Linux就是直接有交换分区。或者文件采用特殊格式存储未被映射的页面。

虚拟页式存储中的外存选择也是个问题。代码段本身就是存储在可执行文件中的,因此代码段是直接指向你的可执行文件;动态加载的共享库程序段也直接指向相应的文件;其他段放在对换区。

虚拟页式存储管理的性能如何评价呢?

我们定义了一个有效存储访问时间(effective memory access time)EAT。

举个例子:可以看到想要效率较高,需要缺页率p极小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

遵义大数据中心项目工程概况_市委书记张新文到曹州云都大数据中心等项目现场调研建设情况...

4月25日,市委书记张新文到曹县调研重点项目建设情况,研究推进措施。市委常委、秘书长任仲义参加活动。张新文首先来到曹州云都大数据中心项目建设现场,查看项目推进情况。曹州云都大数据中心,是涵盖云计算区、研发办公区、公寓生活…

linux 可执行文件的分析(gcc GUN BUILEIN)

1、GCC The History of GCC 1984年,Richard Stallman发起了自由软件运动,GNU (Gnus Not Unix)项目应运而生,3年后,最初版的GCC横空出世,成为第一款可移植、可优化、支持ANSI C的开源C编译器。GCC最初的全名是GNU C Com…

Cassandra 的数据存储结构——本质是SortedMapRowKey, SortedMapColumnKey, ColumnValue

Cassandra 的数据存储结构 Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型。它借鉴了 Amazon 的 Dynamo 和 Googles BigTable 的数据结构和功能特点,采用 Memtable 和 SSTable 的方式进行存储。在 Cassandra 写入数据之前&a…

清华大学《操作系统》(八):置换算法

功能:置换算法是指当出现缺页异常时,需要调入新页面而内存已满时,置换算法选择被置换的物理页面。 设计目标: 尽可能减少页面的调入调出次数;把未来不再访问或短期内不访问的页面调出。 页面锁定: 了解具…

烂泥:通过vsphere给esxi添加本地硬盘

公司ESXi服务器的硬盘空间不够使用,现在新加了一块硬盘在ESxi服务器上。在服务器上添加完硬盘后,在Vsphere上是看不到新加硬盘的。 下面我们来通过虚拟机模拟该情况,先添加一块硬盘。如下图: 在Esxi添加完硬盘后,现在通…

清华大学《操作系统》(九):进程和线程

进程 定义: 进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行的过程。 组成: 代码数据状态寄存器(正在运行的一个程序的所有状态信息):CPU状态CP0、指令指针IP通用寄存器:AX、BX、CX…

开始Flask项目

1.新建Flask项目。2.设置调试模式。3.理解Flask项目主程序。4.使用装饰器,设置路径与函数之间的关系。5.使用Flask中render_template,用不同的路径,返回首页、登录员、注册页。6.用视图函数反转得到URL,{{url_for(‘login’)}}&am…

烂泥:mysql数据库使用的基本命令

1、连接数据库的格式 mysql -h IP -u用户名 -p密码; 1.1连接远程数据库 mysql -h 192.168.1.214 -uroot -p123456 也可写成: mysql -h 192.168.1.214 -u root -p 123456 1.2连接本地数据库 mysql -uroot -p123456 也可写成: mysql -u root -p 123456 2、…

《操作系统》OS学习(十):进程控制

进程切换(上下文切换): 定义:暂停当前运行进程,从运行状态变成其他状态,调度另一个进程从就绪状态变成运行状态要求:切换前,保存进程上下文;切换后,恢复进程…

GCC 命令选项使用详解

GCC 命令行详解[转帖] 1、gcc包含的c/c编译器 gcc、cc、c、g gcc和cc是一样的,c和g是一样的,一般c程序就用gcc编译,c程序就用g编译 2、gcc的基本用法 gcc test.c这样将编译出一个名为a.out的程序 gcc test.c -o test这样将编译出一个名为t…

mvn 打包_Spark源码打包编译的过程

前言上篇文章介绍了下 安装sbt环境 启动scala项目安装SBT环境运行Scala项目为什么要弄这个 因为我本来是想对spark源码编译部署spark是用scala语言编译的spark源码https://gitee.com/pingfanrenbiji/sparkspark提供的编译方式编译的前提是将所有的依赖包都下载下来而资源包管理…

清华大学《操作系统》(十一):处理机调度

一、处理机调度概念 进程切换(上下文切换):切换CPU的当前任务,从一个进程/线程到另一个,保存当前在PCB/TCB中的执行上下文,读取下一个的上下文 CPU调度:从就绪队列中挑选一个进程/线程作为CPU…

对称加密与非对称加密

(一)对称加密(Symmetric Cryptography) 对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key&#xff…

清华大学《操作系统》(十二):临界区与锁

多进程并发运行,导致多个进程间有资源共享,比如CPU、内存,因此存在不确定性和不可重现,可能导致多次运行结果不一致。因此操作系统需要利用同步机制在并发执行的同时,保证一些操作是原子操作。 互斥是指一个进程占用了…

清华大学《操作系统》(十八):管程于信号量

信号量与管程也是进程间通信的方式。信号量是与锁在同一层级实现的,是操作系统提供的一种协调共享资源访问的方法。信号量由操作系统管理,操作系统作为管理者地位是高于进程的。 一、信号量 1、信号量(semaphore):是操…

Iptalbes自动封杀暴力破解(Qmail邮件系统)者的IP地址

今天发现Qmail邮件系统的maillog里面有大量的“user not found”信息,通过下面的日志不难发现,是来自同一IP的很多不同的用户连接Qmail邮件系统认证失败的信息。黑客试图通过这种方式来破解Qmail邮件系统的用户名和密码,从而来发送大量的垃圾…

安装Postman

在web和移动端开发时,常常会调用服务器端的restful接口进行数据请求,为了调试,一般会先用工具进行测试,通过测试后才开始在开发中使用。 这里介绍一下如何在chrome浏览器利用postman应用进行restful api接口请求测试。 因为&#…

清华大学《操作系统》(二十):死锁和进程通信

一、死锁 死锁:一组阻塞的进程(两个或多个),持有一种资源,等待获取另一个进程所占有的资源,而导致谁都无法执行。 可重复使用的资源: 在一个时间只能一个进程使用,且不能被删除。…

清华大学《操作系统》(二十二):文件系统

文件系统和文件: 文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能,组织、检索、读写访问数据。文件是具有符号名,由字节序列构成的数据项集合,是文件系统的基本数据单位,文件名是文件…

卡巴绿杀6 By Moshow魔手

卡巴绿杀6 By Moshow魔手 Kaspersky Anti-Virus Move-edition 6 (-_-b汗Move Edition...)【这是卡巴斯基绿色移动版本推荐用于u盘】By Moshow魔手 [url]Http://Hi.baidu.com/MoshowGame[/url]祝o(∩_∩)o...天下无毒)拥有全球最全的病毒库)拥有最快的全球剿毒反应速度) 基于稳定…