3.1 内存管理概念
-
内存管理的基本原理和要求
-
为什么要进行内存管理?
虽然内存容量在不断增长,但是仍然不可能将所有用户进程和系统所需要的全部程序与数据放入主存,于是操作系统需要对内存空间进行合理的划分和动态分配
-
内存管理的功能:
-
内存空间的分配与回收
-
地址转换
-
内存空间的扩充
-
存储保护
-
-
程序装入和链接
-
创建进程首先把程序和数据装入内存,分几个步骤:
-
编译
-
链接
-
链接方式:静态链接、装入时动态链接、运行时动态链接
-
-
装入
-
装入方式:绝对装入、可重定位装入、动态运行时装入
-
-
-
逻辑地址和物理地址:
-
逻辑地址:编译后每个目标模块都从0号单元开始编址
-
物理地址:地址转换的最终地址。
-
地址重定位:装入程序将可执行代码装入内存时,必须把逻辑地址转换为物理地址
-
-
内存保护:
-
CPU中设置上、下限寄存器,存放作业在主存中的下限和上限地址
-
用重定位寄存器(或基址寄存器)和界地址寄存器,重定位含最小的物理地址值,界地址存逻辑地址最大值。每个逻辑地址值必须小于界地址寄存器的值,未发生越界,加上重定位寄存器的值后映射成物理地址。
-
-
-
覆盖与交换:
-
用来扩充内存的两种技术
-
覆盖;用户空间分一个固定区和若干覆盖区。经常活跃的部分放固定区,其余部分按调用关系分段。先将即将要访问的调入覆盖区。
-
交换:把处于等待态的程序从内存移到辅存,把内存腾出来。把准备好竞争CPU运行的程序从辅存调到主存。
-
交换技术主要在不同进程之间,覆盖在同一个程序或进程中。
-
-
连续分配方式
-
单一连续分配:内存中永远只有一道程序,不会越界。比较简单,无外部碎片,可以采用覆盖技术,但只能用于单用户、单任务的操作系统中,有内部碎片,存储器利用率低。
-
固定分区分配:将用户内存空间划分若干固定大小的鹊羽,每个分区只装入一道作业。无外部碎片,不能实现多进程共享一个内存区,存储利用率低。
-
动态分区分配:不预先划分内存,在进程装入内存时,根据进程大小动态建立分区。动态分区分配策略:
-
首次适应,按地址递增链接,最简单且最好和最快的
-
最佳适应,按容量递增链接
-
最坏适用:按容量递减
-
邻近适应
-
-
-
非连续分配管理方式
允许一个程序分散地装入不相邻的内存分区。按分区大小是否固定,分分页和分段:
-
基本分页存储管理方式
-
思想:主存划分若干大小相同且固定的块,作为主存的基本单位。每个进程也以块为单位进行划分,进程执行时,以块为单位逐个申请主存中的快空间
-
概念:
-
页面和页面大小:进程中的块称页,内存中的块称页框,外存直接称块。
-
地址结构:页号P+页内偏移量W,长32位。
-
页表:很多页表项的集合。页号+物理内存中的块号
-
页表项的第二部分和地址的第二部分共同构成物理地址
-
-
基本地址变化机构
在系统中设置页表寄存器,存放页表在内存的始址F和页表长度M。设页面大小L,逻辑地址A到物理地址E的变换过程如下:(逻辑地址,页号,每页长度都是十进制)
-
计算页号P(P=A/L)和页内偏移量W(W=A%L)
-
比较页号P和页表长度M,若P>=M,产生越界,否则继续
-
页表中页号P对应的页表项地址=页表始址F+页号P*页表项长度,取出该页表项内容b,即物理块号
-
计算E=b*L+W,即为物理地址
-
-
具有快表的地址变换机构
若页表全部放在内存中,存取一个数据访存2次,第一次访问页表,第二次访问数据。有点慢,于是在地址变换机构中增设一个具有并行查找能力的cache——快表(TLB),存放当前访问的若干页表项,加速地址转换。
-
两级页表
-
-
基本分段存储管理方式
分页是从计算机的角度考虑设计,目的是提高内存的利用率,提升计算机性能;分页通过硬件实现,对用户完全透明。分段是考虑用户和程序员而提出。
-
分段:按用户进程中的自然段划分逻辑空间,逻辑地址:段号S与段内偏移量W
-
段表:进程有自己的一张逻辑空间与内存空间映射的段表,每个段表项对应进程一段,记录该段在内存中的起始地址和长度。段表:段号+段长+本段在内存中地址
-
地址转换机构:设置段表寄存器,存段表始址F和段表长度M
-
段的共享与保护
-
-
段页式管理方式
-
作业的地址空间被分成若干逻辑段,每段有自己的段号,然后将段分成若干固定大小的页。
-
作业的逻辑地址:段号S+页号P+页内偏移量W
-
-
3.2 虚拟内存管理
-
虚拟内存的基本概念:
-
传统存储管理方式的特征:前面所述内存管理策略都是为了同时将多个进程保存在内存中,以便多道程序设计。特征:一次性(作业一次性装入内存才能运行)、驻留性(除非进程运行结束,否则作业一直驻留在内存中)
-
局部性原理:
-
时间局部性:执行过的指令、访问过的数据不久后又继续执行
-
空间局部性:访问某个存储单元,该存储单元附近的单元也会被访问。
-
-
虚拟存储器的定义和特征
-
定义:程序装入时,先将一部分装入内存,程序就可以执行。在运行过程中,所访问信息不在内存中时,由OS调入内存,继续执行程序。另一方面,将内存中暂时不使用的内容换到外存上,腾出空间。这样,系统好像提供了一个比实际内存大得多的存储器。
-
特征:
-
多次性
-
对换性
-
虚拟性
-
-
-
虚拟内存技术的实现
虚拟内存的实现建立在离散分配的内存管理方式的基础上。实现方式如下:
-
请求分页
-
请求分段
-
请求段页式
不管哪种,需要以下硬件支持:
-
一定容量的内外存
-
页表机制
-
中断机构
-
地址变换机构
-
-
-
请求分页管理方式
请求分页建立在基本分页系统基础上,为支持虚拟存储器增加了请求调页功能和页面置换功能。
-
页表机制
-
请求分页中的页表项:
页号 物理块号 状态位P(是否已调入内存) 访问字段A(记录访问次数) 修改位M 外存地址
-
缺页中断机构
当所访问的页面不在内存中时,产生一个缺页中断,请求OS调入页面。此时将缺页的进程阻塞,若内存有空闲块,则分配块,将页面装入,并修改页表中的页表项。若没有,按淘汰算法淘汰某页、
-
地址变换机构
-
-
-
页面置换算法
选择调出页面的算法叫做页面置换算法。
-
最佳置换算法(OPT)
被淘汰的页面是以后永不使用的页面,或是最长时间内不再被访问的页面,以便保证获得最低的缺页率。然而该算法无法实现,因为无法预知进程的若干页面哪个未来最长时间不被访问。
-
先进先出(FIFO)
优先淘汰最先进入内存的页面。FIFO算法会产生所分配的物理块数增大而页故障树不增反减的现象,此现象叫做Belady异常。
-
最近最久未使用(LRU)
选择最近最久未访问过的页面予以淘汰。该算法为每个页面设置一个访问字段,记录页面自上次被访问以来所经历的时间,淘汰页面时选择现有页面中值最大的淘汰。
-
时钟(CLOCK),最近未用算法(NRU)
给每帧关联一个使用位。当某页首次装入主存时,将该帧的使用位设置为1;当该页随后再被访问到时,使用位也被置1。对页替换算法,用于替换的候选帧集合视为一个循环缓冲区。当需替换一页时,顺序扫描循环缓冲区,查找使用位为0的帧,遇到使用位为1的帧重新置为0.
-
-
页面分配策略
-
驻留集大小:给一个进程分配的物理页框的大小就是这个进程的驻留集,策略如下:
-
固定分配局部置换
-
可变分配全局置换
-
可变分配局部置换
-
-
调入页面的时机
-
预调页策略:一次调入若干相邻的页比一次调入一页更高效
-
请求调页策略:
-
-
从何处调入页面
-
系统拥有足够的兑换区空间,可以全部从对换区调入所需页面,提高调页速度。
-
系统缺少足够的对换区空间。对可能修改的部分调入对换区,不变的页面直接从文件调入。
-
UNIX方式,与进程有关的文件放在文件夹。
-
-
-
抖动
刚刚被换出的页面又要换入主存,刚刚换入的页面马上又要换出主存。
-
工作集
某段时间间隔内,进程要访问的页面集合。可以用最近访问过的页面来确定工作集。工作集反映了进程在接下来的一段时间内很可能会频繁访问的页面集合。