程序的装入操作系统

2016-08-13 21:45:03 shenziheng1 阅读数 1204

1.可执行程序的生成步骤


如何装入待执行的程序及其所需的数据?
何时将程序的逻辑地址转换为物理地址?
3种装入方式:绝对装入、重定位装入和运行时动态装入。 

1.1绝对装入

程序运行之前,按照程序的逻辑地址,将程序和数据装入内存指定的地方。实现简单,无须进行逻辑地址到物理地址的变换。

缺点:
程序每次必须装入同一内存区;
程序员必须事先了解内存的使用情况,根据内存情况确定程序的逻辑地址;
程序的修改(增加或删除指令)将引起整个程序中指令地址的变动;
程序中的所有存储引用,例如函数调用或过程调用等,在装入之前都必须转换为物理地址,这不利于存储共享。

1.2重定位装入

允许将程序装入与逻辑地址不同的物理内存空间。即程序可以装入到内存的任何位置,其逻辑地址与装入内存后的物理地址无直接关系。但是,必须进行地址映射,将逻辑地址转换为物理地址。
静态重定位技术:地址映射在程序装入时进行,以后不再更改程序地址。
有利于程序代码和数据的共享。因为装入程序时,可以将其中的某些存储引用的逻辑地址映射为内存中已有的共享区的物理地址。但是,静态重定位不允许程序在内存中移动。这不便于进程交换和紧凑拼接操作,也很难实现多道程序环境下,多个程序同时装入内存的要求。故,重定位装入方式只适合于单道程序环境。
运行时动态装入:程序的地址转换不是在装入时进行,而是在程序运行时动态进行。运行时动态装入需要硬件支持,即重定位寄存器,用于保存程序在内存中的起始地址。程序被执行时,通过重定位寄存器内的起始物理地址和指令或数据的逻辑地址计算其物理地址。运行时动态装入有利于多道程序环境下,进程的换进/换出及实现紧凑技术。 

2.可执行程序的链接形成 

目标模块如何链接成装入模块呢?静态链接,动态链接(装入时动态链接和运行时动态链接 )

2.1静态链接

程序被装入内存之前,必须完全链接成一个装入模块,将其中的存储引用全部转换为相对地址跳转语句。并将多个目标模块链接成为一个模块,使装入模块中的每一条指令具有相对于整个模块的第一条语句的逻辑地址。静态链接生成的装入模块可以采用重定位装入或运行时动态装入方式。静态链接需要花费大量的处理机时间。而其中的很多模块将不会运行,浪费存储空间和处理机时间。

2.2 动态链接

不用事先链接所有目标模块形成一个完备的装入模块,而是生成一个含有未被链接的外部模块引用的装入模块,这些外部模块可以在装入时链接,或运行时链接。
装入时动态链接(如为真为假两种情况都要装入,而实际上只用到了一种情况):
当系统装入含有未链接的外部模块引用的装入模块时,每当遇到一个外部模块引用,则查找相应的目标模块。将其装入内存,并将模块内的指令地址转换为相对于整个装入模块起始地址的相对地址。
优点:有利于目标模块的更新与升级;有利于代码共享;有利于扩充软件的功能,可以将扩充部分作为动态链接模块。
缺点:可能链接一些不会执行的模块,浪费存储空间和处理机时间。
运行时动态链接:
外部模块引用直至程序执行时才装入内存,并链接到装入模块中,进行地址转换。可以解决静态链接和装入时动态链接都面临的存储空间和处理机时间浪费问题,不需要执行的模块就不会装入内存。该方法广泛用于事务处理系统,如航空售票系统、银行管理系统等。操作系统自身的一些特殊处理例程,如错误处理例程,也无需事先全部装入内存。

3.简单存储管理技术

相对于虚拟存储而言,指为了实现简单,执行之前,操作系统必须将待执行的程序全部装入内存。然而,现代操作系统大都支持虚拟存储功能,允许进程装入部分程序即可开始执行,其余部分保留在外存。当执行所需的部分不在内存时,中断进程执行,使之阻塞等待,直到相应部分装入内存。

4.程序在内存中如何组织

连续存储 : 需要内存中的一块连续的、足够大的分区。如果内存中没有足够大的连续空闲分区,但存在总量足够的独立小分区,即外零头。系统要么拒绝分配空间,要么采用紧凑技术拼接外零头。
非连续存储:允许进程的程序和数据分别装在内存的不同分区中。必须登记一个进程分到的所有分区的位置、大小、使用情况(如是否共享等)等信息。常用的非连续存储技术:分页存储技术、分段存储技术及其结合。

