罗泽兵 发表于 2024-4-15 08:34:02

10.第10节课第四章存储器管理

好同学们,大家好,今天呢,我们来为大家介绍一下操作系统当中,我们操作系统功能的其中之一,那么就是我们的存储器管理这样一个部分。那么存储器呢?都是计算机系统的重要组成部分,那么近年来呢?随着计算机技术的发展,系统软件和应用软件呢?在种类功能上急剧的膨胀。虽然存储器容量呢,一直在不断扩大,但仍不能满足现代软件发展的需要。

因此,存储器仍然是一种宝贵而又稀缺的资源。如何对它进行有效的管理,不仅直接影响到存储器的利用率,而且对系统性能呢,也有很大重要影响。存储器管理的主要对象是内存,由于对外存的管理与对内存的管理相似,只是它们运运用不同。那么,据说外层呢?主要用来存放文件。那我们内存管理呢?嗯,就是我们的存储器管理呢?

我们的有一些这样的重点,比如说。嗯,内存管理的概念。逻辑地址与物理地址,空间地址变换,内存共享,内存保护。内存的分配与回收。以及呢,连续分配管理方式,比如说我们的夜市管理。万事管理。以及了。断叶式管理。

比如说包括我们的离散分配与连续分配,那么这样一些部分。那么,接下来我们来看一下存存储器的这样一个层次结构。在计算机执行的时候呢。几乎每一条指令呢,都涉及对存储器的访问。因此,要求对存储器的访问速度呢?能跟得上处理器的运行速度。或者说。存储器的速度呢,必须非常快,能与处理器的速度呢相匹配,否则呢,

会明显。影响处理器的运行。此外,还要求存储器呢,有非常大的容量,并且存储器呢,价格呢,还应该非常便宜。那么,对于这样三个条件呢,目前是无法同时满足的。那么,于是呢,在现代计算机系统当中呢,基本上都采用了多层结构的存储器系统。

多层。四结构的这样一个存储器系统呢?对于计算机,通用计算机而言,存储层次呢?至少应该有三级。最高级了,为CPU寄存器,中间为主存,最底是辅存在较高档的计算机中呢,还可以根据具体的功能呢区分为寄存器高速缓存,主存储器。磁盘缓存固定磁盘可移动存储介质等六层,那么我们看一下这个图当中。这是我们计算机系统存储结构示意,

其中呢,我们的辅存呢,也就是我们的外存有我们的固定磁盘和可移动存储介质。我们的主存呢,就是我们的内存,还有我们的高速缓存主存储器和磁盘缓存,另外呢,还有我们的CPU寄存器。那么,其中呢?寄存器高速缓存。主存储器和磁盘缓存均属于操作系统的存储管理的管辖范围,它们掉电之后呢,它们的存储信息不再存在,而低层的固定磁盘和可移动存储介质呢。

则属于设备管理的范畴,它们的存储信息呢,将被长期保存,那么这是计算机系统存储结构的这样一个部分。那么我们再看一下。可执行存储器。在计算机系统的存储层次中,存储器呢?寄存器和主存储器呢?又被称为可执行存储器。对于存放于其中的信息与存放于库存中的信息相比较而言,计算机所采用的访问机制是不同的,所耗费时间也是不同的。进程可以在很小的时间周期内呢,使用一条load和s指令,

对这个执行存储器呢进行访问,但对储存的访问呢,则是通过IO设备实现。因此,在访问中涉及到的中断设备驱动程序以及物理设备的运行呢,所耗费的时间远远高于访问可执行存储器的时间,一般呢,相差多个数量级。那么,甚至更多?对于。不同层次的存储介质呢?由操作系统呢?统一进行管理操作系统的存储管理呢?负责对可执行存储器的分配,

回收以及提供在存储层次之间数据移动的这样一个管理机制。比如说主存与磁盘缓存,高速缓存与主存存之间的数据,移动的。而设备和文件管理和根据用户的需求呢,提供对库存的管理机制。我们来看一下组存储器与寄存器组存储器呢?称为内存或主存,它是计算机中主要的部件,用来保存进程运行时的程序和数据。也简称为。可执行存储器通常呢,处理机都是从主存储器中取得指令和数据的,并将其所取得的指令呢,放入其指令寄存器。

