操作系统之存储器管理导论

4.1 存储器的层次结构

最基本的三层结构
在这里插入图片描述
现代计算机主流存储器的层次结构
在这里插入图片描述

4.2 程序的装入和链接

先导知识

将用户源程序变为可在内存中执行的程序的步骤:

  • 编译:由编译程序将用户源代码编译成若干个目标模块
  • 链接:由链接程序将编译后形成的一组目标模块,以及它们所需要的库函数链接在一起,形成一个完整的装入模块
  • 装入:由装入程序将装入模块装入内存,构造PCB,形成进程(使用物理地址)
  • 在多道程序环境下,要使程序运行,必须为之先建立进程。创建进程的第一件事是将程序和数据装入内存

用户程序的主要处理阶段

在这里插入图片描述

  • 1、编辑阶段(形成符号空间)
  • 2、编译阶段(生成目标代码)
  • 3、链接阶段(确定相对地址)
    将编译后一组目标模块以及它们所需的库函数装配成一个完整的装入模块。
  • 4、装入阶段(可以确定物理地址)
    将装入模块放入分到的内存区中。这时需要进行地址重定位。
  • 5、运行阶段(可以确定物理地址)
    运行可执行的程序file1.exe。

逻辑地址、物理地址和地址映射

  • 逻辑地址(相对地址,虚地址):用户程序经过编译链接后形成的以0为基址的地址
    • 不能用逻辑地址在内存中读取信息。
  • 物理地址(绝对地址,实地址):内存中存储单元的地址。物理地址可直接寻址
  • 地址映射:将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址。

重定位

  • 重定位:把程序中的逻辑地址变成内存中的物理地址的过程叫做重定位。
  • 静态重定位:在程序执行之前进行,由专门设计的重定位装配程序完成。
  • 动态重定位:在程序执行过程中,每次访问内存之前将程序地址变换为内存地址,这种变换是依靠硬件地址变换机构实现的

4.2.1程序的装入

三种方式:
绝对装入方式(单道)
静态重定位装入方式(不灵活,不支持挂起)
动态重定位装入方式(灵活)
一个无须进行链接的单个目标模块的装入过程。此时目标模块就是装入模块

1、绝对装入方式

  • 在编译时,如果知道程序驻留在内存的什么位置,那么编译程序将产生绝对地址的目标代码。
  • 程序中的逻辑地址与实际内存地址完全相同,无需对程序和数据的地址进行变换。
  • 优点:装入过程简单。
  • 缺点:过于依赖硬件结构,不便多道程序系统。

2、静态重定位装入方式

  • 在多道程序环境下,目标模块的起始地址通常从0开始,程序中的其它地址都是相对于起始地址计算的;
  • 因此应采用可重定位装入方式,根据内存的实际情况,将装入模块装入到内存的适当位置。
    在这里插入图片描述
  • 在程序执行之前由专门设计的重定位装配程序一次性实现逻辑地址到物理地址的转换.
  • 优点:不需硬件支持,可以装入多道程序。
  • 缺点:一个程序通常需要占用连续的内存空间; 程序装入内存后不能移动(不支持挂起)。

3、动态重定位装入方式

  • 程序装入内存后,并不立即实施地址变换,而是把这种地址转换推迟到程序真正运行时才进行
  • 装入内存后仍是相对地址;
  • 应设置一个重定位寄存器
    在这里插入图片描述
    在这里插入图片描述
  • 在程序执行过程中,每次访问内存之前将程序地址变换为内存地址,这种变换是依靠硬件地址变换机构实现的
  • 优点:
    OS可以将一个程序分散存放于不连续的内存空间,可以移动程序
  • 缺点:需要硬件支持,OS实现较复杂。
    是虚拟存储的基础。

4.2.2程序的链接

静态链接

  • 在程序装入内存之前,将目标模块及所需的库函数链接成一个完整的装配模块,以后不再拆开。
    • 静态链接是在生成可执行文件时进行的。
    • 事先进行链接,以后不再拆开
      在这里插入图片描述

动态链接