4.1 连续存储管理

最简单的存储管理技术,要求系统配置专门的硬件实现快速地址转换和存储保护。处理机硬件 :基址寄存器(Base register)、界限寄存器(Bounds register)。
基址寄存器:存放当前执行进程所在分区的物理存储单元的起始地址。 
界限寄存器:存放当前执行进程所在分区最后一个物理存储单元的地址,限定进程的执行范围,保护其他进程不被非法访问。
基址寄存器和界限寄存器被多个进程共享,只有当前执行进程才使用它们。 
装入时,进程分区的基地址值和分区的最后一个物理存储单元的地址值,分别填入该进程PCB的相应字段中。当进程被调度执行时,将PCB中对应的进程基地址值写入基址寄存器中,并将进程获得的内存分区最大地址值,填入界限寄存器中。当进程被交换出/换入内存时,上述两个地址值也会发生改变

4.2 地址映射与存储保护

逻辑地址转换成物理地址:取基址寄存器中的值,加上逻辑地址值,生成一个物理地址
地址越界检查:取界限寄存器中的值,与第一步计算的结果进行比较。如果生成的物理地址超出了界限范围,产生一个中断,报告地址越界。否则,继续该指令的执行。

4.3 非连续存储-简单分页存储管理 

连续存储:存在外零头,浪费存储空间。“紧凑”需要系统额外开销。
非连续存储:允许将一个进程的程序和数据离散存储在多个独立的分区中,消除了外零头。
分页存储管理基本原理:
分页存储管理技术是一种特殊的固定分区方法。系统事先将物理内存划分成许多尺寸相等的页框 (Page Frame),并将进程分割成许多大小相同的页面 (Page),页面与页框大小相同
分区:进程的逻辑地址空间是连续的、一维的、线性地址,进程的每一条指令和数据的地址相对于第一条语句的地址而定。分页:进程被分割成许多页面。每个页面内的指令和数据是连续的,它们的地址相对于其所属页的第一条语句的地址,称为页内偏移量。逻辑地址被分为两部分:页号和页内偏移量
当一个进程被装入物理内存时,系统将为该进程的每个页面分配一个独立的页框。同一个进程的多个页面不必存放在连续的多个页框中。
假设内存能提供16个空闲页框,进程P1被分割成4个页面,装入内存中的0号至3号页框。进程P2被分割成3个页面,装入4号至6号页框。进程P3被装入7号至12号页框,如图(a)所示,此时,进程P4请求分配5个页框大小的存储空间,但内存只有3个空闲页框。于是,将暂时不运行的P2交换出内存,如图(b)所示:然后,再将P4装入4、5、6、13、14号页框,如图(c)所示。 

数据结构-页表:
页表:系统为每个进程建立一张页面映射表。用于记载进程的各页面到物理内存中页框的映射信息。进程的每个页面依次对应页表中的一个表项,其中包含相应页在内存中对应的物理页框号和页面存取控制权限等字段。

4.4 地址变换

硬件机制,实现逻辑地址到物理地址的转换。分页系统中的地址变换过程如下:
(1)根据逻辑地址,计算出页号和页内偏移量;
(2)用页号检索页表,查找指定页面对应的页框号;
(3)根据页框号和页内偏移量,计算出物理地址。
页表寄存器:实现快速地址映射,存储执行进程的页表起始地址。页表寄存器设置在处理机硬件中。当进程被创建时,其页表起始地址记载于进程PCB中。当进程被调度执行时,页表的起始地址将从该进程的PCB中取出,并填入页表寄存器中。进行地址变换时,处理机从页表寄存器中查找页表的地址。

4.5 大页表

大逻辑地址空间,页表非常大,需要占用相当大的内存空间。比如,32位逻辑地址空间,假设页面大小为4KB,则4GB的逻辑地址空间将被划分成2^20个页面。若采用一级页表,则其内将包含1兆(2^20)个页表项。若按字节寻址,一个页表项占4B,则一级页表需要占用4MB内存空间。不可能将4MB的页表保存在一个连续区中。那么,如何处理大页表的存储与检索呢? 
二级页表:
将一个大页表全部保存在内存中。首先,将其分割,并离散地存储在内存的多个页框中。为之建立二级页表,记录被分割的各个页面存储在哪些页框中,也称为外层页表(Outer Page Table)。对于4GB的进程,若采用二级页表,则对应的二级页表结构如图: 