而将其所读入的数据呢?装置到数据寄存器当中,或者相反的这样一个情况,将寄存器的数据呢?存入到主存储器。也就是说,我们的这样一个计算机当中的。程序要放在我们的主存当中,也就说我在我们的内存当中呢,才能够得到运行对待,大家注意在我们计算机当中,我们的程序要放入内存当中,才能够得到运行。早期的内存呢,是由磁性做成的,

一般容量呢为几10 KB或者几百KB,那么随着vlsi的发展呢,现在的内存呢,由vil si构成。其容量呢,也在几10M到几10g之间,而且还在不断增加。由于主存储器访问速度呢,远低于CPU执行指令的速度,为了缓和这一矛盾呢,在计算机系统中呢,引入了寄存器和高速缓存。寄存器呢?与处理器有相同的处理速度。所以呢,

对寄存器的访问速度最快。完全能与CPU协调工作,但价格呢,非常昂贵,因此呢,容量不可能做得很大。在早期计算机中,计算机的数目呢,仅为几个。主要用于存放处理及运行时的速度,以加快存储器的访问速度,如使用寄存器存放操作数或者地址,寄存器加快地址转换速度。随着vlsi的发展呢,计算机的成本呢,

也大大降低啊,目前呢,计算机的数目呢,增加到了几十个或者几百个。接下来我们看一下高速缓存和磁盘缓存。高速缓存呢是现代计算机业务中一个重要的部件,它是介于寄存器和存储器之间的存储器。用于设备。备份储存中较常用的数据,以减少处理器的对储存器的访问次数,那么这样呢,可大幅度的提高程序的执行速度。高速缓存的容量呢?远大于寄存器,而比内存呢?

约小两到三个数量级左右,而访问速度呢?快于主存储器。在计算机系统中,为了缓和内存与处理机处理之间的矛盾,很多地方呢,都设置了高速缓存。我们将一些数常用数据呢,放在高速缓存中。是否有效?那么,这样涉及到的程序的局部性问题,程序在执行时呢?将。呈现出局部性规律。

也就是说,在较短的一段时间内呢,程序的执行呢,仅局限于某个部分。通常呢,就是我们之后要讲的时间局限性和我们的空间局限性这样一个部分。通常程序的进程的程序呢?和数据放在主分体系中,每当要访问的时候呢?才被临时复制到一个速度较快的高速缓存中。这样的。当CPU访问一组特定信息的时候呢,需要检首先检查它是否在高速缓存中,如果已存在就可直接从中取出使用并行访问组成。否则呢,

就是从组成中读出信息。由于高速缓存的速度和价越快。越高价格越贵,那么所以在很多计算机中呢,设置了两级或多级高速缓存,仅靠内存的一级高速缓存的速度最高,其容量最小。二级高速缓存的容量稍大,那么。速度呢,稍低。那么,磁盘缓存是什么呢?由于目前磁盘IO的速度呢,远小于对主存的访问速度。

为了缓和两者之间在速度上的不匹配而设置了磁盘缓存。主要用于暂时存放频繁使用的一部分磁盘数据的信息,以减少访问磁盘的速度次数,但磁盘缓存呢,与高速缓存不同,它本身并不是一种实际存在的存储器。而是利用储存储存的部分存储空间暂时存放,从磁盘中读出或者写入的数据储存,也可以看作储存的高速缓存。因此呢,主存中的数据呢,必须复制到主存中使用把另外呢。主数据呢,也必须存放在主存才能够输出到主存,那么这是我们的磁盘缓存。

一个文件的数据呢,可能需要在不同的层次的存储器中,比如说一个文件的数据呢,通常被存储在储存当中,当你需要运行或被访问的时候呢。则必须呢,调入主存也可以暂时存放在主存的高速磁盘缓存中,大容量的储存常常使用磁盘,磁盘数据呢,经常备份到磁带或可移动磁盘上,以防止磁盘故障的丢失数据。啊,这是我们的。磁盘缓存的这样一个实现的运用实施的这样一个部分。接下来我们看一下程序的装入和链接。