装入时动态链接

  • 指将用户源程序编译后所得的一组目标模块,在装入内存时,采用边装入边链接的链接方式。
    • 优点:
      (1) 便于模块的修改和更新;
      (2) 便于实现对目标模块的共享。

运行时动态链接

  • 指对某些目标模块的链接,是在程序执行中需要该目标模块时,才对它进行链接
    • 优点:
      加快装入过程、节省内存空间

基本内存分配方案

在这里插入图片描述

4.3 连续分配存储管理方式

连续分配方式,是指为一个用户程序分配一个连续的内存空间。

4.3.1单一连续分配

  • 内存分为两个区域:系统区,用户区。应用程序装入到用户区,可使用用户区全部空间。
  • 最简单,适用于单用户、单任务的OS。
  • 优点:易于管理。
  • 缺点:
    对要求内存空间少的程序,造成内存浪费;
    程序全部装入,很少使用的程序部分也占用内存

4.3.2固定分区分配

1、基本原理及技术

  • 系统提前把内存分为一些大小相等或不等的分区(partition),每个进程占用一个分区。操作系统占用其中一个分区。
  • 特点:适用于多道程序系统和分时系统
    • 支持多个程序并发执行
  • 问题:可能存在内碎片
    • 内碎片:分区之内未被利用的空间
    • 外碎片:分区之间难以利用的空闲分区(通常是小空闲分区)。

2、划分分区的方法

  • 分区大小相等:只适合于多个相同程序的并发执行(处理多个类型相同的对象)。缺乏灵活性。
  • 分区大小不等:多个小分区、适量的中等分区、少量的大分区。根据程序的大小,分配当前空闲的、适当大小的分区。
    在这里插入图片描述
  • 优点:易于实现,开销小。
  • 缺点
    • 内碎片造成浪费
    • 分区总数固定,限制了并发执行的程序数目。
  • 可以和覆盖、交换技术配合使用。
  • 采用的数据结构:分区表-记录分区的大小和使用情况
    在这里插入图片描述
  • 当有一用户程序要装入时,由内存分配程序检索该表;
  • 从中找出一个能满足要求的、尚未分配的分区;
  • 将之分配给该程序,然后将该表项中的状态置为“已分配”;
  • 若未找到大小足够的分区,则拒绝为该用户程序分配内存。

4.3.3动态分区分配

  • 动态创建分区:
    • 在装入程序时按其初始要求分配;
    • 或在其执行过程中通过系统调用进行分配或改变分区大小。
  • 优点:没有内碎片。
  • 缺点:有外碎片;
  • 动态分区分配是根据进程的实际需要,动态地为之分配内存空间。
  • 在实现过程中涉及三个问题:
    • 分区分配中的数据结构
    • 分区分配算法
    • 分区分配操作

1、分区分配中的数据结构

  • 空闲分区表
    记录每个空闲分区的情况。每个空闲分区占一个表目,表目中包括分区序号、分区始址及分区的大小等数据项。
  • 空闲分区链:
    在这里插入图片描述

2、常用的分配算法

  • 基于顺序搜索的分区分配算法:
    • (1) 首次适应算法FF(First Fit)
    • (2) 循环首次适应算法NF(Next Fit)
    • (3) 最佳适应算法BF(Best Fit)
    • (4) 最差适应算法WF(Worst Fit)

首次适应算法FF(First Fit)

(最先匹配法(first-fit))首址递增排列。
在这里插入图片描述

  • 优点:优先利用内存低址部分。
  • 缺点:低址部分不断划分,产生小碎片;每次查找从低址部分开始,增加了查找的开销。

循环首次适应算法NF(Next Fit)

(下次匹配法(next-fit))

  • 为实现算法,需要:
    设置一起始查寻指针
    采用循环查找方式

  • 优点:使内存空闲分区分布均匀,减少查找的开销

  • 缺点:缺乏大的空闲分区

最佳适应算法(best-fit)

(最佳匹配法(best-fit) )

  • 空闲区按大小递增排列!
    缺点:产生许多难以利用的小空闲区(外碎片)

最差适应算法(worst-fit)

