操作系统知识点——内存管理(一)

xiaoxiao2021-02-28  27

一、内存管理的功能

1、内存的分配和回收。

2、地址变换。将逻辑地址转为物力地址。

3、扩充内存。借助虚拟存储技术或其他自动覆盖技术,为用户提供比内存空间大的地址空间,从而实现漏记上扩充内存容量的目的。

4、存储保护。

二、应用程序的编译、链接与装入

应用程序从源程序到执行程序的进程,经历了编译、链接、装入3个步骤。首先经过编译将源代码编译为若干目标模块;其次通过链接程序将编译好的目标模块以及所需的函数链接在一起,形成完整的装入模块;最后通过装入程序将这些装入模块装入内存并执行。

 

(一)程序链接的3种方式

1、静态链接。在程序运行前,先把各个目标模块及所需库链接为一个完整的可执行程序,以后不再拆开。

2、装入时动态链接。将应用程序编译后得到的一组目标模块装入内存时采用边装入边链接的动态链接方式。

3、运行时动态链接。直到程序运行过程中需要一些模块时,才对这些模块进行链接。即,在执行过程中,当发现一个被调用模块尚未装入内存时,立即去找到该模块并将之装入内存,然后把它链接到调用者模块上。凡在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上。

(二)程序装入的3种方式

1、绝对装入。在编译时就知道程序要驻留在内存的物理地址,编译程序产生含有物理地址的目标代码。不适合多道程序设计。

2、可重定位装入。根据内存当前情况,将装入模块装入到内存的适当位置,地址变换通常在装入时一次完成,之后不再修改,这种方式也成为静态重定位。当操作系统为程序分配了一个以某地址为起始地址的连续内存区域后,重定位时将程序中指令或操作数的逻辑地址加上这个起始地址就得到了物理地址。

3、动态运行装入。允许程序运行时在内存中移动位置。把装入模块装入到内存后的所有地址都是逻辑地址(相对地址),在程序执行过程中每当访问到相应指令或数据时,才要将访问的程序或数据的逻辑地址(相对地址)转换为物理地址,这种方式也成为动态重定位。动态重定位的实现依靠重定位寄存器。当某个作业开始执行时,操作系统负责把该作业在内存中的起始地址送入重定位寄存器中,之后在作业的整个执行过程中,每当访问内存时,系统就会自动将重定位寄存器的内容加到逻辑地址中去,从而得到与该逻辑地址对应的物理地址。

(三)逻辑地址与物理地址

逻辑地址是指由程序产生的与段(与页无关,因为只有段对用户可见)相关的偏移地址部分。源代码在经过编译后,目标程序中所用的地址就是逻辑地址,而逻辑地址的范围就是逻辑地址空间。在编译程序对源代码进行编译时,总是从0号单元开始编址,地址空间中的地址都是相对于0开始的,因此逻辑地址也称为相对地址。在系统中运行的多个进程可能会有相同的逻辑地址,但这些逻辑地址映射到物理地址上时就变为了不同的地址。

物理地址是指在CPU外部地址总线上寻址物理内存的地址信号,是逻辑地址变换后的最终结果地址,物理地址空间是指内存中物理地址单元的集合。进程在运行过程中需要访问存取指令或数据时,都是根据物理地址从内存中获取的。物理地址对一般用户来说是透明的,用户只需要关心程序的逻辑地址就可以。从逻辑地址到物理地址的转换过程由硬件自动完成,这个转换的过程成为重定位。

三、内存的覆盖与交换

内存的覆盖和交换技术主要的目的是为了扩充内存的容量。覆盖技术主要用在早期操作系统中,而交换技术则主要适用于现代操作系统。

(一)覆盖

把一个大的程序划分为一系列覆盖,每个覆盖是一个相对独立的程序单位。把程序执行时并不要求同时装入 内存的覆盖组成一组,称为覆盖段;将这个覆盖段分配到同一个内存的存储区域,这个存储区域成为覆盖区,它与覆盖段一一对应。显然,为了使一个覆盖区能被相应覆盖段中的每个覆盖在不同时刻共享,其覆盖区的大小应该为覆盖段中最大覆盖段来确定。

覆盖技术对程序员要求较高,程序员必须把一个程序划分为不同的程序段,并规定好执行和覆盖顺序,操作系统根据程序员提供的覆盖结构来完成程序段之间的覆盖。