用户程序呢,要在系统中运行,必须先将它装入内存,然后呢,才转卖成成一个可执行的不程序。那通常呢,就要经过几个步骤,第一个是编译,第二个是联系,第三个是装入编译呢,是有程序编译,程序对用户源进行进行编译。形成若干个目标模块。链接呢?是由链接程序将编译后形成的一种目标模块呢?

以及它们所需要的库函数连接在一起。形成一个完整的装入模块,装入了这则是由装入程序了,将装入模块装入到内存。那么我们看一下这个图当中的部分,首先呢,是进行编译,编译的时候呢,产生若干个目标模块。第二步呢,是进行链接,由链接呢,将编译后形成的一组目标模块呢,链接在一起,形成一个完整的装入模块。

第三步呢,是装入由装入程序呢,将模块装入到内存中,这是我们这样一个三个步骤的。对用户程序处理步骤的这三个,这三个过程。那这三个三步过程,三个过程,三步三三个,这样一个步骤,接下来我们看一下程序的装入程序的装入呢?有多种方式,比如说绝对装入方式,以及了可重定位装入方式,以及了运行时动态动态运行时的装入方式。

那么,为了采用上的方便呢,我们介绍一个无需链接的单个目标的装入过程,该目标呢,也就是装入模块当当一个装入模块,装入内存时呢,有三种,刚才我们讲过的这样一个装入方式。首先我们来看一下绝对装入方式,当计算机系统很小,且能且只能运行单道程序时,完全有可能知道程序呢,将驻留在内存的什么位置?此时可以采用绝对装入方式,用户程序经编译后呢,

将产生绝对地址就是物理地址的这样一个代码。也就是说,这样一个什么意思呢?比如说事先已经知道用户进程蛀虫。驻留在从某处开始的位置,则编译程序所产生的目标模块呢,就可从这样一个部位置开始向上扩展。绝对装入程序呢,便可按照装入模块中的地址,将程序和数据呢装入内存,装入模块,被装入内存后呢,由于程序中的相对地址与实际地址呢完全相同。则不需程序和数据了,对地址进行修改。

程序中所用的绝对地址呢,既可在编译或汇编时给出,也可由程序员直接赋予。但程序员直接给出绝对地址时,不仅要求程序员熟悉内存的使用情况。而一旦程序或数据呢,被修改时呢,还可能改变内存的所有地址,通常呢,是在程序中呢,宁可采用符号地址,然后再编译或汇编时呢,再用这些符号呢,转换成为绝对地址,那么这是我们绝对专用的这样一个情况。

比如说我们绝对专注了,就是将我们的。装入模块了,将我们的装入模块了。用户编译后呢,就将它产生一个绝对地址。那么就是物理地址了,那么就是我们的绝对地址的目标代码,那么我们直接将我们编译好,编译后面编译之后的这样一个程,编译后面的程序呢?将它的地址地址呢,把它变成像一个绝对它的,它的地址呢,变成一个绝对地址,

就是我们的物理地址,那么装入程序了,绝对装入程序了,那么这便可按装入模块中的地址了。将程序和数据装入模块,那么这个时候呢?程序中的相对地址呢?和实际内存地址呢?完全相同,那么这是我们的绝对专用方式,比如说我们编译之后呢?我们的程序,我们的装入的时候呢?直接将我们的程序装入到。我们的它的这样一个地址的这样一个。

表示的这样表示的这样一个部分当中就是我们的绝对装入的这样一个部分,将它的地址呢装入到与这样一个实际地址完全相同的这样一个部分,这是我们绝对招入方式。另外呢,我们还有可重定位装置方式,那么绝对装入方式呢,只能将目标模块装入到内存中,事先指定的位置,这只适用于单道程序环境。而在多大程序环境下呢?编译程序呢?不可能预知。经编译后所得的目标模块呢?应该放在内存的何处?因此呢,