(最坏匹配法(worst-fit) )

  • 空闲区按大小递减排列!
    • 不会留下太多的小空闲分区;
    • 但较大的空闲分区不被保留。

分配算法对比

  • 首次适应算法
    • 将地址最小的够用的空间分配出去
  • 下次适应算法
    • 从上次分配位置开始搜索
    • 将地址最小的够用的空间分配出去
  • 最佳适应算法
    • 将够用的长度最小的空间分配出去
  • 最差适应算法
    • 将够用的长度最大的空间分配出去
      在这里插入图片描述

3、分区分配操作

  • 分配内存
  • 设请求的分区大小为u.size,
  • 表中每个空闲分区的大小表示为m.size,
  • 若m.size- u.size≤size(最小阈值),
  • 整个分区分配给请求者,
  • 否则从分区中按请求的大小划出一块内存空间分配,
  • 余下部分留在空闲链中,将分配区首址返回给调用者。
    在这里插入图片描述

4、回收内存(四种情况)

  • 当进程运行完毕释放内存时,系统根据回收区首址,在空闲分区链(表)中找到相应插入点;
  • 此时可能有四种情况:
    在这里插入图片描述
    • (1) 回收区与插入点的前一个分区F1邻接:将回收区与F1合并,修改F1的表项的分区大小
    • (2) 回收区与插入点的后一个分区F2邻接:将回收区与F2合并,修改F2的表项的首址、分区大小
    • (3) 回收区与插入点的前后两个分区F1、F2邻接:将三个分区合并,使用F1的表项和F1的首址,取消F2的表项,大小为三者之和
    • (4) 回收区既不与F1邻接,又不与F2邻接:为回收区单独建立新表项,填写回收区的首址与大小,根据其首址插到空闲链中的适当位置

5、基于索引搜索的分区分配算法

当系统很大时,系统中的内存分区可能会很多,相应的空闲分区表或链就可能很长,这时采用顺序搜索分区方法可能会很慢。

★快速适应算法:

将空闲分区,按其容量大小,进行分类,对于每一类的所有空闲分区,单独设立一个空闲分区链表

★伙伴系统:

分区大小均为2的k次幂,将空闲分区按分区的大小进行分类,并单独设立一个空闲分区双向链表

  • 伙伴的定义
    满足以下三个条件的称为伙伴:
    • 1)两个块大小相同
    • 2)两个块地址连续
    • 3)两个块必须是同一个大块中分离出来的;
  • 一种经典的内存分配方案
  • 主要思想:将内存按2的幂进行划分,组成若干空闲块链表;查找该链表找到能满足进程需求的最佳匹配块。
  • 算法:
    • 首先将整个可用空间看作一块: 2U
    • 假设进程申请的空间大小为 s,如果满足
    • 2U-1 < s <= 2U,则分配整个块
    • 否则,将块划分为两个大小相等的伙伴,大小为2U-1
    • 一直划分下去直到产生大于或等于 s 的最小块
  • 分配算法
    当用户申请大小为n的内存请求,在可利用空闲表上寻找结点大小与n相匹配的表
    • 表非空,分配表中第一个内存块
    • 表空,从更大的非空表中查找,直到找到一个空闲块,切割出所需要大小的块
    • 未分配部分,插入到相应的空闲表中
  • 回收算法
    判断伙伴是否为空闲块(回收算法需了解释放的块大小)
    • 否,将释放的空闲块插入到相应表中;
    • 是,找到伙伴,伙伴出队,合并
    • 合并后,判断合并后的块的伙伴是否是空闲块,如果是,继续合并成更大的块。依次重复,直到归并后的块的伙伴不空闲。再插入到相应的空闲块表中。
  • 分析
    • 可以很快找到空闲块;
    • 避免了外碎片问题;
    • 申请内存总是以2n字节满足要求,存在内碎片; 例如:申请130字节,会分得256字节; 申请1514字节,会分得2048字节
    • 申请/释放可能会导致连续切块/合并,影响系统效率;例如:
      • 当前只有一块空闲,块大小1M, 最小分配单位32B;
      • 现申请40字节:
    • 会导致14次切块,用完立即归还,导致14次合并
    • 如果程序循环式申请40字节,然后归还内存,会导致系统频繁忙碌。

