操作系统 -- 虚拟内存

简介: 操作系统 -- 虚拟内存

虚拟内存


起因


程序规模的增加远大于存储容量的增长速度。


理想中的存储器:更大、更快、更便宜的非易失性存储器。


在计算机系统中,尤其是在多道程序运行环境下,可能会出现内存不够的情况,怎么办?


  • 如果是程序太大,超过了内存的容量,可以采用手动的覆盖技术,只需要把指令和数据保存在内存当中
  • 如果是程序太多超过了内存的容量,可以采用自动的交换技术,把暂时不能执行的程序送到外存中
  • 如果想要在有限容量的内存中,以更小的页的粒度为单位装入更多更大的程序,可以采用自动的虚拟存储技术


覆盖技术


  • 目标:是在比较小的可用内存中运行比较大的程序。常用于多道程序系统,与分区的存储管理配合使用


  • 原理:把程序按照其自身的逻辑结构,划分为若干个功能上相对独立的程序模块,把那些不会同时执行的模块共享同一块内存区域,按时间先后来运行


必要部分的代码和数据常驻内存

可选部分在其他程序模块中实现,平时存放在外存中,在需要的时候才装入内存;

不存在调用关系的模块,不必要同时装入到内存中,从而就可以相互覆盖,即这些模块公用一个分区


  • 缺点:

由程序员来把一个大的程序划分为若干个小的功能模块,并确定各个模块之间的覆盖关系,费时费力,增加了编程的复杂度

覆盖模块从外存装入内存实际上是以延长时间来获取空间节省


交换技术


  • 目标:多道程序在内存中时,让正在运行的程序获取更多的内存资源
  • 方法:可以将暂时不能运行的程序送到外村,从而获取空闲内存空间。操作系统把一个进程的整个地址空间内容保存到外存中,而将外存中的某个进程的地址空间读入到内存中,换入唤出内容的大小为整个程序的地址空间
  • 交换技术实现的几个问题


交换时机的确定:何时需要发生交换?只当内存空间不够或有不够的危险时换出

交换区的大小:必须足够大以存放所有的用户进程的所有内存映像的拷贝;必须能对这些内存映像进行直接存取

程序换入时候的重定位:换出后再换入的内存位置不一定在原来的位置上,最高采用动态地址映射的方法


  • 覆盖和交换的比较

覆盖只发生在那些互相之间没有调用关系的程序模块之间,因此程序员必须给出程序内的各个模块之间的逻辑覆盖结构。

交换技术是以在内存中的程序大小为单位来进行的,它不需要程序员给出各个模块之间的逻辑覆盖结构。换言之,交换发生在内存中程序与管理程序或操作系统之间,而覆盖则发生在运行程序的内部。


虚拟技术


  • 目标:


像覆盖技术一样,不是把程序的所有内容都放在内存中,因此能够运行比当前的空闲内存空间还要大的程序。但做的更好,由操作系统自动完成,无需程序员干涉。

像交换技术那样,能够实现进程在内存和外存之间的交换,因而获得更多的空闲内存空间,但是做的更好,只对进程部分内容在内存和外存之间进行交换。


  • 程序局部性原理:指的是程序在执行过程中的一个较短的时间内。所执行的指令地址和指令操作数地址,分别局限于一定区域


时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短的时期内

空间局部性:当前指令和邻近的几条指令,当前访问的数据和邻近的几个数据都几种在一个较小的区域内

程序局部性原理表明,从理论上来说,虚拟存储技术是能够实现的,而且在实现了以后应该是能够取得一个满意的效果的


  • 基本概念:可以在页式或者段式内存管理基础上实现


在装入程序时候,不必将其全部装入到内存中,只需要将当前需要执行的部分页面或者段装入到内存,就可以将程序开始执行

在程序执行过程中,如果需要执行的指令或者访问的数据尚未在内存,则由处理器通知操作系统将相应的页面或者段调入到内存,然后继续执行程序

另一方面,操作系统将内存中暂时不使用的页面或者段调出保存在外存上,从而腾出更多空闲空间存放将要装入的程序以及将要调入的页面或段


  • 基本特征:


大的用户空间:通过把物理内存和外存相结合,提供给用户的虚拟内存空间通常大于实际的物理内存,即实现了这两者的分离。如32位的虚拟地址理论上可以访问4GB,但是实际上内存是256M,但是硬盘大于4GB

部分交换:与交换技术相比较,虚拟存储的调入或者是调出是对部分虚拟地址空间进行的