对于用户编译程序了所形成的若干个物料模块,它的起始地址呢,通常都是从零开始算的。存取址中的其他地址呢?就相对于起始地址算的。此时呢,不可能再用绝对装入方式,而应该采用可重定位装入方式,它可以根据内存的具体情况将装入模块,装入到内存的这样一个适当位置。好吧,我们看一下。比如说,在采用可重定位装入程序,将装入模块,

装入内存后呢?绘制装入模块,所有的逻辑地址呢?与实际装入的内存地址不同,比如说我们看一下这样一个。活动的情况,比如说在用户程序,1000号单元处有一条指定node 1,而二五零零该功能实现二五零零中的整数三六五了。取自寄存器,一但若该用户程序装入到内存的一万到15200单元的,不禁止地址变换。而在执行11001000号单元中的指令呢?它仍然将从二五零零号单元中把数据呢取之我们的。计算器一而导致数据错误,

那么正确的方法呢?应该是取指令将取指取数指令中的地址2500修改成一二五零零。比如说把地址中的逻辑地址二五零零呢,与本程序在内存中的起始地址一外相加,那么才得到正确的物理地址二五零零。一二五零零除了数据地址应该修改之外,那么。指令地址也必须要做同样的修改,比如说指令的逻辑地址,以前呢与?起始地址一万相加,得到绝对地址一万一一万一千。通常呢,把这装入式对目标模块中指令和数据的修改地址称为重定位,那么又因为呢,

这样一个地址变化呢,通常是在进程装入时一次完成的,以后不再改变,这为静态重定位。那么我看一下就说什么是重定位呢?就是在装入时对目标程序中指令和数据的修改过程。那么,称之为重定位,那么又因为呢?我们是在装入时一次将这样一个。地址呢,进行一个改变,那么就说地址变换呢,通常在装入时一次完成,所以呢,

以后呢,不再改变就称为动静态重定位,就是我们的可重定位装置方式中,我们这样一个静态重定位。那么我们再看一下运行时的动态,装入可重定位装入方式呢?可将装入模块装入到内存中允许的位置。所以是你可以用于多道程序环境,但在该方式中呢,不允许程序运行时在内存中移动位置。那么这个时候呢?因为程序呢,要在内存中移动,因为它的物理地址发生了变换,此时呢,

对程序和数据的地址呢,与我们的绝对地址进行修改后才能运行。然而,实际情况呢?在运行中,它在内存中的位置可能经常要改变,比如说在具有兑换功能的系统中,一个进程呢?可能会被多次换出,又被多次换入,每次换入后的位置通常是不同的。在这种情况下呢,就应该采用动态时运动态运行时装入的方式,动态运行时的装入程序呢,把在装入模块,

装入内存后呢。并不立即把装入模块中的逻辑地址转换为物理地址,而是把这种地址转换呢?推迟到程序真正运行时才执行,才进行。因此,装入内存后,所有的地址仍然是逻辑地址。为了使地址转换不影响指令的执行速度,这个方式呢,需要一个重定位寄存器的支持。那么,这是我们的运行时动态装入。也就是说,运行时动态装入了,

就是要等到。在程序运行时呢,才将装入模块中的逻辑地址呢。转换为物理地址,那么就是说动态运行时的装入呢?是在把装入模块,装入内存后。并不立即把装入模块中的逻辑地址呢,转换为物理地址,而是呢,要等到程序真正要执行时。才进行将它的逻辑地址呢转换成物理地址,这样一个步骤,这样一个方式。那么,

这是我们的运行时动态,帮助接下来我们看一下程序的链接,原程序经过编译后呢,可得到一组目标模块链接程序的功能呢?实际上,这组目标模块。以及它们所需要的固函数呢,链接成一个完整的专容模块,在对目标模块进行链接时呢,则根据链接时的不同,可以把这个链接呢分为三种。第一个呢,是我们的静态链接,第二个呢,是装入时动态链接,

第三个呢,是运行时动态链接,我们首先来看一下。静态连接方式在程序运行之前。先将各部分模块呢及它们所需的库函数链接成一个完整的装配模块,以后不再拆开。那比如说我们看一下这个图当中。那么,这个图当中呢?有经过编译后得到的三个目标模块,那么它们的长度呢?分别为这样一个长度。在模块语句中呢,有一条语句括b用于第二个模块b。在模块中有一条语句c用于调用模块c,