多级页表:
对于某些机器,二级页表也可能非常大。可以采用多级页表,对外层页表再进行分页,将各个页面离散地存储到不相邻接的物理页框中。虽然,对大页表而言,多级页表方法消除了对较大的连续内存空间的需要,但并未解决
大页表占用较大的内存空间的问题,建立多级页表反而会增加额外的存储空间。最好的解决办法是采用虚拟存储技术,内存中仅装入页表的一部分。即只将当前需要的部分页表项装入内存,其余页表项驻留在磁盘上,需要时再将它们装入内存。若采用多级页表,对于正在运行的进程,必须将其外层页表调入内存,而内层页表只需调入几页就可以了。

4.6 反置页表 (Inverted Page Table)

一般情况下,系统从进程的角度为每个进程建立一张页表,页表的表项按页号排序。这种方法可能导致一个大进程的页表太大,占据大量的内存空间。反置页表:从内存的角度建立页表,整个系统只有一张页表。页表的表项基于内存中的每一个物理页框设置,页表项按页框号的顺序排序。其中还必须包含页框对应的页号及其隶属进程的标识符等信息。 
通常,反置页表需要包含成千上万个表项,利用进程ID和页号检索其中某一个表项的速度很慢。可以根据进程ID和页号构建Hash表。Hash表的每一项指向反置页表中的某一项。但是,可能会出现多个逻辑地址被映射到一个Hash表项的情况。需要通过链接指针将多个冲突的映射链接起来。一般,冲突的表项一般只有一项,或两项。 
地址变换问题
首先,以进程ID和页号为参数,代入Hash函数进行计算。然后,根据计算结果,检索反置页表。若检索完整个反置页表都未找到与之匹配的表项,表明此页尚未装入内存。若系统支持虚拟存储技术,则产生请求调页中断。若系统不支持虚拟存储技术,则表示地址出错。当检索到反置页表中的对应表项时,将其中的页框号与逻辑地址中的偏移量相加,构成物理地址。
 

4.7 块表

分页系统:处理机每次存取指令或数据至少需要访问两次物理内存—第一次访问页表,第二次存取指令或数据
为了提高地址变换速度,为进程页表设置一个专用的高速缓冲存储器,称为快表、TLB(Translation Lookaside Buffer),或联想存储器(Associative Memory) 
快表的工作原理
快表的工作原理类似于系统中的数据高速缓存(cache),其中专门保存当前进程最近访问过的一组页表项。
根据局部性原理,在一个很短的时间段内,程序的执行总是局部于某一个范围。即进程最近访问过的页面在不久的将来还可能被访问。

5.分页系统地址转换

通过根据逻辑地址中的页号,查找快表中是否存在对应的页表项。
若快表中存在该表项,称为命中(hit),取出其中的页框号,加上页内偏移量,计算出物理地址。
若快表中不存在该页表项,称为命中失败,则再查找页表,找到逻辑地址中指定页号对应的页框号。同时,更新快表,将该表项插入快表中。并计算物理地址


页面与页框大小
分页系统中,页面 = 页框。页框的大小由计算机的硬件逻辑定义。通常,页框的大小是2的幂次个字节,且常在512B(29)~4KB(212)之间,典型的页框大小为1KB。
将页框大小设置为2的幂次,可以简化处理机中地址变换硬件逻辑的设计与实现。
影响页面与页框大小的主要因素:页内零头、地址转换速度和页面交换效率。
较小的页面有利于减少内零头,从而有利于提高内存的利用率。然而,较小的页面也将导致页表过大,从而降低处理机访问页表时的命中率(Hit Rate)。
块越大,内/外存之间的数据交换效率越高。因此,对于支持交换技术的系统,较大的页面有利于提高页面换进/换出内存的效率。

5.1对分页存储管理的评价

彻底消除了外零头,仅存在很少的内零头, 提高了内存利用率。
分页操作由系统自动进行,一个页面不能实现某种逻辑功能。用户看到的逻辑地址是一维的,无法调试执行其中的某个子程序或子函数。
采用分页技术不易于实现存储共享,也不便于程序的动态链接。

5.2 简单分段存储管理

基于模块化程序设计时,常常需要将一个大任务划分成若干相对独立的子任务,对应于子任务编写子程序,称为段(Segment)。
每个子程序可以独立地编辑、编译、链接和执行。
各个子程序由实现的功能决定,长度各不相同。执行时,根据实际需要,将若干子程序链接成一个大程序。
基本原理
程序由若干逻辑段组成,每个段有自己的名字和长度。程序的逻辑地址是由段名(段号)和段内偏移量决定。每个段的逻辑地址从0开始编址 。