哈希算法

构造一张以空闲分区大小为关键字的哈希表,该表的每一个表项记录了一个对应的空闲分区链表表头指针。

4.3.4动态重定位分区分配

1. 动态重定位的引入

  • 解决碎片:将内存中的所有作业进行移动,使它们全部邻接,这样可把原来分散的小分区拼接成大分区,这种方法称为“拼接”或“紧凑”。
  • 缺点:用户程序在内存中的地址发生变化,必须重定位
    在这里插入图片描述
  • 紧缩技术
    • 内存紧缩(compaction):将各个占用分区向内存一端移动。使各个空闲分区聚集在另一端,然后将各个空闲分区合并成为一个空闲分区。
      • 优点:消除外碎片
      • 缺点:对占用分区进行内存数据搬移占用CPU时间;重定位需要硬件支持
      • 紧缩时机:每个分区释放后;内存分配找不到满足条件的空闲分区时

2、动态重定位的实现

在这里插入图片描述
地址变换过程是在程序执行过程期间,随着对每条指令的访问自动进行的,称为动态重定位。
在这里插入图片描述

  • 可重定位分区分配方式主要特点
    • 可以充分利用存储区中的“零头/碎片”,提高主存的利用率
    • 但拼接/紧缩会使系统开销加大

4.4 对换(Swapping)

多道程序环境下存在的问题:

  • 阻塞进程占据大量内存空间
  • 许多作业在外存而不能进入内存运行

对换定义

所谓“对换”,是指把内存中暂时不能运行的进程或者暂时不用的程序和数据,调到外存上,以便腾出足够的内存空间,再把已具备运行条件的程序和数据,调入内存。

  • 分类:
    • 整体对换(或进程对换):以整个进程为单位
    • 页面对换或分段对换:以页或段为单位

在这里插入图片描述

实现进程对换,系统必须具备的功能

对换空间的管理

在这里插入图片描述

进程的换出

过程:系统首先选择处于阻塞状态且优先级最低的进程作为换出进程,然后启动盘块,将该进程的程序和数据传送到磁盘的对换区。
进程的换入

进程的换入

系统应定时查看所有进程的状态,从中找出**“就绪”状态但已换出的进程,将换出最久的进程**作为换入进程,将之换入。

覆盖技术与对换技术

  • 覆盖技术:把用户作业分成若干段,使主段成为作业执行过程中经常使用的信息,其他段不同时工作。作业执行时,把主段常驻主存区,其他段轮流装入覆盖区执行之。
  • 对换技术:让多个用户作业轮流进入主存器(转入、转出)执行。
  • 覆盖主要在同一个作业或同一个进程内进行。
  • 对换主要是在进程或作业之间进行。覆盖只能覆盖那些与覆盖程序段无关的程序段。

4.5 分页存储管理方式

4.5.1 分页存储管理的基本方法

  • 将程序的逻辑地址空间划分为固定大小的页;
  • 物理内存划分为固定大小的块(页架);
  • 程序加载时,分配其所需的所有页,这些页不必连续需要CPU的硬件支持
    在这里插入图片描述
  • 优点:
    • 没有外碎片,每个内碎片不超过页大小
    • 一个程序不必连续存放
    • 便于改变程序占用空间的大小。即随着程序运行而动态生成的数据增多,地址空间可相应增长。
  • 缺点:程序全部装入内存
    在这里插入图片描述
    在这里插入图片描述

页面和物理块

  • 分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片称为页,并为各页加以编号,从0开始。
  • 同时把内存空间分成与页面相同大小的若干个存储块,称为块。
  • 在为进程分配内存时,以块为单位将进程的若干个页分别装入到多个可以不相邻的物理块中。
  • 进程的最后一页经常装不满而形成**“页内碎片”**。
    在这里插入图片描述

地址结构