覆盖技术的特点是打破了必须将一个进程的全部信息装入内存后才能运行的限制。但当同时执行程序的代码量超过内存时,程序仍然不能运行。

(二)交换

交换技术就是把暂时不用的某个程序及数据部分(或全部)从内存移到外存中,以便腾出必要的内存空间;或把指定的程序或数据从外存读到相应的内存中,并将控制权转让给它,让其在系统上运行的一种内存扩充技术。处理器三级调度中的中级调度就是采用了交换技术。

交换技术的特点是打破了一个程序一旦进入内存便一直运行到结束的限制。但运行时进程大小仍然受实际内存的限制。有关交换技术需要注意以下几点:

1、交换需要备份存储,通常是使用快速磁盘。它必须足够大,并且提供对这些内存映像的直接访问。

2、为了有效使用CPU,需要每个进程的执行时间比交换时间长,而影响交换时间的因素主要是转移时间。

3、如果换出进程,必须确保该进程完全空闲。

4、交换空间通常作为磁盘的一整块,且独立于文件系统。

5、交换通常在有许多进程运行且内存空间紧张时开始启动,而在系统负荷减轻时暂停。

6、普通的交换使用不多,但交换技术的某些变种在许多系统中仍然发挥作用。

(三)覆盖与交换的比较

与覆盖技术相比,交换技术不要求程序员给出程序段之间的覆盖结构,且交换主要是在进程或作业之间进行,而覆盖则主要是在同一个作业或进程中进行。另外,覆盖只能覆盖与覆盖程序段无关的程序段。交换进程由换出和换入两个过程组成。由于覆盖技术要求给出程序段之间的覆盖结构,使得它对用户不透明,因此有内存无法存放用户程序的矛盾,现代操作系统是通过虚拟内存技术解决这一矛盾的。覆盖技术已经成为历史,而交换技术在现代操作系统中仍有较强生命力。

四、内存的连续分配管理方式

(一)单一连续分配

将内存分为两个连续存储区域,其中一个存储区域固定地分配给操作系统使用,通常放在内存地址部分,另一个存储区域给用户作业使用。采用静态分配,适合单用户、单道程序,可采用覆盖技术。作业一旦进入内存,就要等到其结束后才能释放内存。因此这种分配方式不支持虚拟存储器的实现,无法实现多道程序共享内存。

单一连续分配的优点是管理简单,便于用户了解和使用,不存在其他用户干扰。缺点是只能用户单用户、单任务操作系统,内存中只装入一个作业运行,从而导致各类资源的利用率都很低,而且会产生内部碎片。

(二)固定分区分配

固定分配(也称为固定分区存储管理)是最早使用的一种可运行多道程序的存储管理方法,它将内存空间划分为若干个固定大小的分区,每个分区中可以装入一道程序。分区的大小可以不等,但事先必须确定,在运行时不能改变。当有空闲分区时,便从后备队列中选择一个适当大小的作业装入运行。固定分区分配中,程序通常采用静态重定位方式装入内存。为了实现固定分区分配,系统需要简历一张分区说明表,以记录可用于分配的分区号、分区大小、分区的起始地址及状态,通常按照分区大小顺序排序。

固定分区分配的优点是可用于多道程序系统最简单的存储分配,其缺点是不能实现多进程共享一个主分区,利用率较低,会产生内部碎片。

(三)动态分区分配

动态分区分配又称为可变式分区分配,是一种动态划分存储器的分区方法。这种方法事先不将内存划分为一块块分区,而是在作业进入内存是,根据作业的大小动态建立分区,并是分区的大小正好满足作业的需求。因此系统中的分区大小是可变的,分区数目也是可变的。

1、动态分区分配中的数据结构

(1)空闲分区表。用来登记系统中的空闲分区,每个空闲分区对应一个表项,每个表项包含分区号、起始地址、大小及状态。

(2)空闲分区链。用链头指针将内存中空闲分区链接起来,构成空闲分区链。每个空闲分区的其实若干个字节存放控制信息,其中存放空闲分区的大小和指向下一个空闲分区的指针。

2、动态分区分配算法

