操作系统之存储器管理

时间:2022-08-16 14:21:52

【计算机操作系统汤子瀛】
1.程序的装入与链接
多道环境下,要使程序运行,必须先创建进程,将程序和数据导入内存。首先编译程序将用户源代码编译成若干目标模块,由链接程序将一组目标模块及所需库函数一起链接成装入模块,最后由装入程序将装入模块装入内存。

 

2.程序装入方式(无须进行链接的单个目标模块):
  2.1绝对装入方式:适用于单道环境,按装入模块中地址,将程序和数据装入内存,装入模块装入内存后,由于程序逻辑地址和实际内存地址相同,不须对程序和数据地址修改。
  2.2可重定位装入方式:多道环境下,目标模块的起始地址通常从0开始,其他地址都相对应起始地址计算的,可采用重定位方式装入,装入模块的逻辑地址和实际装入内存的物理地址不同,把在诸装入时对目标程序中指令和数据的修改过程称为重定位,主要是逻辑地址到物理地址的映射,因为地址变换通常在装入时一次完成,以后不再改变,故称为静态重定位。
  2.3动态运行时装入方式:装入模块装入内存后,并不立即把装入模块中相对地址转换为绝对地址,而是等到程序真正运行时再转换,装入内存后的地址仍为相对地址,通常需要重定位寄存器的支持,存储物理内存的起始地址,以避免速度影响。

 

3.程序的链接方式
  3.1静态链接:程序运行之前,将各目标模块及所需库函数,链接成完整的装配模块以后不再拆开
  3.2装入时动态链接:装入内存时,边装入边链接
  3.3运行时动态链接:在程序执行中需要该(目标)模块时才对它进行连接。

 

4.连续分配方式(为用户程序分配连续内存空间):
  4.1单一连续分配:用于单用户单任务系统中
  4.2固定分区分配:最简单的可运行多道程序的存储管理方式,将内存用户空间划分为若干固定大小区域,每个分区中装入一道作业。分区大小可以相等也可不等,为便于分配,将分区建立分区使用表,各表项可以为分区起始地址,大小及状态   
  4.3动态分区分配:根据进程需要,动态分配内存空间。将会涉及:
    4.3.1数据结构:空闲分区表或空闲分区链。
    4.3.2分区分配算法:
      4.3.2.1首次适应算法:从空闲分区链链首开始查找,按照作业大小,从该分区中划出一块内存分配,余下的空闲分区仍留在空闲链中,每次从头查找,增加开销,开始部分不断被划分,会留下碎片。
      4.3.2.2循环首次适应算法:不是每次从链首查找,而是从上次找到得空闲分区下一空闲分区开始查找
      4.3.2.3最佳适应算法:分区链按大小链接,每次把满足要求,又是最小的分区分配给作业。会留下很多碎片。
    4.3.3分区分配操作:分配内存和回收内存。
  4.4 可重定位分区分配:程序执行时,真正访问的内存地址是相对地址加上重定位寄存器的起始地址得到,由于紧凑而使若干程序移动位置,只需改变寄存器值不改变程序相对地址即可。
  4.5对换:把内存中暂时不能运行的基础或程序与数据,调出到外存上,把具备运行条件的进程或进程所需程序和数据,调入内存。涉及:对换空间的管理、进程换入、进程换出。整体对换或进程对换:对换以进程为单位。页面对换或分段对换或部分对换:对换以页或段为单位,以支持虚拟存储系统。

 

5.基本分页存储管理方式(纯分页存储管理方式):连续分配会形成碎片,虽然紧凑可拼接成大块空间,但开销较大,离散分配将进程分散滴装入许多不联结的分区中,基本的分页方式不具备页面对换功能,不支持虚拟存储器功能。
  5.1页面:将进程逻辑地址空间分成若干大小页,加以编号,页面大小要适中
  5.2(物理)块或页框:将内存空间分成与页大小相同的若干存储块,加以编号。
  5.3分页地址结构:页号+页内地址
  5.4页表:将页号映射到物理块号,有时还有存取控制字段项,以对块中内容加以保护。
  5.5地址映射:设置一个页表寄存器PTR,存放页表在内存中起始地址及长度,进程未执行时,地址和长度放在本进程的PCB中,当调度到该进程时,将这两个数据装入PTR,单处理机下,只需一个PTR。变换为:将页表起始地址与页号和页表项长度乘积相加,得到物理块号,将之装入物理地址寄存器,将页内地址租入物理地址寄存器的块内地址字段中,完成转换。为了避免两次访问内存(查找物理地址和访问数据),可增设高速缓冲寄存器或联想寄存器或快表:表项可以为:页号和物理块号,
  5.6两级和多级页表:逻辑地址若大,则页表变得非常大,还要求连续,这事不现实的,解决方法:
    5.6.1采用离散分配方式解决难以找到一块连续的大内存空间问题
    5.6.2只将当前需要的部分页表调入内存,其余页表仍驻留在磁盘上,需要时调入。

 