在这里插入图片描述

  • 划分是由系统自动完成的,对用户是透明的
  • 假定地址长度32位:
    每页的大小为4KB , 即:0~11位为位移量(页内地址)
    则:12 ~31位为页号,地址空间最多允许有1M页(是内存总共支持这么多页,还是一个进程支持这么多页)

页号与页内偏移的计算

  • 若给定一个逻辑地址空间中的地址为A,页面大小为L,则:
    • 页号: P=INT[A/L]
    • 页内地址: d=[A] MOD L
  • 例如:系统页面大小为1KB,设A=2170B,则:P=2,d=122

4.5.2 地址变换机构

1. 基本的地址变换机构:

  • 实现从逻辑地址到物理地址的转换,其任务是借助于页表,将逻辑地址中的页号转换为内存中的物理块号
  • 页表可以由一组专门的寄存器来实现,一个页表项用一个寄存器。但寄存器成本高,系统页表可能很大,所以页表大多常驻内存
  • 在系统中只设置一个页表寄存器PTR,在其中存放页表在内存中的始址和页表的长度
    在这里插入图片描述
    在这里插入图片描述

地址转换步骤

  • 当逻辑地址为十进制时:
    • 求出逻辑地址的页号 = 逻辑地址 / 页面大小
    • 求出页内偏移量 = 逻辑地址 % 页面大小
    • 用页号查页表,得到块号;
    • 求出物理地址 = 块号 * 页面大小 + 页内偏移
  • 当逻辑地址为十六进制/八进制/二进制时:
    • 把逻辑地址转为二进制
    • 按页的大小分离出页号和页内偏移量( 高位部分为页号低位部分为页内偏移量 );
    • 以页号查页表,得到物理地址的块号;
    • 将逻辑地址的页内偏移量直接复制到物理地址的块内偏移量上;
    • 把块号转为二进制,从而得出物理地址,再转回16/8进制