(1)首次适应算法(First FitFF

把空闲分区按照地址递增的次序用链表串成一个队列,每次需要为一个进程分配内存时都从队首开始找,顺着链表知道找到足够大的空间分区,然后按照作业大小从该分区划分出一块内存分配给请求者,余下的空闲分区仍然留在空闲分区表(或者空闲分区链)中。若从头到尾都不存在符合条件的分区,则分配失败。

优点:优先利用内存低地址本分的空闲分区,从而保留了高地址部分的大的空闲分区,无内部碎片。

缺点:由于低地址部分不断被划分,致使低地址端留下许多难以利用的很小的空闲分区(外部碎片),而每次查找又都是从低地址开始,这无疑增加了查找可用空闲分区的开销。

(2)下次适应算法(Next FitNF

又称为循环首次适应算法,即在首次适应算法的基础上把队列改成循环队列(依然是将空闲分区按照地址递增的次序排列),而且也不是每次从队首开始找空闲分区,而是从上次找到的空闲分区的下一个分区开始找。

优点:使得空闲分区的分布更加均匀,减少了查找空闲分区的开销。

缺点:导致缺乏大的空闲分区。

(3)最佳适应算法(Best FitBF

要求将空闲分区按照容量大小递增的次序排列。每次为作业分配内存空间时,总是将能够满足空间大小需要的最小的空闲分区分配给作业。这样可以产生最小的内存空闲分区。

优点:总能分配给作业最恰当的分区,并保留打分区。

缺点:导致产生很多难以利用的碎片空间。

(4)最差适应算法(Worst FitWF

要求空闲分区按照容量从大到小排列。每次为作业分配内存空间时,总是将满足要求且最大的内存控件分配给作业。

优点:这样使分给作业后剩下的空闲分区比较大,足以装入其他作业。

缺点:由于最大空间分区总是首先分配划分,当有大作业到来时,其存储空间的申请将会得不到满足。

3、动态分区回收

当作业执行结束后,系统应回收已经使用完毕的内存分区。系统根据回收分区的大小及首地址,在空闲分区表(或空闲分区链)中检查是否有相邻的空闲分区,如果有相邻空闲分区,则合并成一个大的空闲分区,并且修改相关的分区状态信息。如果没有相邻的空闲分区,则单独建立表项,填写分区大小及地址等信息,加入空闲分区表(或空闲分区链)的适当位置。

4、分区分配的动态管理

作业必须装入到一片连续内存空间中。如果系统中有若干小的分区,其总容量大于要装入的作业,但由于它们不相邻接,致使作业无法装入内存。这就需要对分区进行动态管理。主要有拼接和动态重定位分区分配两种分区重定位技术。

将存储器中所有已分配分区移动到内存的一端,使本来分散的多个小空闲区连城一个大的空闲区。这种通过移动把多个分散的小分区拼接成一个大分区的方法成为拼接或紧凑,也可以成为紧缩。目前主要有两种拼接时机。第一种是在某个分区回收时立即进行拼接,这样在主存中总是只有一个连续的空闲区,但是拼接很费时间,拼接频率过高会使系统开销加大。第二种是当找不到足够大的空闲分区且总容量可以满足作业要求时进行拼接。这样拼接的频率比上一种方案要低得多,但空闲分区的管理稍微复杂一些。

动态重定位分区分配算法与动态分区分配算法基本相同,二者的差别仅在于:在这种分配算法中增加了拼接功能,通常是在找不到足够大的空闲分区来满足作业要求,而系统中空闲分区总容量和大于作业要求时进行拼接。

5、动态分区分配的优缺点

优点:①实现了多道程序共用内存(共用指多进程同时存在于内存中的不同位置);②管理方案相对简单、不需要更过开销;③实现存储保护的手段比较简单。

缺点:①内存利用不够充分,存在外部碎片;②无法实现多进程共享存储器信息(共享是指多进程都使用同一个内存段);③无法实现内存的扩充,进程地址空间受实际存储空间的限制。

6、内部碎片与外部碎片

内部碎片是指分配给作业的存储空间中未被利用的部分,外部碎片是指系统中无法利用的小存储块。区分两种碎片的方法是看分配过程中分区大小是否固定。固定分区中的碎片即为内部碎片,非固定分区中的碎片则为外部碎片,若固定分区和不固定分区同时存在(如段页式),则看作是固定分区。

转载请注明原文地址: https://www.6miu.com/read-2400259.html

最新回复(0)