那么b和c都属于外部调用符号,那么再将这几个目标模块装入一个装入模块时,那么需解决两个问题一个呢?是对相对地址呢进行修改,一个呢是变换调用变换外部调用符号。那么,由编译程序所产生的所有目标模块中呢?所使用所使用的相对地址,其起始地址都为零,每个模块中的地址都相对起始地址计算的。再链接成一个装入模块后呢,原模块b和c在装入模块中呢,其实不再是零,而是l+l+m,所以呢,

任何只是修改模块b和c的相对地址呢,都要把原b中的所有地址呢,加上l而把原c中所有的相对值。加上l+m。变换外部调用符号,每个符号中所用的外部调用符号呢,也变为相对地址,比如说b的起始地址变换成lc的起始地址呢,变为加为l+m。那么,这种先进行链接而形成一个完整装入模块呢?成为可执行文件,通常不把它拆开,要运行时呢?可直接将它装入内存,

把这种事先进行链接而不再拆开的方式呢?称为静态连接方式。那么,这是我们的静态连接方式,也就是说,我们什么是静态连接方式呢?那么就是说。在程序运行之前,将各目标模块以及它们所需的固函数呢链接成一个完整的装配模块,以后呢,不再拆开。那么,我们把这种事先进行链接的方式呢?称为静态连接方式。这是我们图当中这样一个实现的运用的。

解决了这样一个。实施的。执行执行类型执行的这样一个例子,这样一个方式,那么我们再看一下装入式动态链接。这装入式动态链接了这里指向用户的原程序。编译后所得的一组目标模块,在装入内存时呢?采用边装入边链接的连接方式。即在装入一个目标时,若发生一个外部模块电容事件,将引起装入程序的去寻找。去找出相应的外部目标模块,并把它装入内存。那么,

既装入时呢?动态链接有这样一些优点,比如说便于修改和更新,以及呢?便于实现对目标模块的共享。那么,对于静静态模块,静态链接装配在一起的装容模块呢?如果要修改或更新其中的某个目标模块,则要重新打开装容模块,那么这比较效率比较低,有的有时候甚至是不可能实现。若采用动态连接方式啊,由于各目标模块是分散开分开存放的,因此呢,

要修改或更新各目标模块呢,是比较容易的。在采用静态练习方式时,每个应用模块呢,都必须含有其目标模块的考,这样一个复制无法实现对其目标模块的共享。但采用装入式动态连接方式呢?插入系统呢?就很容易将一个目标模块呢?链接到几个应用模块上实现未读,多个应用程序对该模块的共享,比如说我们装入时动态链接了。也就是说,这里只在用户原程序经过编译后得到一组目标模块,在装入内存时再采用边装入边链接的这样一个方式,

那么这是我们的装入式动态链接。那么,接下来我们再看一下动运行时动态链接,在许多情况下呢?应用程序在运行的时候呢?每次运行的模块呢?是不可能可能不相同的。但由于事项无法知道本次要运行哪些模块,所以是只能是呢,将所有要运行的模块呢全部装入内存,并在装入时呢全部链接在一起,这比较低效。那么,往往有部分模块呢?根本就不运行,

那比较典型的例子呢?那么就是这样一个。作为错误处理使用的目标模块,如果程序在整个运行过程中都不出现错误,那么就不会用到该模块。那么我们呢?还这个时候呢,就有一种动运行时动态链接的方式,那么这种连接方式呢,是对某些模块的链接推迟到程序运行时才。才执行。也就是说,在执行过程中,当发现一个被调用模块尚未装入内存时,就立即用操作系统呢,

去找到该模块并装入内存,将其连接到该用户又调用者模块上。凡是在执行过程中未被用到的目标模块,都不会被调入内存和连接到装入模块上,这不仅能加快程序的装入过程。而且可节省大量的存储空间,也就是说我们的装运行时动态链接呢?就是在。对某些模块的链接推迟到程序执行时才进行,也就是说在执行过程中当发现一个被调用模块尚未被装入内存时,那么便去找到该模块将其装入内存,并将其连接到调用者模块上。这就是运行时公开链接。那么,接下来我们看一下连续分配存储管理方式,

