内存管理
内存管理的功能
- 内存的分配和回收
- 地址变换
- 扩充内存
- 存储保护
应用程序的编译、链接与装入
- 从源程序到执行的进程,经历了编译、链接、装入3个步骤
- 地址转换将逻辑地址转换为物理地址,这个过程叫做重定位
- 程序的链接有3种方式:静态链接、装入时动态链接
- 程序的装入也有3种方式:绝对装入、可重定位装入、动态运行装入
物理地址和逻辑地址
- 逻辑地址是指由程序产生的与段(与页无关,因为只有段对用户可见)相关的偏移地址部分
物理地址是指出现在CPU外部地址总线上的寻址物理内存的地址信号,是逻辑地址变换后的最终结果地址,物理地址空间是指内存中物理地址单元的集合
内存保护
内存保护是为了防止一个作业有意或无意地破坏操作系统或其他作业。常用的存储保护方法有界限寄存器方法和存储保护键方法。
界限寄存器方法:有两种,分别是上、下界寄存器方法和基址和限长寄存器方法。上、下界寄存器方法采用上、下界寄存器分别存放作业的结束地址和开始地址。在作业运行过程中,将每一个访问内存的地址都同这两个寄存器内容进行比较,如超出范围便产生保护性中断;基址和限长寄存器方法采用基址和限长寄存器分别存放作业的起始地址及作业的地址空间长度。当作业执行时,将每一个访问内存的相对地址和现场寄存器比较,如果超过了限长寄存器的值,则发出越界中断信号,并停止作业的运行
- 存储保护键方法:存储保护键方法是给每个存储块分配一个单独的保护键,它相当于一把“锁”。此外,进入系统的每个作业也被赋予一个保护键,它相当于一把“钥匙”。当作业运行时,检查“钥匙”和“锁”是否匹配,如果二者不匹配,则系统发出保护性中断信号,停止作业运行。
覆盖技术
- 基本概念:把一个大的程序划分为一系列覆盖,每个覆盖是一个相对独立的程序单位。把程序执行时并不要求同时装入内存的覆盖组成一组,称为覆盖段;这个覆盖段分配到同一个存储区域,这个存储区域称为覆盖区,它与覆盖段一一对应。
- 特点:打破了必须将一个进程的全部信息装入主存后才能运行的限制。但当同时执行程序的代码量超过主存时,程序仍然不能运行。
交换技术
- 基本概念:暂时不用的某个程序及数据部分(或全部)从内存移到外存中,以便腾出必要的内存空间;或把指定的程序或数据从外存读到相应的内存中,并将控制权转给它,让其在系统上运行的一种内存扩充技术。处理器三级调度中的中级调度就是采用了交换技术。
- 特点:交换技术的特点是打破了一个程序一旦进入主存便一直运行到结束的限制。但运行的进程大小仍然受实际主存的限制。
单一连续分配
- 基本概念:单一连续分配是一种最简单的存储管理方式,通常只能用于单用户、单任务的操作系统中。这种存储管理方式将内存分为两个连续存储区域,其中的一个存储区域固定地分配给操作系统使用,通常放在内存低地址部分,另一个存储区域给用户作业使用。
- 技术采用:单一连续分配方式采用静态分配,适合单道程序,可采用覆盖技术。作业一旦进入内存,就要等到其结束后才能释放内存。因此,这种分配方式不支持虚拟存储器的实现,无法实现多道程序共享主存。
- 优点:管理简单,只需要很少的软件和硬件支持,且便于用户了解和使用,不存在其他用户干扰的问题。
- 缺点:是只能用于单用户、单任务的操作系统,内存中只装入一道作业运行,从而导致各类资源的利用率都很低。单一连续分配会产生内部碎片。
固定分区分配
- 基本概念:固定分区分配(也称为固定分区存储管理)方法是最早使用的一种可运行多道程序的存储管理方法,它将内存空间划分为若干个固定大小的分区,每个分区中可以装入一道程序;
- 技术采用:固定分区分配中,程序通常采用静态重定位方式装入内存;
- 分区大小可以相等也可以不相等:
- 分区大小相等:缺乏灵活性,造成内存空间的浪费,当程序太大时,一个分区又不足以装入该程序,导致程序无法运行;
- 分区大小不相等:可把内存区划分成含有多个较小的分区、适量的中等分区及少量的大分区。可根据程序的大小为之分配适合的分区;
- 优点:可用于多道程序系统最简单的存储分配;
- 缺点:不能实现多进程共享一个主存区,利用率较低,会产生内部碎片。
动态分区分配
- 基本概念:动态分区分配又称为可变式分区分配,是一种动态划分存储器的分区方法。这种分配方法并不事先将主存划分成一块块的分区,而是在作业进入主存时,根据作业的大小动态地建立分区,并使分区的大小正好满足作业的需要。因此,系统中分区的大小是可变的,分区的数目也是可变的。
- 分区分配算法:主要有以下四种,分别是首次适应算法、下次适应算法、最佳适应算法、最差适应算法;
- 优点:实现了多道程序共用主存;管理方案相对简单;实现存储保护的手段比较简单。
- 缺点:主存利用不够充分,存在外部碎片;无法实现多进程共享存储器信息;无法实现主存的扩充,进程地址空间受实际存储空间的限制。
内部碎片与外部碎片
- 内存碎片:分配给进程的分区中未被利用的碎片称为内部碎片;
- 外部碎片:而系统中剩余的无法利用的小块存储空间称为外部碎片。
基本分页存储管理方式
- 分页原理:在分页存储管理中,用户作业的地址空间被划分成若干个大小相等的区域,称为页或页面。相应地,将主存的存储空间也分成与页面大小相等的区域,称为块或物理块。在为作业分配存储空间时,总是以块为单位来分配,可以将作业中的任意一页放到主存的任意一块中。
- 页表:为了将逻辑地址上连续的页号映射到物理内存中后成为离散分布的多个物理块,需要将每个页面和每个物理块一一对应,这种映射关系就体现在页表上。页表通常存放在内存中。
- 基本地址变换机构:可将逻辑地址变为物理地址,整个地址变换过程都是由硬件自动完成的。
- 具有快表的地址变换机构:为了提高地址变换的速度,可以在地址变换机构中增设一个具有并行查找功能的高度缓冲存储器(又称联想存储器或快表),将部分页表项放在这个高速缓冲存储器中。
- 基本分页存储管理方式的优缺点:
- 优点:①内存利用率高;②实现了离散分配;③便于存储访问控制;④无外部碎片。
- 缺点:①需要硬件支持(尤其是快表);②内存访问效率下降;③共享困难;④内部碎片。
页表
- 每个进程的PCB中都有自己的页表
- 在标准32位系统中,页表可能占用4M的内存
- 如果使用链表式的页表会导致查页表的时间长
- 所以引入多级页表
- 地址的前10位是页目录
- 中间10位是页号
- 其他位是偏移量
- 使用多级页表可以大幅度降低存储空间的损耗,一个页目录中的空项占位,可以节省这个目录项对应的所有页表项的空间
很多64位系统采用倒排页表,节省了空间,增加了查询时间.可以使用TLB缓解
TLB
TLB是快表,是CPU内部的寄存器,因为程序的地址访问具有局部性,所以使用TLB在寄存器中记录最近访问的页表项可以增加速度.
基本分段存储管理方式
- 分段原理:在分段存储管理系统中,作业的地址空间由若干个逻辑分段组成,每个分段是一组逻辑意义上相对完整的信息集合,每个分段都有自己的名字,每个分段都从始编址,并采用一段连续的地址空间。因此,整个作业的地址空间是二维的(段的分类是一维,段内位移是另一维)。分段存储管理中以段为单位分配内存,每段分配一个连续的内存区,但各段之间不要求连续。
- 段的共享与保护
- 共享:使多个作业的段表中相应表项都指向被共享段的同一个物理副本来实现的。可重入代码(不能修改的数据)和不能修改的数据是可以共享的,而可修改的程序和数据则不能共享;
- 保护:地址越界保护和访问控制保护。
- 优点:①便于程序模块化处理和处理变换的数据结构;②便于动态链接和共享;③无内部碎片。
- 缺点:①与分页类似,需要硬件支持;②为满足分段的动态增长和减少外部碎片,要采用拼接技术;③分段的最大尺寸受到主存可用空间的限制;④有外部碎片。
基本段页式存储管理方式
- 逻辑地址结构:段页式存储管理系统的逻辑地址结构包含分:段号* 段内页号* 页内位移*
- 与页式的碎片比较:页式存储管理方式下平均一个程序有半页碎片,而段页式存储管理方式下平均一段就有半页碎片,而一个程序往往有很多段,所以平均下来段页式的内部碎片比页式要多。
虚拟内存
虚拟内存的引入原因
前面的方法都具有如下两个特点:一次性(作业全部装入内存后才能执行)和驻留性(作业常驻内存直到运行结束)。它们均难以满足较大的作业或者较多的作业进入内存执行。因此,引入了一种能够让作业部分装入就可以运行的存储管理技术,即虚拟内存管理技术。
局部性原理
- 时间局部性:即一条指令的一次执行和下次执行,一个数据的一次访问和下次访问,都集中在一个较短的时期内。
- 空间局部性:即当前指令和邻近的几条指令,当前访问的数据和邻近的数据,都集中在一个较小的区域内。
虚拟内存的定义及特征
- 基本原理:基于局部性原理,将程序一部分装入就开始运行,需要某部分时就将它调入内存,不需要时再调出内存。
- 基本特征:离散型,即程序在内存中离散存储;多次性,即一个作业可以分成多次调入内存;对换性,作业在运行过程中可以换入、换出;虚拟性,从逻辑上扩充内存容量,用户可以使用的空间可以远大于实际内存容量。
请求分页原理
- 基本概念:在分页存储管理系统的基础上,增加请求调页功能、页面置换功能所形成的一种虚拟存储系统。在请求分页存储管理中,作业运行之前,只要将当前需要的一部分页面装入主存,便可以启动作业运行。在作业运行过程中,若所要访问的页面不在主存中,则通过调页功能将其调入,同时还可以通过置换功能将暂时不用的页面置换到外存上,以便腾出内存空间。
- 理解方式:请求分页=基本分页+请求调页功能+页面置换功能。
请求分页管理方式的优缺点
- 优点:可以离散储存程序,降低了碎片数量;提供虚拟存储器,提高了主存利用率,有利于多道程序运行,方便用户。
- 缺点:必须有硬件支持;有些情况下系统会产生抖动现象;程序最后一页仍然存在未被利用的部分空间。
最佳置换(OPT)算法
在预知一个进程的页面号引用串的情况下,每次都淘汰以后不再使用的或以后最迟再被使用的页面,这种算法就是最佳置换算法
先进先出(FIFO)算法
FIFO算法是最简单的页面置换算法,每次总是淘汰最先进入内存的页面,也就是淘汰在内存驻留时间最长的页面。
最近最少使用(LRU)算法
选择最近最长时间没有被使用的页面予以淘汰,其思想是用以前的页面引用情况来预测将来会出现的页面引用情况,也就是假设一个页面刚被访问,那么不久该页面还会被访问。即最佳置换算法是“向后看”,而LRU算法则是“向前看”。
LRU理论上有两种实现
- 给每个页计数,但是如果运行时间太长的话,页面的计数会溢出,而且每次访问一个地址都要去更新计数的话代价太大
- 使用访问栈,但是如果栈满了之后,每次入栈需要丢弃栈底的元素,可能需要大量的数组元素移位操作,或者链表指针操作
时钟置换(CLOCK)算法
- 时钟置换(CLOCK)算法也称为最近未使用算法(NRU),是LRU和FIFO的折中。作为LRU的近似算法,CLOCK算法给每个页面设置一个访问位,用以标识该页最近有没有被访问过。CLOCK维护一个内存中所有页面的循环链表,当程序需要访问链表中存在的页面时,该页面的访问位就被置位为0否则,若程序要访问的页面没有在链表中,那就需要淘汰一个内存中的页面,于是一个指针就从上次被淘汰页面的下一个位置开始顺序地去遍历这个循环链表,当这个指针指向的页面的访问位为1,就把该访问位清零,指针再向下移动,当指针指向的页面的访问位为0,就选择淘汰掉这一页面,若遍历了一遍链表仍没找到可以淘汰的页面,那么就继续遍历下去。
- 改进型CLOCK算法,它考虑了页面载入内存后是否被修改的问题,增加了修改位。在访问位同为0进程间优先淘汰没有修改过的页面,因为没有修改过的页面可以被直接淘汰掉,而修改过的页面需要写回到外存中。与简单CLOCK算法相比,该算法可减少磁盘I/O次数,但会增加扫描次数。
- 再次改进型CLOCK算法,它考虑了页面被载入内存后长时间没有缺页中断的
其他页面置换算法
最不常用置换(LFU)算法:选择到当前时间为止访问次数最少的页面淘汰。该算法要求为每页设置一个访问计数器,每当页面被访问时,该页的访问计数器加##发生缺页中断时,淘汰计数值最小的页面,并将所有计数器清零。
工作集理论
- 引入:工作集是基于局部性原理的假设的。如果能预知程序在某段时间间隔内要访问哪些页面,并能提前将它们调入内存,将会大大降低缺页率,从而减少置换工作,提高* * 用率
- 定义:工作集是最近* 内存访问的页面的集合,数字* 称为工作集窗口,也就是工作集的大小。
- 原理:让操作系统监视各个工作集的大小,若有空闲的物理块,则可以再调一个进程到内存以增加多道的程度;若工作集的大小总和增加超过了所有可用物理块的数量总和,那么操作系统可以选择一个内存中的进程对换到磁盘中去,以减少内存中的进程数量来防止抖动的发生。
页面分配策略
- 固定分配局部置换:为每个进程分配一定数目的物理块,这个数目是确定的,进程运行期间都不会改变。
- 可变分配全局置换:操作系统维护一个空闲物理块队列,每次有进程缺页时都从空闲物理块队列上取下一个分配给它,若系统中已经没有空闲的物理块了,那么系统将有可能调出任何进程中的其中一页。
页面调入策略
- 请求调页策略:一个页面只有在被用到时才被调入到内存中,否则就放在外存中。这种调页方式容易产生较多的缺页中断,时间开销大,容易产生抖动现象。
- 预调页策略:是指将预计不久之后会被用到的页面一并调入到内存,尽管暂时它们还没被用到。这是一种基于局部性原理的预测,通常用于程序的首次调入。
从何处调入页面
系统拥有足够的对换区空间:这时可以全部从对换区调入所需页面,以提高调页速度。
系统缺少足够的对换区空间:这时凡是不会被修改的文件,都直接从文件区调入;而当置换出这些页面时,由于它们未被修改而不必再将它们换出,以后再调入时,仍从文件区直接调入。但对于那些可能被修改的部分,在将它们换出时,便需调到对换区,以后需要时再从对换区调入。
方式:由于与进程有关的文件都放在文件区,因此凡是未运行过的页面都应从文件区调入。而对于曾经运行过但又被换出的页面,由于是被放在对换区,因此在下次调入时,应从对换区调入。
Belady异常
- 定义:FIFO置换算法的缺页率可能会随着所分配的物理块数的增加而增加,这种奇怪的现象就是Belady 异常。
- 原因:FIFO算法的置换特征与进程访问内存的动态特征相矛盾,即被置换的页面并不是进程不会访问的。
- 注意:FIFO法和最佳置换算法永远不会出现Belady异常,被归类为堆栈算法的页面置换算法也不可能出现Belady异常。
抖动现象
定义:若选用的页面置换算法不合适,可能会出现抖动现象:刚被淘汰的页面,过后不久又要访问,并且调入不久后又调出,如此反复,使得系统把大部分时间用在了页面的调入调出上,而几乎不能完成任何有效的工作,这种现象称为抖动(或颠簸)。
原因:在请求分页系统中每个进程只能分配到所需全部内存空间的一部分。
缺页率
- 定义:假定一个作业共有* ,系统分配给该作业m的空间m<=n。如果该作业在运行中共需要访问* 页面(即引用串长度为* ,其中所要访问页面不在内存,需要将所需页调入内存的次数为F 则缺页率定义为f=F/A命中率即为1-f
- 缺页率会受置换算法、分配的页面数量、页面大小等因素的影响。
- 缺页率对于请求分页管理系统是很重要的,如果缺页率过高,会直接导致读取页面的平均时间增加,会使进程执行速度显著降低。因此,如何降低缺页率是一项非常重要的工作
地址进制之间的转换
通常题目给出的地址形式分为两种:十进制与其他进制(通常是十六进制、八进制或二进制)。当题目中给出的地址是十进制时,通常地址是不会特别说明或者不带后缀的,例如“访问7105号单元”;而当给出的地址是其他进制时,通常会特别说明或者用符号后缀,十六进制、八进制与二进制对应的后缀分别为字母H、O、B,例如“访问1A79H号单元”就是十六进制地址,其中字母H表示该地址是以十六进制给出的。而在答题过程中,通常会进行进制之间的转换,在转换之后可以将转换后的地址加括号并加注下标来表明转换后的进制,例如将17ACH(十六进制)转化为二进制,则可以表示为17A* = 17A* = 00* 01* 10* 1100
逻辑地址转换为物理地址的过程
- 将其他进制转化为二进制,方便处理。
- 求出页号,页号为逻辑地址与页面大小的商,二进制下为地址高位。
- 求出页内位移,页内位移为逻辑地址与页面大小的余数,二进制下为地址低位。
- 根据题意产生页表,通过查找页表得到对应页的内存块号或页框号(页框号为把物理块地址除去页内位移若干位后剩下的地址高位,也可以简单理解为“物理地址的页号”)。
- 如果给出的是内存块号,则用内存块号乘以块大小,加上基址,再加上页内位移得到 物理地址(给出这种条件的题目通常会给出物理地址的基址或者起始地址)。
- 如果给出的是页框号,则用页框号与页内位移进行拼接(页框号依然是高位,页内位移是低位,与逻辑地址的页号和页内位移构成类似),得到物理地址。
- 将二进制表示的物理地址根据题目要求转换为十六进制或者十进制。
一次地址访问的过程
首先程序内部的地址访问通过分段查LDT表项,得到虚拟地址,虚拟地址通过MMU查页表转换为物理地址