不连续性:物理内存分配不连续,虚拟地址空间使用的不连续


  • 虚拟页式内存管理:


页式内存管理:页表完成逻辑页到物理页帧的映射

大部分的虚拟存储系统都是采用虚拟页式存储管理技术,即在也是存储管理的基础上增加请求调页和页面置换的功能

当一个用户需要调入内存运行时候,不是将该程序的所有页面都装入内存,而是只装入部分的页面,就可启动程序运行

在运行过程中,如果发现要运行的程序或要访问数据不在内存,则向系统发出缺页中断请求,系统再处理这个中断时,将外存中相应的页面调入内存,使得该程序能够继续运行


  • 后备存储


概念:


一个虚拟地址空间的页面可以被映射到一个文件中的某个位置

代码段:映射到可执行二进制文件

动态加载的共享程序段:映射到动态调用库文件

其他段:可能被映射到交换文件


在何处保存未被映射的页?


能够简单的识别在二级存储中的页

交换空间:特殊格式,用于存储未被映射的页面


目录
相关文章
|
2月前
|
存储 Linux 调度
深入理解操作系统:从进程管理到内存分配
【8月更文挑战第44天】本文将带你深入操作系统的核心,探索其背后的原理和机制。我们将从进程管理开始,理解如何创建、调度和管理进程。然后,我们将探讨内存分配,了解操作系统如何管理计算机的内存资源。最后,我们将通过一些代码示例,展示这些概念是如何在实际操作系统中实现的。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
|
3月前
|
安全 索引
操作系统中的内存管理策略
【8月更文挑战第23天】
84 1
|
1月前
|
分布式计算 算法 大数据
探索操作系统的核心:调度与内存管理机制
【10月更文挑战第11天】 本文深入探讨了操作系统中两大核心功能——调度与内存管理机制。通过分析调度算法、进程状态转换及内存分配策略等关键方面,揭示了它们如何共同维护系统性能和稳定性。旨在为读者提供对操作系统内部运作的深刻理解,同时引起对优化策略的思考。
59 5
|
1月前
|
算法
深入理解操作系统:内存管理机制的探索之旅
【10月更文挑战第2天】在数字世界的浩瀚海洋中,操作系统犹如一艘精密的航船,承载着软件与硬件的和谐共舞。本文将揭开内存管理的神秘面纱,从基础概念到高级策略,引领读者领略操作系统内存分配的智慧。通过深入浅出的解释和生动的比喻,我们一同遨游在内存的江河之中,感受操作系统如何巧妙地协调资源,确保数据的有序流动。让我们跟随内存的脚步,探索那些隐藏在每次点击、每次命令背后的奥秘。
|
1月前
|
监控 开发者
深入理解操作系统:内存管理的艺术
【10月更文挑战第2天】在数字世界的幕后,操作系统扮演着至关重要的角色。本文将深入探索操作系统的心脏——内存管理,揭示它是如何协调和管理计算机的宝贵资源。通过浅显易懂的语言和生活化的比喻,我们将一起走进内存管理的奥秘世界,了解它的原理、机制以及为何对整个系统的性能和稳定性有着不可替代的影响。无论你是技术新手还是资深开发者,这篇文章都将为你打开新的视角,让你对日常使用的设备有更深层次的认识和尊重。
|
1月前
|
缓存 算法 调度
深入浅出操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅。我们将从进程管理的基本概念出发,逐步深入到内存管理的复杂世界,最终探索如何通过实践技巧来优化系统性能。文章将结合理论与实践,通过代码示例,帮助读者更好地理解操作系统的核心机制及其在日常技术工作中的重要性。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往操作系统深层次理解的大门。
|
1月前
|
存储 算法 C语言
MacOS环境-手写操作系统-17-内存管理算法实现
MacOS环境-手写操作系统-17-内存管理算法实现
36 0
|
1月前
|
Java C语言 iOS开发
MacOS环境-手写操作系统-16-内存管理 解析内存状态
MacOS环境-手写操作系统-16-内存管理 解析内存状态
35 0
|
1月前
|
存储 算法 C语言
MacOS环境-手写操作系统-15-内核管理 检测可用内存
MacOS环境-手写操作系统-15-内核管理 检测可用内存
35 0
|
2月前
|
Python
python对电脑的操作,获取几核,获取操作系统,获取内存
python对电脑的操作,获取几核,获取操作系统,获取内存