第四章 存储器管理 + 分页 + 分段

  • 主存:保存进程运行时的程序和数据
  • 寄存器:速度最快,价格昂贵容量不大,一般以字为单位,只要存放指令一次操作的数据就够了 。
  • 高速缓存:总之:速度快、存放部分内存数据、硬件自动处理
  • 磁盘缓存:内存的一部分,将频繁使用的一部分磁盘数据信息预读入在磁盘缓存,减少磁盘读写时间
    在这里插入图片描述

动态分区分配:

  • 首次适应算法FF
    - 优点:优先利用内存低址部分,保留了高地址部分的大空闲区;
    - 缺点:但低址部分不断划分,会产生较多小碎片;而且每次查找从低址部分开始,会逐渐增加查找开销
  • 循环首次适应算法
    - 优点:空闲分区分布均匀,减少查找开销
    - 缺点:缺乏大的空闲分区
  • 最佳适应算法
    - 缺点:每次找到最合适大小的分区割下的空闲区也总是最小,会产生许多难以利用的小空闲区(外碎片)
  • 最差适应算法
  • 快速适应算法

动态重定位分区分配:

用户程序在内存中移动,将空闲空间紧凑起来提高空间利用率。但必然需要地址变化,增加“重定位”工作。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

离散分配内存:
作业规定大小划分成小份;内存也按同样大小划分成小份
作业的任一小份可分散放入内存任意未使用的小份

分页方式下,内存的使用率高,浪费少。但不是绝对没有碎片(进程的最后一页不总是能占满一个物理块)

分页、分段

内存划分成多个小单元,每个单元K大小,称(物理)块
作业也按K单位大小划分成片,称为页面
【 物理划分块的大小 = 逻辑划分的页的大小 】
页面大小要适中:
- ⊙太大,(最后一页)内碎片增大,类似连续分配的问题。
- ⊙太小的话,页面碎片总空间虽然小,提高了利用率,但每个进程的页面数量较多,页表过长,反而又增加了空间使用

例:在这里插入图片描述

例题:
某系统采用页式存储管理方式,物理内存空间1M,页面大小2K,若逻辑空间32页,计算:
1)逻辑地址格式

页号 页内地址
15 - 11 10 - 0

2)不考虑权限等问题,进程的页表有多少项(即页表记录条数)?每项多少位?
- 32页所以有32项 1M/2K=9位
3)物理空间减一半,页表有什么变化?
- 项数还是32,但物理块数变了,块号编号位数减1

在这里插入图片描述

· 地址变换机构

具体实现地址映射 —— 地址变换机构。
围绕页表进行工作,那么页表数据放在哪?

  • 寄存器。一个进程有n个页,页表就需要记录n项数据,需要n个寄存器。不现实。
  • 内存。只设置一个页表寄存器PTR(page table register)记录页表在内存中的首地址和页表长度,运行时快速定位页表。

地址变换的过程

分页系统中,进程创建,放入内存,构建页表,在PCB中记录页表存放在内存的首地址及页表长度。

  • 运行某进程A时,将A进程PCB中的页表信息写入PTR中;
  • 每执行一条指令时,根据分页计算原理,得到指令页号X和内部偏移量Y;
  • CPU高速访问PTR找到页表在哪里;
    - 为防止错误检索,增加预先的判断:
    - 计算得到的页号是否大于页表长度(即页表项数)
    - 一个5页的进程,页面编号0-4,若地址计算出的页号不在该范围,一定产生了越界错误。
  • 查页表数据,得到X实际对应存放的物理块,完成地址映射计算,最终在内存找到该指令。
    在这里插入图片描述

访问内存的有效时间

进程发出逻辑地址的访问请求,经过地址变换,到内存中找到对应的实际物理地址单元并取出数据,所需花费的总时间,称为内存的有效访问时间EAT(effective access time)

  • 设访问一次内存时间为t,则基本分页机制下EAT=2t,why?
    • CPU操作一条指令需访问内存两次:
      • 访问内存中的页表(以计算指令所在的实际物理地址)
      • 访问指令内存地址

针对访问速度问题 —— 引入块表

块表里存放着:正在执行进程的页表的数据项

快表的寄存器单元数量是有限的,不能装下一个进程的所有页表项。虽不能完全避免两次访问内存,但如果命中率a高还是能大幅度提高速度

  • 设一次查找访问快表时间为 t’ , 那:
  • EAT= at’ + (1-a)(t’+t) + t = 2t + t’ - ta
    在这里插入图片描述

针对大页表占用内存问题 —— 两级、多级页表、反置页表

① 两级页表:

  • 将页表分页,并离散地将页表的各个页面分别存放在不同的物理块中
  • 为离散分配的页表再建立一张页表,称为“外层页表”,其每个表项记录了页表页面所在的物理块号

格式:

外页号 页在外页内的偏移 页内地址(偏移量)

在这里插入图片描述

分段存储管理

从提高内存利用率角度;

  • 固定分区 → 动态分区 → 分页

从满足并方便用户(程序员)和使用上的要求角度:

  • 分段存储管理:作业分成若干段,各段可离散放入内存,段内仍连续存放

段的特点

  • 每段有自己的名字(一般用段号做名),都从0编址,可分别编写和编译。装入内存时,每段赋予各段一个段号。
  • 每段占据一块连续的内存。(即有离散的分段,又有连续的内存使用)
  • 各段大小不等

段的地址结构: 段号 + 段内地址
段表: 记录每段实际存放的物理地址
在这里插入图片描述

》段表与地址变换机构

段是连续存放在内存中。段表中针对每个“段编号”记录:“内存首地址”和“段长”
在这里插入图片描述
同样有两次内存访问问题
解决方法:设置联想寄存器,用于保存最近常用的段表项

在这里插入图片描述

★★★ 分页与分段的主要区别 ★★★

  • 需求: 分页是出于系统管理的需要,是一种信息的物理划分单位,分段是出于用户应用的需要,是一种逻辑单位,通常包含一组意义相对完整的信息。
    - 一条指令或一个操作数可能会跨越两个页的分界处,而不会跨越两个段的分界处。
  • 大小: 页大小是系统固定的,而段大小则通常不固定。分段没有内碎片,但连续存放段产生外碎片,可以通过内存紧缩来消除。相对而言分页空间利用率高。
  • 逻辑地址:
    - 分页是一维的,各个模块在链接时必须组织成同一个地址空间;
    - 分段是二维的,各个模块在链接时可以每个段组织成一个地址空间。
  • 其他: 通常段比页大,因而段表比页表短,可以缩短查找时间,提高访问速度。分段模式下,还可针对不同类型采取不同的保护;按段为单位来进行共享

分段系统的突出优点: 易于实现共享、易于实现保护
分页容易造成共享和非共享数据共处一页,不方便设置权限
可重入代码:(又称为纯代码,允许多个进程同时访问的代码、不允许任何进程对它进行修改)
可共享的代码必须是可重入的

段页式存储管理

① 基本原理

  • 将用户程序分成若干段,并为每个段赋予一个段名。
  • 把每个段分成若干页
  • 地址结构包括段号、段内页号和页内地址三部分
段号(S) 段内页号(P) 页内地址(W)

② 地址变换过程

  • 三次访问内存
  • 可借助高速缓冲弥补不足
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40199634/article/details/84251166
今日推荐