在单为了能将用户存储呢,装入内存必须为它分配一定大小的存储空间。连续分配呢,是最早出现的一种存储器分配方式,那么该分配方式呢,是为一个用户程序呢,分配一个连续的存储空间。那么就是说也就说程序中的代码或者数据的逻辑地址相邻,那么体现在了内存空间分配是物理地址相邻。连续分配呢,可以分为四类,单一连续分配固定分区,分配动态分区分配以及呢,动态可重定位分区分配四种算法。首先我们来看一下单一连续分配,

在单道程序环境下呢,由于当时的当时的存储器管理方式啊,是把内存分为系统区和用户区两部分。系统区仅提供给操作系统使用,它通常是存放在内存的低质部分,而在用户区内存中呢,仅装有一道用户程序,比如说整个内存的用户空间被该数据独占。这样的存储区分配方式呢?被称为单一连续分配,那么这是我们的单一连续分配方式。比如说单一连续分配方式呢,就是把我们的内存分为系统区和用户区两部分,系统区呢,分配给操作系统,

使用用户区呢,分配给用户使用。并且呢,整个用户区呢,只有一道程序,那么由单一道程序呢,独占那么这样的重叠级分配方式呢,称为单一连续分配。那么,接下来我们再看一下固定分区分配,那么固定分区分配呢?比如说我们之后呢,出现了多道程程序系统,为了能在程系统中呢装入多道程序,且使这些程序之间又不会发生相互干扰。

那么于是呢,将整个用户空间划分为若干个固定大小的区域,在每个分区中只装入一道作业,这样就形成了最早的也最简单的一种运行多道程序的分区式存储管理方式。那么,如果在内存中呢?有四个用户分区,便允许四个进程序呢?同时并发运行。当你空分区空闲时,便可再从外存的后备队列中选择一个适当大小的作业装入该分区。在该作业结束时,又可从后备作业中找出一个作业来调入该分区。那划分分区的方法是什么呢?我们可以采取将分区呢划分为若干个大。

固定大小的分区的方式来进行划分,采采取不同的方式来进行划分,比如说划分的分区大小相等。这是指所有的内存分区,大小相等,或者说划分的分区大小不同,这样一个情况。分区大小相等的,那么这是指所有的内存分区大小相等,那么其特点呢?是缺乏灵活性,当程序大小太小时,无法造成内存空间的。会造成内存空间的浪费,当程序太大时,

一个分区又不足以装入该程序。致使该程序无法运行,那么就那么这样呢?那么,对于一台计算机同时控制多个对象的场合,这些度场合,这些对象所需的内存空间大小往往相同。那么,这些方法呢?比较实用。那么,这样一些情况。那么,它是这样一个运用的实现的。实施的这样一个运行,

这样一个使使用方式。第二个呢,是分区大小不等,为了增加存储器分配的灵活性,应将存储器呢分区划分为若干个大小不同的分区。通常呢,可把用户内存区域呢划分为多个较小的分区,适量的中等分区以及少量的大量分区,这样呢?这可便可以使程根据程序的大小呢,为它分配适当的分区。为了便于内存分配呢,通常将分区按照其大小进行排队,并位置建立一张分区使用表,其中各表象呢包含各个分区的起始地址状态。

去大小,比如说我们这张图当中,我们的固定分区使用表,比如说这样一个表当中呢?当有用。比如说我们这个表当中有我们的分区,一分区,二分区,三分区四,并且呢,有它的大小和它的起始地址和它是否进行分配?当有一用户程序要装入时,由内存分配程序呢?根据用户程序的大小。小检索该表从中找出一个能满足要求的,

尚未分配的分区,分配给该程序,然后呢,将该。表象中的状态呢,设置为已分配,若找到大小足够的分区呢,则将。该程序进行分配,如果没有找到大小足够的分区呢,则拒绝为该程序呢分配内存,那么那么固定分区呢?是最早出现的,可用于多道程序中。的这样一个存储管理方式,