系统采用动态划分技术,将物理内存动态地划分成许多尺寸不相等的分区。
当一个进程被装入物理内存时,系统将为该进程的每一段独立地分配一个分区。同一进程的多个段不必存放在连续的多个分区中。
分段系统的基本数据结构
段表 : 每个进程建立一个,用于描述进程的分段情况,记载进程的各个段到物理内存中分区的映射情况。其中包含段号、段长、段基址以及对本段的存取控制权限等信息。
空闲分区表 : 用于记载物理内存中的空闲分区情况。

地址变换和存储保护
(1)根据逻辑地址中的段号检索进程段表,获得指定段对应的段表项;
(2)判断是否地址越界。比较逻辑地址中的段内偏移量与段表项中的段长,若超过段的长度,则产生存储保护中断(该中断将由操作系统进行处理);否则,转(3);
(3)把逻辑地址中的段内偏移量与段表表项中的段基址相加,从而得到物理地址。

6.分页与分段技术的比较

都采用非连续存储,由地址映射实现地址变换。
不同主要表现在:
(1)页是信息的物理单位,大小固定。段是信息的逻辑单位,各段的长度不固定。每一段都具有一定逻辑含义。
(2)分页的地址空间是一维的,逻辑地址的划分由机器硬件实现,对用户透明。分段的地址空间是二维或多维的,程序员知道段名和段内偏移量。
(3)分页活动源于系统管理物理内存的需要,在系统内部进行,由系统实施,用户看不见。分段活动源于用户进行模块化程序设计的需要,在系统外部进行,由用户实施,用户是知道的。
 

6.1 简单段页式存储管理 

基本思想:采用分段方法组织用户程序,采用分页方法分配和管理内存。即,用户程序可以用模块化思想进行设计,一个用户序由若干段构成。系统将内存划分成固定大小的页框,并将程序的每一段分割成若干页以后装入内存执行时。
逻辑地址
在段页式系统中,进程的每一段被进一步分割成页面,段内代码和数据地址不再连续。
逻辑地址由3部分组成:段号、段内页号、页内偏移量,如图

数据结构
用于管理的数据结构:段表、页表,如图:

6.2对段页式存储管理方式的评价

综合了分段和分页技术的优点,既能有效地利用存储空间,又能方便用户进行程序设计。
但是,实现段页式存储管理系统需要增加硬件成本,系统的复杂度和管理开销也大大增加。
因此,段页式存储管理技术适合于大、中型计算机系统,不太适合小型、微型计算机系统。
2015-06-22 10:00:21 H002399 阅读数 0

1.程序的装入方式:

· 可重定位装入方式和静态重定位装入方式。

动态重定位:

即须在系统中增设一个重定位寄存器,用它来存放程序(数据)在内存中的起始地址,程序在执行时,真正访问的内存地址是相对地址与重定位寄存器中的地址相加而形成的。


2017-09-10 22:51:54 huangxiang360729 阅读数 1290

程序的装入和链接


1.概述

程序要运行,先得为这个程序创建进程。创建进程的第一件事就是将程序和程序需要用到的数据装入内存。由用户编写的源代码如何变成一个存放在内存中的程序?步骤如下:
1. 编译、汇编:将源代码,通过编译程序汇编程序,编译和汇编成若干个目标模块(目标文件)
2. 链接:将若干个目标模块(目标文件)和若干个程序所需库函数,通过链接程序,链接成装入模块(可执行文件)
3. 装入:将装入模块(可执行文件),通过装入程序,装入到内存

该处理步骤流程图:

     编译程序、汇编程序    若干个程序所需库函数+    链接程序                       装入程序
源代码---------------->若干个目标模块(目标文件)----------->装入模块(可执行文件)---------->内存

实际上,上面的流程图省略了一些步骤(编译预处理、编译优化,将其笼统归为编译)。


2.程序的装入

程序在装入内存的时候,按照确定绝对地址时所处的步骤阶段可以将装入模式分为3类:
1. 绝对装入方式
2. 可重定位装入方式
3. 动态运行时装入方式

2.1绝对装入方式

分类依据:在绝对装入方式下,确定绝对地址时所处的步骤阶段为源代码阶段(绝对地址由程序员直接赋予)、汇编代码阶段(经过编译后的代码表现形式)或目标模块(目标文件)代码阶段(经过汇编后的代码表现形式)。相当于,在代码的任何表示形式下都不存在相对地址(不过有符号地址的概念)。
特点:这种装入模式只适用于单道程序环境,不适用于多道程序环境。

