一.存储器的层次结构
二.程序装入和链接
1.用户程序变为可执行程序需要经过:编译、链接、装入;逻辑地址、物理地址
2.程序的装入:绝对装入、可重定位装入、动态运行装入;重定位、静态重定位、重定位寄存器
3.程序的链接:静态链接、装入时动态链接、运行时动态链接
用户源程序执行通常要经过的步骤:
(1)编译:由编译程序将用户源代码编译成若干个目标模块。
(2)链接:由链接程序将编译后形成的目标模块以及它们所需要的库函数,链接在一起,形成一个装入模块。
(3)装入(加载):由装入程序将装入模块装入主存的过程。
程序的装入
把程序装入内存空间。采用三种方式:
绝对装入方式(Absolute Loading Mode):在可执行文件中记录内存地址,装入时直接定位在上述(即文件中记录的地址)内存地址。
- 优点:装入过程简单。
- 缺点:过于依赖于硬件结构,不适于多道程序系统。
可重定位方式(Relocatable Loading Mode):在可执行文件中,列出各个需要重定位的地址单元和相对地址值。当用户程序被装入内存时,一次性实现逻辑地址到物理地址的转换,以后不再转换(一般在装入内存时由软件完成)。 即装入时根据所定位的内存地址去修改每个重定位地址项,添加相应偏移量。
静态重定位:地址变换在进程装入时一次完成,以后不再改变
- 优点:不依赖于硬件,可以装入有限多道程序;无须硬件支持。
- 缺点:一次性全部装入;一个程序通常需要占用连续的内存空间;程序装入内存后运行时不能移动
三.连续分配存储器方式
连续分配方式分为四种:单一连续分配,固定分区分配,动态分区分配,动态可重定位分区。
1、单一连续分配
- 在单道程序环境下,当时的存储器管理方式是把内存分为系统区和用户区两部分。
- 系统区仅提供给OS使用,它通常是放在内存的低址部分。
- 在用户区内存中,仅装有一道用户程序,即整个内存的用户空间由该程序独占。
- 这样的存储器分配方式被称为单一连续分配方式。
2、固定分区分配
(1)划分分区的方法
可按照下面两种方法将用户空间分为若干个固定大小的分区:
- 分区大小相等(指所有的内存分区大小相等)。缺点:缺乏灵活性,即程序太小会造成内存空间浪费;程序太大,一个空间不足以装入该程序。
- 分区大小不等。增加了存储器分配的灵活性。
(2) 内存分配
为了便于内存分配,通常将分区按其大小进行排队,并为之建立一张分区使用表,其中各表项包括:每个分区的起始地址、大小及状态(是否已分配)。
当有一个用户程序要装入时,由内存分配程序依据用户程序大小检索该表,从中找出一个能满足要求的,未分配的分区,将其分配给该程序,然后将该表项中的状态为“已分配”。若未找到大小足够的分区,则拒绝为该用户分配内存
3、动态分区分配
- 1. 动态分区分配中的数据结构
- 2. 动态分区分配算法
- 3. 分区分配操作
4、基于顺序搜索的动态分区分配算法
- 1. 首次适应算法(FF)(首地址递增,从链首开始)
以空闲分区链为例来说明采用FF算法时的分配情况。
FF算法要求空闲分区链以地址递增的次序链接。在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存空间,分配给请求者,余下的空闲分区仍留在空闲链中。若从链首直至链尾都不能找到一个能满足要求的分区,则表明系统中已没有足够大的内存分配给该进程,内存分配失败,返回。
优点:保留了高址部分的大空闲区,为之后到达的大作业分配大的内存空间创造了条件。
缺点:低址部分不断被划分,留下许多难以利用的,很小的分区,称为碎片。而且每次都是从头开始搜索,这就增加了空闲分区的开销。
- 2. 循环首次适应算法(NF)(首地址递增,不从链首开始)
为避免低址部分留下许多很小的空闲分区,以及减少查找可用空闲分区的开销,循环首次适应算法在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业。
优点:该算法可以使内存中的空闲分区分布的更加均匀,从而减少了查询时间。
缺点:缺乏较大空闲分区。
- 3. 最佳适应算法(BF)(空闲分区大小递增)
所谓“最佳”是指,每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区分配给作业,避免“大材小用”。为了加速寻找,该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。
优点:可以尽可能的找到最适合的内存空间。
缺点:BF算法会造成每次分配后所切割的剩余部分总是最小的,这样,在存储器中会留下许多难以利用的碎片。
- 4. 最坏适应算法(WF)(空闲分区大小递减)
由于最坏适应分配算法选择空闲分区的策略正好与最佳适应算法相反:它在扫描整个空闲分区表或链表时,总是挑选一个最大的空闲区,从中分割一部分存储空间给作业使用,以至于存储器中缺乏大的空闲分区,故把它称为是最坏适应算法。
优点:使可剩下的空闲区不至于太小,产生碎片的可能性很小,对中小作业有利。
缺点:缺乏较大空闲分区。
5、基于索引搜索的动态分区分配算法
- 1.快速适应算法
- 2. 伙伴系统
- 3. 哈希算法
6、动态可重定位分区分配
- 1. 紧凑
- 2. 动态重定位
- 3. 动态重定位分区分配算法
四.对换
1.对换的引入
在多道程序环境下,一方面,在内存中的某些进程由于某事件尚未发生而被阻塞运行,但它却占用了大量的内存空间,甚至有时可能出现在内存中所有进程都被阻塞,而无可运行之进程,迫使CPU停止下来等待的情况;另一方面,却又有着许多作业,因内存空间不足,一直驻留在外存上,而不能进入内存运行。显然这对系统资源是一种严重的浪费,且使系统吞吐量下降。
对换是指: 把内存中暂时不能运行的进程或者暂时不用的程序和数据换出到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程或者进程所需的程序或者数据换入。对换是改善内存利用率的有效措施,它可以直接提高处理机的录用率和吞吐量
2.对换的类型
在每次对换时,都是将一定数量的程序或数据换入或换出内存。根据每次对换时所对换的数量,可将对换分为如下两类:
- 整体对换。整体对换其实就是之前博客中所说的处理机的中机调度,也称为"进程对换"或者"整体对换"
- 页面(分段)对换。即对换是以进程的一个"页面"或者"分段"为单位进行的,这种方法是实现请求分页和分段使储存管理的基础,其目的是支持虚拟存储系统。
五.分页存储管理方式
基本地址变换机构
- 逻辑地址: 把相对地址分为页号和页内地址两部分。
- 越界中断: 页号与页表长度做比较。
- 页表定位:页表始址 + 页号 × 页表项长度。{查询页表:读出块号。
- 物理地址:块号 + 块内地址。 (块内地址 = 页内地址)
六.分段存储管理方式
分段存储管理方式通过将程序分成逻辑上的各个段,如主程序段、子程序段、数据段等,每个段独立编址,并根据逻辑关系组织,这不仅方便了程序的组织和管理,也为信息的共享与保护提供了便利。以下深入探讨段页式存储管理方式,这是分页与分段管理方式的结合体,旨在吸收两者的优点,实现更高效的内存管理。
段页式存储管理的优势
- 提高内存利用率:通过解决外部碎片问题,段页式管理方式有效提高了内存的利用率。
- 便于编程和管理:保留了分段管理的优点,如便于编程、易于实现信息共享和保护等。
- 动态链接与动态增长:支持程序的动态链接和段的动态增长,适应了程序运行中的实际需求。
分页与分段的区别
分页和分段系统在表面上看似相似,都采用离散分配方式并通过地址映射机构实现地址变换。但本质上两者完全不同:
- 页是物理单位:分页旨在消减内存碎片,提高内存利用率,是系统管理的需要。
- 段是逻辑单位:分段满足用户需求,每个段都是一组逻辑上相对完整的信息。
- 页的大小固定:由系统决定,用户程序地址空间是一维的。
- 段的长度不固定:由用户程序决定,地址空间是二维的。