6.基本分段存储管理方式:固定分区->动态分区->分页管理动力:提高内存利用率。分段管理目的:方便用户编程,信息以逻辑单位存储,方便有效实施信息保护和共享,有效管理段的增长,以段位单位进行动态链接。
  6.1逻辑地址:段号和段内地址,大小不同
  6.2段表:为每个段分配连续分区,进程中每个段可以离散分散在内存中,段表实现逻辑地址到物理地址的映射。为提高速度,设置段表寄存器,为避免2次访问内存,设置联想存储器。
  6.3信息共享:直接以段位单位实现共享。
可重入代码(纯代码):允许多个进程同时访问的代码,代码在执行中不能有任何改变。如需改变,另可配置数据区,以保存变化的部分,不改变共享的代码。

 

7.分页与分段区别
  7.1页是信息的物理单位,用离散方式消减内存外零头,提高内存利用率,出于系统管理需要。段是信息的逻辑单位,更好满足用户需要。
  7.2页的大小由系统固定,逻辑地址分页号和页内地址,有机器硬件实现,页面大小只有一种。段长根据信息性质划分,不固定。
  7.3分页地址空间是一维的,程序员只需利用一个记忆符,即可表示一个地址。分段的作业地址空间是二维的,既需给出段名,也要给出段内地址。

 

8.段页式存储管理方式:很好解决外部碎片、为各个分段离散分配内存,可动态链接、分段可共享、易于保护等优点
  8.1原理:将程序分段,每段分成若干页。逻辑地址:段号+段内页号+页内地址。
  8.2地址变换过程:设置一个段表寄存器,存放段表开始地址和段长,利用段表始址和段号得到段表项,从段表项中得到该段页表始址,再利用段内页号得到页表项为止,根据页表项得到物理块号,再加上页内地址构成物理地址。为避免三次访问内存(段表+页表+指令或数据),可增加高速缓冲寄存器。

 

9.虚拟存储器:具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统,建立在离散分配的存储管理基础上。逻辑容易可由内存加外存之和决定。虚拟存储系统实现方式:
  9.1分页请求系统:分页系统基础上,增加请求调页功能和页面置换功能,页面大小固定,故最常用。
  9.2分段请求系统:分段系统基础上,增加请求调段功能和分段置换功能。

 

10.虚拟存储器特征
  10.1多次性:一个作业被分成多次调入内存运行,虚拟存储器最重要特征,其他系统都不具有。
  10.2对换性:允许作业在运行过程中换进换出。
  10.3虚拟性:逻辑上扩充容量。

 

11请求分页存储管理方式:为支持虚拟存储系统,除硬件支持外,还要有页表机制、缺页中断机构、地址变换机构。
  11.1页表要增加若干项:页号+物理块号+状态位+访问字段A+修改位+外村地址