2.2可重定位装入方式

分类依据:在可重定位装入方式下,确定绝对地址时所处的步骤阶段为装入阶段,装入模块装入内存后,会立即将其相对地址转换为绝对地址。相当于,程序进入内存后其所有相对地址都会变成绝对地址。
特点:这种装入模式使用适用于多道程序环境。

2.3动态运行时装入方式

分类依据:在动态运行时装入方式下,确定绝对地址时所处的步骤阶段为程序运行阶段,装入模块装入内存后,不会立即将其相对地址转换为绝对地址,而是在程序要真正运行时才进行地址转换。
特点:这种装入模式使得程序可以在内存中移动。


3.程序的链接

按照链接程序将目标模块(目标文件)和程序所需的库函数链接成装入模块(可执行文件)的时间(简单点:链接时间),可以将链接方式分为3类:
1. 静态链接方式
2. 装入时动态链接方式
3. 运行时动态链接方式

3.1静态链接方式

目标模块装入内存之前进行链接,链接成一个装入模块(可执行文件)后不再拆开。

3.2装入时动态链接方式

目标模块装入内存时,边装入边链接。即在装入了一个目标模块后,发现其要调用的目标模块不在内存中,则由装入程序找到相应的外部模块并将其装入内存

相较于静态链接方式的优势:
1. 方便目标模块的修改和更新。
2. 便于实现目标模块的共享。

3.3运行时动态链接方式

程序执行时才将目标模块链接到装入模块中。即在程序的执行过程中,若发现被调用的目标模块未被装入内存时,则操作系统将立即找到该目标模块并将其装入内存,最后将其链接到调用这个目标模块的目标模块上。

较于装入时动态链接方式的优势:
有些目标模块可能并不会被程序执行(错误处理模块),但是装入时动态链接方式会将其链接到装入模块中,这显然是对性能的损害。但是运行时动态链接解决了这个问题。

2016-12-10 11:34:15 qq_28602957 阅读数 2592

存储器的层次结构

按照速度、容量和成本划分,存储器系统构成一个层次结构。

存储器的层次结构图

程序的装入和链接

一个用户源程序要变为在内存中可执行的程序,通常要进行以下处理:

编译:由编译程序将用户源程序编译成若干个目标模块。

链接:由链接程序将目标模块和相应的库函数链接成装入模块。

装入:由装入程序将装入模块装入内存。

图示

基本概念

逻辑地址(相对地址,虚地址)

  • 其首地址为 0,其余指令中的地址都相对于首地址而编址。用户的程序经过汇编或编译后形成目标代码,目标代码通常采用相对地址的形式。
  • 不能用逻辑地址在内存中读取信息。

物理地址(绝对地址,实地址)

  • 内存中存储单元的地址,可直接寻址。

地址映射(地址转换)

为了保证 CPU 执行指令时可正确访问存储单元,需将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址,这一过程称为地址映射。

程序的装入

1. 绝对装入方式

  • 在编译时,如果能够事先知道程序将驻留在内存的什么位置,那么编译程序将产生绝对地址的目标代码。
  • 绝对装入程序按照装入模块中的地址,将程序和数据装入内存。装入模块被装入内存后,由于程序中的逻辑地址与实际内存中的地址完全相同,故不需对程序和数据的地址进行修改。
  • 该装入方式只适用于单道程序环境。
  • 绝对地址既可在编译时给出,也可由程序员直接赋予。
  • 要求程序员熟悉内存的使用情况。一旦程序或数据被修改后,可能要改变程序中的所有地址。

2. 可重定位装入方式

重定位:由于一个作业装入到与其地址空间不一致的存储空间所引起的,需对其有关地址部分进行调整的过程就称为重定位(实质是一个地址变换过程/地址映射过程) 。

为什么需要重定位:当程序装入内存时,操作系统要为该程序分配一个合适的内存空间,由于程序的逻辑地址与分配到内存物理地址不一致,而 CPU 执行指令时是按物理地址进行的,所以要进行地址转换。

可重定位装入方式:事先不知用户程序在内存的驻留位置,装入程序在装入时根据内存的实际情况把相对地址(逻辑地址)转换为绝对地址,装入到适当的位置。 (在装入时进行地址转换)

图示

重定位基本概念

