基本存储管理
内存管理概述
操作系统对内存区域进行划分:系统区。 用户区。
单道系统
程序员甚至可以直接使用内存地址进行编写程序。
可以说,单道系统内存资源几乎没有管理---无需管理!
多道系统
内存的使用细节对于用户来讲是透明的
内存的细节对于用户来讲是透明的,这意味着用户编写 的程序不知道将来会放在内存的哪个位置,因此,用户编程 不能直接使用内存地址。 要解决用户的编程地址与装入后的内存地址映射的问题, 这称之为地址变换、地址映射、重定位。
总结出存储管理的任务包括:(1)内存分配和回收:静态和动态分配,回收的目的是为了提高内存资源利用率。 (2)地址变换(3)内存保护与共享(4)内存扩充:逻辑扩充,非物理扩充
这四个任务的核心内容是:提高内存资源的利用率。
程序的装入和链接
相对地址/逻辑地址。目标程序中的逻辑地址集合称作该程序的相对地址空间, 又称作逻辑地址空间。
绝对地址/物理地址:程序在内存空间中的实际存储单元地址称做物理地址或绝对地址 物理地址的总体构成运行用户程序的物理地址空间,又称绝对地址空间。
地址重定位:需要对相对地址和绝对地址进行转换(映射),称之为地址重定位。
静态地址重定位:在装入时,由装入程序实现地址一次性转换。 这时,装入模块在装入内存后所有地址都是物理地址。不允许程序运行时在内存中移动位置。
动态运行时地址重定位:考虑到程序在内存中可能被移动(换入和换出等),需采用运行时地址重定位。 程序在装入内存时,依然是逻辑地址,只有在程序被执行时,才进行地址转换
程序的装入
程序的装入指给程序的指令和数据分配物理内存空间,也常被称为加载。
根据地址变换(重定位)发生时机,装入方式分为绝对装入方式 – 可重定位装入方式 – 动态运行时装入方式
-
绝对装入方式
在单道批处理中,在编译阶段知道程序驻留内存的物理地址,编译程序产生使用绝对地址的目标代码。此装入无需重定位。
-
可重定位装入方式
在多道程序环境下,编译程序不能预知目标模块在内存的 物理位置,所以目标代码只能使用逻辑地址。在装入时, 需重定位。 一个程序需要占用连续的内存空间 地址重定位发生在装入时,因此程序装入内存后不能移动。
-
动态运行时装入
动态运行时装入方式的优点是操作系统可将一个程序离散 地存放在内存空间。在程序的整个执行期间:允许程序在运行时加载某一个模块,例如DLL,并且允许模块在内存中改变位置
程序的链接
把由汇编或编译后得到的一组目标模块以及它 们所需的库函数装配成一个完整的模块。
根据链接时机的不同,程序链接分为三种方式。 (1)静态链接 (2)装入时动态链接 (3)运行时动态链接
-
静态链接
在程序装入前,将各个目标模块及它们所需的库函数链接成一个完整的装配模块,即可执行文件,以后不再拆开。
不易于程序的修改和更新,当一个模块修改之后, 需要重新链接,重新生成一个新的可执行文件。 不能实现模块共享。如果有多个程序需使用同一个模块或库函数,则每个可执行文件中包含一个副本。
-
装入时动态链接
在装入一个目标模块时,若发现程序有一个外部模 块调用,则装入程序去找出相应的外部模块,并将 它装入内存以及修改目标模块中的虚拟地址。
-
运行时动态链接
将一些目标模块的链接放在程序 执行的过程中,只有当进程需要它们时,才对它们 进行载入和链接(如已在内存,则链接即可),不 需要时不链接。与装入时动态连接相比,它更节省内存空间
连续分配方式
连续分配方式是指为用户进程分配连续内存空间的 内存管理方式。
单一连续分配方式
最简单的一种存储管理方式,只能用于单用户、单任务的操作系统中。
固定分区分配
多道批处理系统
地址映射问题。 如何分配内存给多个进程。 如何对各个用户进程的内存空间进行保护
分区的划分方案在系统启动之前进行设定。 在系统运行期间,分区划分方案不能改变, 故也称为静态分区方案。
-
划分分区的方法:分区大小相等、分区大小不等
-
分区的分配与回收的管理
分区表
区号 | 分区长度 | 起始地址 | 状态 |
---|---|---|---|
块内碎片:在固定分区方式中,作业往往不能使用分配给 它的全部内存,只占用分配给它的一部分分区, 其空闲的部分也不能被其它作业使用。
-
地址变换和存储保护:重定位技术
可变分区分配
可变分区分配又称为动态分区分配,它按照作业大小划分分区,其划分的时间、大小、位置都是动态的。根据程序需要而分配内存。
块外碎片:会在内存中 产生空闲区和分配区交错出现的现象。 – 其中较小的、不可再利用的空闲区离散地分布在内存的各个地方
-
动态分区分配的管理:空闲分区表、空闲分区链
序号 | 分区大小 | 起始地址 |
---|---|---|
-
空闲分区分配算法:
-
首次适应算法:将空闲分区表或空闲分区链按起始地址递增的顺序排列,分配时从表头开始查询,直到找到 大小满足的第一个分区为止。
-
循环首次适应:分配内存时,不再是每次都从表首开始查找, 而是从上次找到的空闲区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区为止。
-
最佳适应(best fit)算法:空闲分区按照大小递增的顺序排列,在给进程分配内存时,从表头开始查询,直到找到大小满足的第一个分区为止。此方法找到的空闲分区的大小最接近进程的内存申 请量。
-
最差适应算法:空闲分区表按分区大小递减的顺序排列。在给进程分配内存时,最前面的最大的空闲区就是找到的分区。 如果第一个分区无法满足,则分配失败。
动态分区的回收与拼接
地址变换和分区回收
可以采用静态地址重定位,装入时完成地址变换亦可采用动态重定位装入方式,程序和数据的地址转换由硬件完成。
随着分区的分配与收回,内存空间有若干个小的空闲分区,最简单的办法就是定时或在分配内存时把所有碎片合并为一个大的空闲区。实现方法是移动某些已分配分区的内容, 使得所有进程的分区紧挨在一起,而把空闲分区留在另一段。这种技术称为紧凑或拼接
基本分页存储管理方式
离散分配方式。
离散分配方式分为分页存储管理方式和分段存储管理方式。如何分页,由操作系统决定。如何分段,由用户自己决定。
根据作业运行前是否将作业全部装入内存,又分为: 基本分页(段)存储管理方式和请求分页(段)存储 管理方式
页面:分页存储管理是将一个进程的逻辑地址空间分成大小相等的若 干片,这样的片被称为页或页面。
页内碎片:进程长度不会刚好是页面大小的整数倍,进程的 最后一页往往装不满,形成页内碎片。
物理块:页式存储管理将物理内存空间按页面大小划分为若干 个存储块,每个存储块称为物理块,也称为页框或块
地址结构(页号,页内地址)
页表:系统需记录进程逻辑页与内存物理块之间的对应关系,这往往通过为每个 进程建立的页面映像表来实现,页面映像表常常简称为页表
页号 | 物理块号 |
---|---|
逻辑地址结构:
页号 | 页内偏移地址 |
---|---|
在基本分页存储和管理方式中的地址变换:
页表大小与物理块大小相同 ==> 页内偏移地址 = 物理块内的偏移地址。故只需将页表项中的页号转变为物理块号,即可获得物理地址。
页表项中记录了该页面对应的内存物理块号,进程对页表访问非常频繁,常存放在内存中并且是连续存放的。在页式管理中,页面和物理块大小相等,页内地址即是块内地址
快表/联想寄存器:它是一个具有并行查询能力的特殊高速缓冲寄 存器,用于存放近期访问过的页表项。
命中:如果要访问的页表项在快表中,则称为命中
二级/多级页表:
是采用多级页表—将页表离散化存储
页表页面:将页表按照物理块的大小进行分页存储,这些页称之 为页表页面。
外层页表:为了管理这些页表页面,需要为页表页面建立一种数 据结构—另一个页表,即外层页表
两级页表的逻辑地址结构:(外层页号,外层页内地址,页内地址)
多级页表解决了大页表连续存储问题,但是增加了访问内存 的次数,使得程序和数据的访问时间进一步增大。
页面共享:页面共享指的是一个页面同时供多个进程使用。系统提 供的共享页面,可能具有不同的调用方式。
为了实现合理的共享访问,通常在这些共享的数据结构 上面设置状态位来进行保护
基本分段存储管理方式
分段
进程各段在内存中可以不连续存放,但每段要求在内 存中连续存放。
地址结构:(段号S,段内地址)
段表:每个段在表中占有一个表项,其中记录了该段在内存中 的起始地址(又称为“基址”)和段的长度。段表的作用是实现从段号到物理地址的地址映射和指定 段长的作用。段表由于经常访问,一般常驻内存
段号 | 段长 | 段始值 |
---|---|---|
分段共享:段的共享可通过不同进程段表中的项指向同一个段基址来实现的。 ----映射到进程的段表中
基本分段存储管理的优点是没有内碎片,外碎片可以通过紧凑技术来消除;
分页与分段的主要区别
-
页是信息的物理单位,是为了管理内存的方 便和提高内存的利用率而划分的,对用户是 透明的
-
页的大小固定不变,由系统决定
基本段页式存储管理方式
原理
段页式存储管理是分段和分页管理的结合,其基本思想是: 每个进程仍按逻辑分成若干段, 但每段不是按单一的连续整体存放到内存中, 而是把每个段再分成等长的若干个页,段中的页可存放在不连续(离散化)的内存块中, 即每一段不必占据连续的内存空间
逻辑地址、页表、段表
段号 | 段内页号 | 段内地址 |
---|---|---|
在段页式系统中,为了访问内存中的一条指令或数据,须访 问三次内存
可以采用快表等措施,减少对内存的访问次数