内存管理的基本概念
操作系统对内存的划分和动态分配,就是内存管理的概念。
内存管理的功能
- 内存空间的分配和回收
- 地址转换
- 内存空间的扩充(虚存、覆盖等)
- 存储保护
源程序变为内存中可执行程序的三个步骤
- 编译
- 链接
- 装入
程序的链接
- 静态链接:完整的可执行程序
- 装入时动态链接:装入内存时,边装入边链接
- 运行时动态链接:执行时链接,便于更新和修改,便于实现对目标模块的共享
程序的装入
- 绝对装入:逻辑地址与物理地址完全相同,只适合单道程序环境,地址由编译程序给出或程序员赋予。
- 可重定位装入(静态重定位):多道程序环境下,多个目标的起始地址都是从0开始,作业需要一次性装入内存,不能在内存中移动。
- 动态重定位:地址转换在程序执行时进行,需要重定位寄存器,程序可以分配到不连续的存储区,便于程序段的共享,可以给用户提供比存储空间大得多的地址空间。
内存保护
内存分配器,保护操作系统不受用户进程的影响,同时保护用户进程之间不会相互影响。内存保护由操作系统和硬件机构合作完成。
覆盖和交换
覆盖和交换是多道程序环境下用来扩充内存的两种方法。
- 覆盖:把用户空间分为固定区和覆盖区,把经常活跃的部分放在固定区,把即将访问的段放入覆盖区,其他段放在外存,在需要调用前才把它调入覆盖区。内存中能更新的地方只有覆盖区的段,固定区的段常驻内存。
- 交换:把处于等待状态的程序从内存移出,把准备好竞争CPU的程序从外存移到内存。
交换技术主要在不同进程之间进行,而覆盖用于同一程序或进程中。
连续分配管理方式
指为用户程序分配一个连续的内存空间。
单一连续分配
内存分为系统区和用户区,无需内存保护,内存中永远只有一道程序。
固定分区分配
把内存分为若干固定大小的区域,每个分区只装入一道作业。有两种划分方法:
- 分区大小相等
- 分区大小不等
动态分区分配
又称为可变分区分配,在进程装入内存时动态地建立分区,分区的大小和数量可变。会产生外部碎片,可以通过紧凑技术来解决。有四种动态分区的分配策略:
- 首次适应算法:按照地址递增的顺序查找第一个满足要求的空闲分区。
- 最佳适应算法:空闲分区按容量递增的方式排序,找到第一个满足要求的空闲分区。
- 最坏适应算法:空闲分区按容量递减的方式排序,找到第一个满足要求的空闲分区。
- 循环首次适应算法:跟首次适应算法类似,但是分配内存时从上次查找结束的位置继续开始。
非连续分配管理方式
分页管理方式
- 目的:提高内存利用率,提升计算机性能。
- 实现:通过硬件实现,对用户透明。
- 思想:把主存划分为大小相等且固定的块,作为主存的基本单位。每个进程也以块为单位进行划分,进程在执行时以块为单位逐个申请主存的块空间。
- 页:进程中的块称为页。
- 页框:内存中的块。
- 块:外存中的块
- 地址结构:分为两部分,第一部分为页号,第二部分为页内偏移量。
- 页表:系统为每个进程建立一张页表,存放在内存中,页表由页表项组成,页表项第一部分为页号,第二部分为内存中的块号,页表项的第二部分和地址的第二部分共同组成物理地址。页表的作用即实现了从页号到物理块号的映射,再加上地址结构第二部分的偏移量获取进程物理地址。
- 地址变换机构:把逻辑地址转换成物理地址,一般设置一个页表寄存器,存放页表的始址和页表长度,进程未执行时,页表的始址和长度存放在进程控制块中,执行时才存入页表寄存器。
- 地址空间:页式管理中地址空间是一维的。
- 快表:又称相联存储器(TLB),拥有快表后存取数据只需要一次访存(匹配成功的情况)
- 二级页表:顶级页表只能有一个页面,建立多级页表的目的主要在于建立索引,减少内存空间的占用。
分段管理方式
- 目的:考虑用户和程序员,方便编程、信息保护和共享、动态增长、动态链接。
- 段表:每个进程都有一张逻辑空间与内存空间映射的段表,段表项记录该段在内存中的始址和长度。
- 地址结构:段号、段内偏移量。
- 段表:段号、段长、本段在内存的始址。
- 地址变换机构:设置一个段表寄存器,存放段表的始址和段表长度(和段号比)
- 地址空间:因为每段的长度是不固定的,没法通过整数除法得出段号,因此段号和段内偏移量都需要显示地给出,所以分段管理的地址空间是二维的。
段页式管理方式
- 思想:用分段的方法来分配和管理用户的地址空间,用分页的方法来管理物理存储空间。
- 逻辑地址结构:段号、页号、页内偏移量。
- 地址变换机构:系统为每个进程建立一张段表,每段都有一张页表。在一个进程中,段表只有一个,页表可能有多个。在没有快表的情况下,访问一次数据实际需要访问三次主存。
- 地址空间:二维。