前言
本文梳理内存管理相关概念:
-
内存空间的扩充
覆盖技术
交换技术
虚拟存储技术(下篇介绍) -
内存空间的分配与回收
-
连续分配方式
- 单一连续分配
- 固定分区分配
- 动态分区分配
-
非连续分配方式(下篇介绍)
- 基本分页存储管理
- 基本分段存储管理
- 段页式存储管理
-
内存管理的概念
地址转换
操作系统需要提供地址转换功能,负责程序的逻辑地址与物理地址的转换。
操作系统在可执行文件装入内存时进行地址转换,参考三种转入方式。
存储保护
操作系统需要内存保护功能,保证各个进程在各自地址空间内运行,互补干扰
- 方式一:在CPU中设置一对上下限寄存器,存放进程的上下限地址;进程的指令要访问某个地址时,CPU检查是否越界;
- 方式二:采用重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始地址,界地址寄存器中存放的是进程的最大逻辑地址;
内存空间的扩充
- 操作系统使用如下三种技术技术从逻辑上对对内存空间进行扩充
覆盖技术
交换技术
虚拟存储技术
覆盖技术
引入覆盖技术,用来解决程序大小超过物理内存总和的问题。
该技术只用于早期的操作系统,现在已成为历史。
-
覆盖技术的思想:
将程序分为多个段,常用的段常驻内存,不常用的段在需要时调入内存; -
内存中分为一个固定区和若干个覆盖区:
需要常驻内存的段放在固定区中,调入后就不再调出(除非运行结束);
不常用的段放在覆盖区,需要用到时调入内存,用不到时调出内存; -
缺点:
必须由程序员声明覆盖结构,操作系统完成自动覆盖;对用户不透明,增加了用户编程负担。
交换技术
-
交换技术的思想:
内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)。 -
CPU调度中级调度就是交换技术实现的。
-
应该在磁盘的什么位置保存被换出的进程?
通常把磁盘分为文件区和对换区两部分。
文件区主要用于存放文件,主要追求存储空间的利用率,因此对文件区空间的管理采用离散分配方式;
对换区空间只占磁盘空间的小部分,被换出的进程数据就存放在对换区,由于对换的速度直接影响到系统的整体速度,因此对换区空间的管理主要追求换入换出速度,因此对换区空间的管理采用连续分配方式,
对换区的IO速度比文件区更快; -
应该什么时候进行交换?
交换通常在许多进程运行且内存吃紧时进行,而系统负荷降低就暂停。
例如:在发现许多进程运行时经常发生缺页,就说明内存紧张,此时可以换出一些进程,如果缺页率明显下降,就可以暂停换出。 -
应该换出那些进程?
可以优先换出阻塞进程、可优先换出优先级低的进程;
为了防止优先级低的进程在被调入内存后很快又被换出,有的系统还会考虑进程在内存的驻留时间…
虚拟存储技术
之后单独写文章梳理。
内存空间的分配与回收
内存空间的分配分为两种方式:连续分配方式和非连续分配方式
-
内部碎片:
是指分配给某进程的内存区域中,如果有些部分没有用上,就是内存碎片; -
外部碎片:
是指内存中的某些空闲分区由于太小而难以利用;
连续分配方式
连续分配:是为用户进程分配的内存必须是一个连续的内存空间;
单一连续分配
在单一连续分配方式中,内存被分为系统区和用户区。
系统区通常位于内存的地地址部分,用于存放操作系统相关数据;用户区用于存放用户进程相关数据。
内存中只能有一道用户程序,用户程序独占整个用户区空间。
-
优点:
实现简单,无外部碎片;
可以采用覆盖技术扩充内存;
不一定需要采取内存保护。 -
缺点:
只能用于单用户、单任务的操作系统;
有内部碎片;
存储器利用率极低; -
如图所示:
固定分区分配
为了能在内存中装入多道程序,且这些程序直接不会相互干扰,于是将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业,这样就形成了最早的、最简单的一种可运行多道程序的内存管理方式。
-
固定分区分配方式又有两种分配方式:
分区大小相等、分区大小不等;-
分区大小相等:
缺乏灵活性,但适合用于一台计算机控制控制多个相同对象的场合; -
分区大小不等:
增加了灵活性,可以满足不同大小的进程需求。
根据常在系统中运行的作业大小情况进行划分。
-
-
分区说明表
操作系统需要建立一个分区说明表这样的一个数据结构,来实现各个分区的分配与回收。
每个表项对应一个分区,通常按分区大小排列,每个表项包括对应分区的大小、起始地址、是否已分配。
当用户程序要要装入内存时,由操作系统内核程序根据用户程序大小检测该表,从中找到一个能满足大小的、未分配的分区,将之分配给该程序,然后修改分区说明表。
-
优点:
实现简单、无外部碎片; -
缺点:
当用户程序太大时,可能所有分区都不能满足需求,此时不得不采用覆盖技术来解决,会降低系统性能;
会产生内存碎片,内存利用率低。
动态分区分配
这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态的建立分区,并使分区的大小正好适合进程的需要。因此系统分区的大小和数目是可变的;
又称为可变分区分配。
-
用空闲分区表或者空闲分区链来记录内存的使用情况。
-
内存回收时,如果有相邻的内存分区,则会合并为一个,并修改内存分区表;
-
动态内存分没有内部碎片,但是有外部碎片;
-
紧凑技术
如果内存中的空闲空间总和本来可以满足某进程的要求,但是由于进程需要的是一整块连线的内存空间,此时可以通过紧凑技术来解决这种外部碎片的问题。
将各个已经分配的内存分区紧凑在一块,剩出一大块完整的地址,以满足新进程的内存。 -
动态分区分配算法
当把一个新的进程装入内存时,按照动态分区分配算法,从空闲分区表中选出一个分区分配给该作业。
非连续分配方式
-
连续分配方式的缺点:
固定分区分配:缺乏灵活性,会产生大量内存碎片,内存的利用率极低。
动态分区分配:会产生很多外部碎片,虽然可以用紧凑技术来处理,但是紧凑的时间代价很高。 -
非连续分配
如果可以将一个进程分散的装入到许多不相邻的分区中,便可以充分的利用内存,而无需再进行紧凑。于是变产生了非连续分配方式。
连续分配:为用户进程分配的是一个连续的内存空间;
非连续分配:为用户进程分配的是一些分散的内存空间; -
下面会单独写文章整理这块,比较重要。