操作系统内存管理概述

内存管理要达到以下目的:

  • 地址保护,一个程序不能访问另一个程序地址空间
  • 地址独立:程序发出的地址【虚拟空间(程序空间)的虚拟地址(程序地址)】应与物理主存地址无关。

虚拟内存可以解决在不太增加成本的情况下扩大内存容量的目的。虚拟内存的中心思想是 将物理内存扩大到便宜、大容量的磁盘上,即将磁盘空间看作是主存空间的一部分。用户程序即可以完全存放在主存,也可以完全存放在磁盘,当然也可以部分存放在主存、部分存放在磁盘。而程序执行时,程序发出的地址到底是在主存还是在磁盘则由操作系统的 内存管理模块 负责判断,并到相应的地方进行读写操作。即虚拟内存需要提供的就是空间像磁盘那样大、速度像缓存那样高的主存储系统。而对程序地址所在位置的判断产生内存管理系统的一个中心功能。

多道编程的内存管理

在多道编程的情况下,就无法将程序总是加载到固定的地址上,必须在程序加载完毕后才能计算物理地址,也就是在程序运行时进行地址翻译,即动态地址翻译

  1. 地址翻译方式

一个程序是加载到内存里事先划分好的某片区域,而且该程序是整个加载进去。物理地址 = 虚拟地址 + 程序所在的区域的起始地址【程序所在区域的起始地址为(程序)基址】。

地址保护只需要满足:程序所在区域的起始地址 ≤ 有效地址 ≤ 程序所在区域的起始地址 + 程序长度。 设置两个端值:基址和极限,即可以起到地址翻译和地址保护的的目的。这两个端值可以由两个寄存器来存放,分别为 基址寄存器和极限寄存器。

动态地址翻译的优点:第一个是灵活,程序可以随便加载到任何地方;第二个是它是实施地址保护的“不二法门”,对每个访问地址进行检查;第三个是它使得虚拟内存的概念得以实现。

         2. 多道编程下的内存管理策略有两种:固定分区和非固定分区。

非固定分区:除了划分给操作系统的空间外,其余的内存空间是作为一个整体存在的,但一个程序需占用内存空间时,就在该片空间里面分出一个大小刚刚满足程序所需的空间;再来一个程序,再这样分出一块来。在一开始给程序分配空间时就分足够大的空间,留有一片闲置空间供程序增长用。一个程序的空间增长通常有两个来源:数据和栈。如何处理这两种空间增长的关系会对整个程序的扩展性产生影响,最简单的办法是让数据和栈往相反的方向增长。Windows内存管理为栈限制了边界,超出该边界将造成程序错误并导致程序终止。

有一个问题:操作系统如何知道应该分配多少空间给一个程序呢?还有一个方法是,给该程序换一个空间;就是当一个程序所占空间不够时,我们将其倒出来到磁盘上,再加载到一片更大的内存空间去。这种将程序倒到磁盘上,再加载进内存的管理方法就成为交换(swap)。

综述,几种基本的内存管理方法分别是,固定加载地址的内存管理(单道编程)、固定分区的内存管理、非固定分区的内存管理和交换内存管理(后三种多道编程)。其中,交换内存管理最灵活,但是存在很大问题,空间浪费,造成“外部碎片”;地址空间增长困难,程序大小受限。

为了解决交换系统存在的缺陷,出现了分页系统。分页系统的核心就是将虚拟内存空间和物理内存空间皆划分为大小相同的页面,并以页面作为内存空间的最小分配单位。


摘录整理自《计算机的心智,操作系统之哲学原理》第11章 基本内存管理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值