2.具有快表的地址变换机构

  • CPU在每存取一个数据时,需要两次访问内存:
    • 第一次:访问页表,找到指定页的物理块号,将块号与页内偏移量拼接形成物理地址。
    • 第二次:从第一次所得地址中获得所需数据,或向此地址中写入数据。
    • 缺点:处理速度降低!
    • 解决方法:在地址变换机构中,增设一个具有并行查寻能力的特殊高速缓冲寄存器,称为**“联想存储器”或“快表”**。(默认先访问块表再访问页表,如同时访问会给出备注)
      在这里插入图片描述
  • 有效访问内存的时间
    T=PTLB(TTLB+TM)+ (1-PTLB( TTLB + 2TM
    其中,PTLB为快表的命中率,TTLB为快表的访问时间, TM为内存的访问时间
    在这里插入图片描述

4.5.3 有效访问内存的时间

T=a*(λ+t)+ (1-a)*( λ+2t )
=aλ+at+(1-a)(λ+t)+(1-a)t
=aλ+(1-a)(λ+t)+t
( 第四版P142)
其中,a为快表的命中率, λ为快表的访问时间, t为内存的访问时间

4.5.4两级和多级页表

  • 现代计算机系统都支持非常大的逻辑地址空间(232~264),页表就非常大,需占用较大的地址空间。
  • 例如:一个具有32位逻辑地址空间的分页系统,规定页面大小为4KB即212B,则每个进程页表的页表项可达1M个,若每个页表项占用4个字节,则每个进程的页表就要占据4MB的内存空间,而且要求连续存放

1. 两级页表

  • 例如: 32位逻辑地址空间,页面大小为4KB(即12位),若采用一级页表机构,应有20位页号,即页表项应有1M个;在采用两级页表机构时,再对页表进行分页,使每页包含210(即1024)个页表项,最多允许有210个页表分页。即
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.多级页表

  • 两级页表对32位机器适用,64位呢?
    • 页面大小为4KB即212B,还剩52位,按物理块大小212B来划分页表(一个表项占4个字节),则剩余42位用于外层页号,此时外层页表可能有4096G个页表项,要占用16384GB的连续存储空间;
    • 解决方法:采用多级页表,将外层页表再进行分页。
      在这里插入图片描述
  • 为何引入多级页表?多级页表是否影响速度?
    • 为了使得大页表也能够不连续存放;
    • 减少大页表所占用的存储空间;
    • 多级页表会降低地址映射的速度,但通过快表仍可以将效率保持在合理的范畴内

反置页表

  • 了解即可
    在利用反置页表进行地址变换时,是用进程标志符和页号去检索反置页表;若检索完整个页表都未找到与之匹配的页表项,表明此页此时尚未调入内存,对于具有请求调页功能的存储器系统应产生请求调页中断,若无此功能则表示地址出错;如果检索到与之匹配的表项,则该表项的序号i便是该页所在的物理块号,将该块号与页内地址一起构成物理地址。
    虽然反置页表可以有效地减少页表占用的内存,然而该表中却只包含已经调入内存的页面,并未包含那些未调入内存的各个进程的页面,因而必须为每个进程建立一个外部页表(External Page Table),该页表与传统页表一样,当所访问的页面在内存时并不访问这些页表,只是当不在主存时才使用这些页表。该页表中包含了页面在外存的物理位置,通过该页表可将所需要的页面调入内存。
    由于在反置页表中是为每一个物理块设置一个页表项的,通常页表项的数目很大,从几千项到几万项,要利用进程标识符和页号去检索这样大的线性表是相当费时的。于是又利用一种Hash表来检索。
  • 与传统页表相比,倒置页表有什么优势?
    • 传统页表是面向进程逻辑地址空间的,即对应进程的每个逻辑页面设置一个表项,当进程的地址空间很大时,页表需占用很多的存储空间,造成浪费
    • 与经典页表不同,反置页表是面向内存物理块的,即对应内存的每个物理块设置一个表项,表项的序号就是物理块号f,表项的内容则为进程标识pid与逻辑页号p的有序对;
    • 系统只需设置一个反置页表,为所有进程所共用。

页的共享

  • 共享代码(数据)的实现方法
    被各进程共享的一段代码(数据),由各进程相应的页表项指向相同物理块。
  • 问题
    若共享数据与不共享数据划在同一块中,则:
    有些不共享的数据也被共享,不易保密
    当共享数据较大时,页表项数同时大幅增加

页的保护

  • 页式存储管理系统提供了两种方式:
    • 地址越界保护
    • 在页表中设置保护位(定义操作权限:只读,读写,执行等)

4.6 分段存储管理方式

4.6.1分段存储管理方式的引入

  • 引入分段存储管理方式,主要是为了满足用户的一系列要求:
    • 方便编程:按逻辑关系分为若干个段,每个段从0编址,并有名字和长度,访问的逻辑地址由段名和段内偏移量决定
    • 信息共享:共享是以信息为逻辑单位,页是存储信息的物理单位,段却是信息的逻辑单位
    • 信息保护:保护也是对信息的逻辑单位进行保护的。
    • 动态链接:动态链接以段为单位
    • 动态增长:实际应用中,某些段(数据段)会不断增长,前面的存储管理方法均难以实现。

空间划分(分段)

  • 将用户作业的逻辑地址空间划分成若干个大小不等的段(由用户根据逻辑信息的相对完整来划分)。各段有段名(常用段号代替),首地址为0。
    在这里插入图片描述

内存分配

  • 在为作业分配内存时,以段为单位,分配一段连续的物理地址空间;段间不必连续
    • 1、整个作业的逻辑地址空间是二维的,其逻辑地址由段号和段内地址组成;物理地址空间是一维的。
    • 2、需要CPU的硬件支持(地址变换机构)
      在这里插入图片描述

4.6.2分段系统的基本原理

  • 页式管理把逻辑地址视为一维线性空间;
  • 段式管理把逻辑地址视为二维空间。
  • 将一个用户程序的所有逻辑段从0开始编号,称为段号;
  • 每一段内的所有单元从0开始编址,称为段内地址;
  • 逻辑地址由段号和段内地址两部分组成。
  • 段式管理将程序的地址空间划分为若干个段(segment),程序加载时,分配其所需的所有段(内存分区),这些段不必连续;物理内存的管理采用动态分区。需要CPU的硬件支持。
  • 程序通过分段(segmentation)划分为多个模块,如代码段、数据段、共享段
    • 可以分别编写和编译
    • 可以针对不同类型的段采取不同的保护
    • 可以按段为单位来进行共享,包括通过动态链接进行代码共享
  • 优点:
    • 没有内碎片外碎片可以通过内存紧缩来消除。
    • 便于改变进程占用空间的大小。
  • 缺点:进程全部装入内存
    在这里插入图片描述

段表

在这里插入图片描述

  • 记录了段与内存位置的对应关系
  • 段表常保存在内存中
  • 段表的基址及长度由段表寄存器给出:段表始址,段表长度
  • 访问一个数据/指令需访问内存2次(段表一次,内存一次),所以也出现内存访问速度降低的问题。
  • 二维的逻辑地址:段号,段内地址
  • 许多编译程序支持分段方式,自动根据源程序的情况产生若干个段

分段地址变换机构

在这里插入图片描述

1.分段地址结构

由于整个作业的地址空间是分成多个段,因而是二维的,亦即,其逻辑地址由段号(段名)和段内地址所组成。
在这里插入图片描述
该地址结构允许一个作业最长有64K个段,每段的最大长度为64KB。

2.段表

  • 段表可以存放在寄存器中,但更多的是存放在内存中
  • 段表可以实现从逻辑段到物理内存区的映射。
  • 所需表目
    • (1)段表:每个进程一个
    • (2)总段表:系统一个
  • 所需寄存器
    • (1)段表首地址寄存器:系统一个
    • (2)段表长度寄存器:系统一个
    • (3)快表:系统一组

3.地址变换机构

在系统中设置段表寄存器,用于存放段表始址和段表长度,以实现从进程的逻辑地址到物理地址的变换。
在这里插入图片描述

  • 注意:当段表存放在内存中时,每访问一个数据,都需访问两次内存,降低了计算机的速率。
  • 解决方法:设置联想寄存器(快表),用于保存最近常用的段表项。
    在这里插入图片描述

段的动态链接和装配

所谓动态链接,是指在一个程序开始运行时,只将主程序装配好并调入内存,在程序运行过程中若要访**问一个新的模块时,再装配此模块,**并与主程序链接起来。

4.6.3信息共享

  • 分段系统的一个突出优点是易于实现段的共享,允许若干个进程共享一个或多个分段,且对段的保护十分简单易行。
  • 分页系统中虽然也能实现程序和数据的共享,但远不如分段系统方便。
  • 如果多个用户进程或作业需要共享某段程序或数据,可以使用不同的段名,在各自的段表中填入已在内存中的共享段的起始地址,并设置适当的读写控制权,就可以做到共享一个内存段的信息。
  • 为什么说分段系统较之分页系统更易于实现信息共享和保护
    • 对分段式系统,被共享的程序或数据可作为单独的一段。在物理上它是一段,在不同的进程中,可以对应不同的逻辑段,相对来说比较易于实现。
    • 对分页管理,则要困难的多。首先,必须保证被共享的程序或数据占有整数块,以便与非共享部分分开。其次,增加了进程的页表长度。

段的共享

在这里插入图片描述
共享段表
在这里插入图片描述
进程段表(n)->共享段表(1)->共享段(1)

段的保护

在这里插入图片描述

分页和分段的主要区别

  • 相似点:采用离散分配方式,通过地址映射机构实现地址变换
  • 不同点:
    • 页是信息的物理单位,分页是为了满足系统的需要;段是信息的逻辑单位,含有一组意义相对完整的信息,分段是为了满足用户的需要。
    • 页的大小固定且由系统确定,由系统把逻辑地址分为页号和页内地址,由机器硬件实现;段的长度不固定取决于用户程序,编译程序对源程序编译时根据信息的性质划分
    • 分页的作业地址空间是一维的;分段的作业地址空间是二维的
      在这里插入图片描述

段式和页式存储管理的地址结构相似,它们有什么实质性差异?

  • 页式存储管理提供连续的逻辑地址.由系统进行分页;
  • 而段式存储管理中作业的分段是由用户决定的,每段独立编程,因此段间逻辑地址是不连续的

4.6.4段页式存储管理

  • 段式优于页式
    便于共享和保护
  • 页式优于段式
    消除“外碎片”问题
  • 段页式:结合二者优点
    每个进程包含若干段
    每个段包含若干页

1.基本原理

  • 内存空间划分:(同页式)
    静态等长,2i, 称为一块。
    物理地址=(块号,块内地址)=(f,w)
  • 进程空间划分:
    一个进程<–>若干个段
    一个段<–>若干个页
    逻辑地址=(段号, 逻辑页号, 页内地址)=(s,p,w)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

所需表目

(1) 段表:每个进程一个
在这里插入图片描述
(2)页表:每个段一个
在这里插入图片描述

所需寄存器

  • (1)段表基址寄存器:保存正运行程度段表首址;
  • (2)段表限长寄存器:保存正运行程序段表长度。
  • (3)快表:一组联想寄存器 (快段表+快页表)
    -在这里插入图片描述

三次访存

  • 第一次:访问内存中的段表,取得页表始址;
  • 第二次:访问内存中的页表,取得该页所在的物理块号,将块号与页内地址形成物理地址;
  • 第三次:访问上述地址,取出指令或数据。
  • 缺点:访存次数增加
  • 解决方法:增设高速缓冲寄存器-快表

简要比较各种存储管理方法的功能和实现特点

  • (1)连续分配:
    • 指为一个用户程序分配一个连续的地址空间,包括单一连续分配方式分区式分配方式
    • 分区式分配方式分为固定分区和动态分区,固定分区是最简单的多道程序的存储管理方式,由于每个分区的大小固定,必然会造成存储空间的浪费;
    • 动态分区是根据进程的实际需要,动态地为之分配连续的内存空间;
    • 常用四种分配算法: 首次适应算法FF,该法容易留下许多难以利用的小空闲分区,加大查找开销;循环首次适应算法,该算法能使内存中的空闲分区分布均匀,但会致使缺少大的空闲分区;最佳适应算法,该算法也易留下许多难以利用的小空闲区;最差适应算法,优点是可以提高了查找速度、避免形成太多碎片,缺点是分割大的空闲区后,再遇到较大的申请时,无法满足的可能性较大。
  • (2)离散分配方式:
    • 基于将一个进程直接分散地分配到许多不相邻的分区中的思想,分为分页式存储管理、分段存储管理和段页式存储管理;
    • 分页式存储管理旨在提高内存利用率,满足系统管理的需要;
    • 分段式存储管理则旨在满足用户(程序员)的需要,在实现共享和保护方面优于分页式存储管理;

4.7 本章要点与课堂练习

存储器管理内容

在这里插入图片描述

存储器管理方案

在这里插入图片描述

存储器管理的功能

  • 存储分配和回收:分配和回收算法及相应的数据结构。
  • 地址变换:
    • 程序加载(装入)时的重定位技术
    • 进程运行时硬件和软件的地址变换技术和机构
  • 存储共享和保护:
    • 代码和数据共享
    • 越界保护、访问权限(读、写、执行)控制
  • 存储器扩充:
    • 由应用程序控制:覆盖;
    • 由OS控制:交换(整个进程空间)。

学习重点

  • (1) 存储管理的目的与功能。
  • (2) 概念:逻辑(相对)地址、物理(绝对)地址、重定位、分区分配存储管理(固定分区分配、可变式动态分区分配、可重定位分区分配)。
  • (3) 动态分区分配的分配算法:首次适应法、循环适应法、最佳适应法和最坏适应法。
  • (4) 内存“扩充”技术:覆盖与交換。
    内存保护技术:越界保护、权限保护。
  • (5) 页式存储管理:实现原理、页表的作用;页式存储管理优缺点。
  • (6) 段式存储管理、段页式存储管理特点。
  • (7) 段页式存储管理

猜你喜欢

转载自blog.csdn.net/qq_43515378/article/details/109696927
今日推荐