根据地址变换进行的时间及采用技术手段不同,可分为静态重定位和动态重定位两类。

  1. 静态重定位

    • 当用户程序被装入内存时,一次性实现逻辑地址到物理地址的转换,以后不再转换。
    • 一般在装入内存时由软件完成。
  2. 动态重定位

    • 在程序运行过程中要访问数据时再进行地址变换(即在逐条指令执行时完成地址映射) 。一般为了提高效率,此工作由硬件地址映射机制来完成。
    • 硬件(寄存器)支持,软硬件结合完成。

动态运行时装入方式

  • 可重定位装入方式不允许程序运行时在内存中移动位置。而实际情况是程序在内存中的位置经常要改变。程序在内存中的移动意味着它的物理位置发生了变化,这时必须对程序和数据的地址 (绝对地址) 进行修改后方能运行。
  • 为了保证程序在内存中的位置可以改变。装入程序把装入模块装入内存后,并不立即把装入模块中相对地址转换为绝对地址,而是在程序运行时才进行。
  • 这种方式需要一个重定位寄存器来支持,在程序运行过程中进行地址转换。

程序的链接

静态链接

静态链接方式是一种事先链接方式,即在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完整的装入模块 (执行文件),以后不再拆开。

实现静态链接应解决的问题:

  1. 相对地址的修改
  2. 变换外部调用符号

存在问题:

  • 不便于对目标模块的修改和更新。
  • 无法实现对目标模块的共享。

图示

装入时动态链接

装入时动态链接方式是把一组目标模块在装入内存时边装入边链接的方式。

各目标模块分开存放,便于修改和更新。

便于实现对目标模块的共享。

存在问题:

  • 由于把程序运行所有可能用到的目标模块在装入时均全部链接在一起,所以将会把一些可能不会运行的目标模块也链接进去。如程序中的错误处理模块。

运行时动态链接方式

由于事先无法知道要运行哪些模块,装入时动态链接方式只能是将所有可能要运行到的模块都全部装入内存,并在装入时全部链接在一起,显然这是低效的。运行时动态链接方式在程序运行中需要某些目标模块时,才对它们进行链接的方式。具有高效且节省内存空间的优点。

2015-05-31 19:16:51 ttf1993 阅读数 0

程序的装入与连接

程序要经过编译,链接,装入才能运行

绝对转入方式

将程序装入事先指定的地址,程序装入以后逻辑地址与实际内存地址相同。要求程序员非常熟悉内存地址

可重定位方式

根据内存的具体情况将程序装入适当的位置,把装入时对程序和数据的地址修改过程称为重定位。

动态运行时的装入方式

程序对换的时候内存是改变的
可重定位不允许程序运行时在内存中移动位置。动态运行时的装入程序在把装入模块装入内存后,并不立即把装入模块转换程物理地址,而是吧这中地址转换推迟到程序真正要求执行时进行。

程序的链接

静态链接

在程序运行之前,先将个目标模块及他们所需的库函数链接程一个完整的装配模块,以后不在拆开,就是静态连接方式

装入时动态链接

在装入内存时,边装入边链接源程序
优点:

  1. 便于修改和更新
  2. 便于实现对目标模块的共享

运行时动态链接

运行的时候需要哪个模块就链接哪个模块

连续分配存储管理方式

单一连续分配

单道程序环境,整个内存都是的空间都是由用户这一个程序独占,就是单一连续分配

固定分区分配

把内存划分为几个块,每一个块中装入一个程序,有一个空闲分区,就可以从外部调用一个作业装入该分区

划分分区的办法

  1. 分区大小相等。缺点:缺少灵活性,造成空间浪费
  2. 分区大小不等,大小不同的分区装入不同的作业

内存分配

将分区按大小排列,再为其简历一张分区使用表。装入作业的就检索这张表,分配的内存就把状态变为”已分配”;如果没有找到适合的分区,就决绝为该用户程序分配内存

动态分区分配

根据进程的需要,动态的分配内存。

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

  1. 空闲分区表。记录每个空闲分区的情况
  2. 空闲分区链。将空闲分区排成一个双向链,便于检索,分配出去就把状态为由0设为1

动态分配算法

见另一博文

分区分配操作

  1. 分配内存,从空闲分区链找到适合的大小,然后分区
  2. 回收内存。①空闲分区与F1相邻,在其后面,合并为F1②分区与F2相邻在F2前面,将F2合并为回收分区
    ③与F1和F2相信,全部合并为F1.④都不相邻,重新见一个分区表