由于每个分区的大小固定,必然会造成存储空间的浪费,那么因而呢,那么很少用用于通用的这样一个操作系统中。那么,接下来我们看一下动态分区分配。动态分区分配呢,又称为可变分区,它是根据进程的实际需要动态的位置分配内存和空间。实在实现动态分区分配时呢,将涉及到分配分区中所用的数据结构。共分批分分区分配算法和分区的分配和操作和回收这三方面的问题。动态分区分配中的数据结构,我们来看一下常用的数据结构呢?有这样一些形式,

空闲分区表。在系统中呢,设置一张空闲分区表。用来记录每个空闲分区的情况,每个空闲分区呢,占用一个表目,表目中呢,包含分区号,分区大小和分区实质等数据。第二个呢,是控权分区链。为了实现对控权分区的分配和链接,在每个分区的起始部分呢,设置一些用于控制分区信息的这样一个信息。分配的信息以及呢,

用于链接各部分呢,所用的前项指针在分区尾部呢,设置于后项指针,通过前后相链接的指针呢,可以。可以把所有分区呢链接成一个双向链,那么我们看一下,这是我们的空闲分区表,那么空闲分区表呢?有我们的分区号,有我们的分区大小分区的实质。以及了它的这样一个。状态了。是否是空闲的那么这样一个部分,那么也有我们的这样一个空闲分区链,

那么通过我们的前项指针和后项指针啊?那么把它呢?分区链表呢?链接成一个双向链,那么可以了。使用我们的这样一个链表的这样一个方式,接下来我们看一下动态分区分配算法,把一个新作业装入内存呢,按照一定的分配算法从。从空闲分区或空闲分区链中选出一些作业了,分配该分分区了,分配给该作业,由于内存分配算法呢,对系统性能有很大的影响。所以说我们进行了一些研究呢,

产生许多动态分区分配算法。分区分配操作有什么呢?分配内存以及呢?回收内存。我们首先来看一下。系统呢,应利用。某种分配算法,我们的在动态分区的存储管理方式中呢?主要的操作呢是分配内存和回收内存。系统呢,应利用某种分配算法,在我们的分配内存当中呢,从空闲分区页或者表中找到所需大小的分区。那么,

设请求分区的大小呢?为u size表示,每个空调分区的大小呢?可表示为m size,那么。我们来看一下这个图当中,若m size-u size,小于size。再者是事先规定的不可分割的剩余区的分区大小,说明了多余部分太小不能再分割,便将整个分区呢分配给请求者。否则呢,若多一部分呢,多一个赛日变成分区中呢,按照请求的大小划分出一块内存空间分配出去,

剩下部分呢,仍然保留在空想分区中。然后呢,将分配区的手指返回给调用者,那么我们看一下这个分配流程,首先呢,我们从头开始查找,那么是否查查找完毕,那么没有查找完毕的?那么这个时候呢,如果m size就是我们的每个空闲分区的大小m size,减去u size就是请求分区的大小u size是否呢?大于是乎小于。是不小于塞子,如果小于塞子的话呢?

那么,将分区呢?该将从院中移出,将该分区呢?分别给请求者并相关有关数据结构。如果不不想,如果是大于赛于的话。那么,从该分区中呢,划分出优赛的大小的分区,然后将该分区呢,分配给请求者,地区外有关的数据结构,那么这是我们分配内存的部分。那么,

回收内存呢?当进程呢?运行完。d释放内存时,系统根据回收区的手指,从空闲区列表中找到相应的插入点。那么这个时候呢,可能有四种情况。那么可能是四件四种情况之一,第一种呢,回收区域插入点的前一个控权分区f1相邻。这时呢,应将回收区域插入起点的权益分区合并。不必为回收区而分配新表项,只需呢,

修改其前一分区的f1的大小,比如说我们看一下这个图当中。第一个呢是。回收区呢与?权益分区f1。相邻那么这个时候呢,我们只需将回收区呢与插入点的前一分区进行合并,那么不必为回收区呢分配新表项。只需修改权益分析f1的大小。


页: [1]
查看完整版本: 10.第10节课第四章存储器管理