状态位:是否调入内存
访问字段A:记录被访问次数或多久未被访问,供换出页面参考
修改位M:调入内存是否被修改,必要时写入外村
外存地址:该页在外存上的地址,调页时参考。
  11.2缺页中断与一般中断区别:
    11.2.1通常,CPU在一条指令执行完后,才检查是否有中断到达,若有便去响应。缺页是在指令执行期间,所要访问指令或数据不在内存所产生处理的。
    11.2.2一条指令在执行期间,可能产生多次缺页中断,指令或数据可能横跨几个页面。
  11.3为进程分配内存时,涉及三个问题:
    11.3.1最小物理块数的确定:保证进程正常运行所需的最小物理块数。
    11.3.2物理块分配策略:
      11.3.2.1固定分区局部置换:为每个进程分配一定物理块,运行期间不再改变,若缺页,则只能从该进程内存空间中的n个页面中调出一页,调入新页,保证进程内存空间不变。
      11.3.2.2可变分配全局置换:为每个进程分配一定物理块,OS本身保持一个空闲物理块队列,缺页时,由系统从空闲物理块队列中,分配一个物理块给该进程,将缺页装入其中,直到空闲队列用完,OS才从内存中选择一页调出。
      11.3.2.3可变分配局部置换:为每个进程分配一定物理块,缺页时,只允许从该进程内存中调出一页,如果该进程频繁缺页,系统再分配附加物理块给该进程,直到缺页率可接受为止。若进程缺页率一直很低,则适当减少分配的物理块数。
  11.4物理块分配算法:
    11.4.1平均分配算法:将可供分配物理块平均分配给各个进程。
    11.4.2按比例分配算法:bi=(si/s)*m;si为进程页面数,s为页面总数,m为可用物理块总数,bi为每个进程分到的物理块数。
    11.4.3优先权分配算法:物理块分为:按比例分配和优先权分配,优先权高的多分配,以尽快完成任务。
  11.5调页策略:
    11.5.1何时调入页面:
      11.5.1.1预调页策略:预测下次可能被调入的页,一次全部调入
      11.5.1.2请求调页策略:缺页时,有OS调入所需页
    11.5.2何处调入页:请求分页系统中,外村分为文件区(采用离散分配方式)和对换区(存放对换页面,通常采用连续分配方式),调入方式:
      11.5.2.1系统拥有足够的对换区空间:全部从对换区调入页面,在进程运行前,将与进程有关文件从文件区拷入对换区
      11.5.2.2系统缺少足够的对换区空间:不会修改的文件,直接从文件调入,换出这些页面,未被修改不必换出,以后仍从文件区调入。对于可能被修改的部分,换出时,调到对换区,以后调入时,从对换区调入。
      11.5.2.3UNIX方式:与进程有关的文件放在文件区,为运行的文件从文件区调入,曾经运行过又被换出的页面,放在对换区,下次调入从对换区调入。UNIX系统支持页面共享,进程请求页面可能已调入内存,无需再调。
    11.5.3页面调入过程:缺页时,向CPU发中断,中断处理程序保留CPU环境,分析中断原因,转入中断处理程序,查找页表,找到外村物理块号,若内存能容纳新页,启动I/O将缺页调入内存,修改页表。若内存已满,换出一页,若该页已被修改,写回磁盘,再把所缺之页调入内存,修改页表项。将此表项存入快表。再利用修改后的页表,形成访问数据的物理地址,访问内存数据。

 

12页面置换算法:将页面换出
  12.1最佳置换算法:最好的性能,难于实现。置换的页是最晚被使用的
  12.2先进先出页面置换算法:置换驻留内存最久的页面,性能较差,实际有用较少。
  12.3最近最久未使用(Least Recently Used)置换算法:该算法赋予每个页面一个访问字段,记录自上次被访问以来所经历的时间,每次淘汰时间最久的。需要的硬件支持:为进程的每个页面配置一个移位寄存器,值最小的页面将被置换,或者设置一个栈,访问页面时,将该页压栈,栈低即为淘汰页。
  12.4Clock算法:LRU算法较好,但须硬件支持,实际多采用近似算法如Clock
    12.4.1简单Clock算法(Not Recently Used):为每页设置一访问位,所要页链接成循环队列,某页被访问,置为1,按FIFO依次检查,如为0换出,如为1,置0,向后继续查找,到最后仍为1,再返回队首。
  12.4.2改进型Clock算法:考虑页面使用情况和是否重写磁盘,未使用过的页和未被修改过的页即为最佳淘汰页。
  12.5最少使用置换算法(Least Frequently Used):为每个页面设置一个移位寄存器,记录该页面被访问频率。将最近使用最少的页淘汰。
  12.6页面换出算法:将淘汰页链接到两个链表中的一个,页面未被修改表和页面已被修改表,页面并不是做物理上的移动,只是在链接表中添加页面表项,已修改页面和未修改页面仍驻留在内存中。未被修改表可直接装入程序和数据。当已修改链表达到一定数后一起写入磁盘。如果这些页面以后还需访问,重新返回到进程驻留集中。