【操作系统】内存管理


在这里插入图片描述

内存管理

内存管理的功能

内存的分配与回收

地址转换

内存扩充

  • 覆盖
  • 交换
  • 虚拟存储器

存储保护

程序的编译、链接、装入

编译

  • 实体:源程序 -> 目标程序

链接

  • 实体:目标程序 -> 装入模块

  • 分类

    • 静态链接
    • 装入是动态链接
    • 运行时动态链接

装入

  • 实体:装入模块 -> 内存

  • 分类

    • 绝对装入
    • 静态重定位
    • 动态重定位

覆盖与交换

覆盖

  • 操作:由程序员将程序划分为 【主程序段+覆盖区】,覆盖区的程序可以相互替换
  • 缺点:对用户不透明

交换

  • 操作:将外存划分为 【交换区+文件区】,当内存不足的时候,将部分作业调入到 交换区

连续分区分配管理

单一分区分配

  • 操作:将内存划分为 系统区+用户区
  • 特点:只允许单作业单用户
  • 存在内部碎片

固定分区分配

  • 操作:将系统划分为多个固定分区

  • 数据结构:分区分配表

    • 表的字段

      • 分区大小
      • 是否已分配
  • 分类

    • 分区大小固定
    • 分区大小不固定
  • 静态重定位

动态分区分配

  • 操作:在进程/作业进入时,进行动态装入

  • 数据结构

    • 分区分配表
    • 空闲分区链
  • 分区分配算法

    • 顺序
    • 最近算法
    • 最佳适应算法
    • 最差适应算法
  • 拼接技术

    • 操作:当新来的进程/作业需要装入,但是找不到比它的size大的空闲分区的时候,尝试对内存中的空闲分区进行合并
    • 缺点:耗时,浪费资源
    • 带拼接技术的动态分区分配技术也称为“可重定位动态分区分配”

页面分配策略

驻留集

  • 请求分页管理分配给进程的物理块集合

页面分配策略

  • 固定分配

    • 进程运行过过程中,驻留集大小不变
  • 可变分配

    • 进程运行过过程中,驻留集大小可变
  • 局部置换

    • 发生缺页时,只能使用进程内部的物理块进行置换
  • 全局置换

    • 发生缺页时,系统可以分配空闲物理块给进程,也可以从其他进程中取出物理块给缺页进程
  • 固定分配局部置换

  • 可变分配全局置换

    • 只要发生缺页,就分配新的物理块
  • 可变分配局部置换

    • 根据发生缺页的频率,动态地增加或减少进程的物理块

页面调入策略

  • 预调页
  • 请求调页

从何处调入页面

  • 系统拥有足够的交换区空间

  • 系统缺少交换区空间

    • 不会被修改的文件从文件区调入,会被修改的文件调到对换区
  • UNIX方式

    • 第一次从文件区调入,后面都从对换区调入

工作集

  • 最近 n 次内存访问过的页面的集合

抖动与缺页

Belady现象

  • 说明:缺页率随着分配物理块的增加而增加的现象
  • 原因:被置换的页面是进程会访问到的页面
  • FIFO 会存在这种现象

抖动

  • 系统把时间耗费在了页面的换入和换出上了

  • 解决

    • 增大内存空间
    • 改变页面置换算法

缺页率

非连续分区分配管理

基本分页存储管理

  • 基本概念

      • 目标程序的一个分区

      • 页的大小

        • 页面过大
        • 页面过小
    • 页框、页帧、物理块

      • 内存的一个分区
  • 逻辑地址结构

    • 逻辑地址分为【页号+页内偏移】

    • 由逻辑地址可以得到

      • 页号的最大值
      • 页面的大小
  • 页表

    • 页表项

      • 页号
      • 物理地址
  • 地址转换

    • 第一步:根据逻辑地址计算出页号 S 和页内偏移W
    • 第二步:根据基址寄存器取出页表基址,并检查页号是否合法,若不合法则产生中断
    • 第三步:页表基址+页表大小*页号,根据这个地址从页表中查出对应的块号
    • 第四步:块号*页大小+页内偏移
  • 快表TLB

    • 依据局部性原理(时间局部性&空间局部性)
    • 作用:相当于一个小页表,存储最近查询过的页表的项及其对应的物理地址,当要进行地址转换的时候,会先查快表
    • 缺点:需要硬件支持
  • 两级页表、多级页表

    • 逻辑地址结构

      • 外层页表地址
      • 页内地址
      • 页内偏移
    • 页表结构(二级页表为例)

      • 外层页表

        • 页表项

          • 页号
          • 内层页表所在的物理地址
      • 内层页表

        • 页表项

          • 页号
          • 物理地址
  • 存储保护

    • 缺点:不利于页面共享
  • 碎片

    • 会产生内部碎片

基本分段存储管理

  • 段的概念

    • 程序员根据程序逻辑将目标程序划分成多个块
  • 逻辑地址结构

    • 段号
    • 段大小
    • 段内偏移
  • 段表

    • 段表项

      • 段号
      • 段大小
      • 物理地址
  • 地址转换

    • 第一步:根据逻辑地址得到【段号、段大小和段内偏移】
    • 第二步:从基址寄存器中查出段表的基址及段表的长度
    • 第三步:检查段号是否小于段长,否则产生中断;检查段内偏移是否小于段大小,否侧产生中断;
    • 第四步:根据段号从段表中查出物理块的物理地址
    • 第五步:物理地址+段内偏移
  • 存储保护

    • 段共享

      • 概念:多个段表对应的段表项指向共享的段
    • 纯代码、可重入代码

      • 概念:除临界区以外的代码,不会修改的代码

基本段页式存储管理

  • 逻辑地址结构

    • 段号
    • 段内页号
    • 页内偏移
  • 段表(不同于分段中的段表)

    • 段号
    • 页表长度
    • 页表地址
  • 页表

    • 页号
    • 块号
  • 地址转换

    • 第一步:根据逻辑地址计算【段号、段内页号、段内偏移】
    • 第二步:检查段号是否小于段长,否则产生中断
    • 第三步:根据段号找到页号,判断页号是否小于页表长度,否则产生中断;访问页表,取出块号
    • 第四步:块号*页大小+页内偏移
  • 碎片

    • 段页式的内部碎片要比基本页式的内部碎片要多

补充

  • 地址空间的维数

    • 基本分页的逻辑地址的地址空间是一维的
    • 基本分段和段页式的地址空间都是二维的
    • 解释:基本分页的逻辑地址只需要知道“页内偏移”即可得到物理地址,因为页号的系统自动分配的;而基本分段的段号是人为给定的,所以需要知道“段号”+“段内偏移”才能从逻辑地址得到物理地址
  • 页表、段表的数量

    • 一个进程/作业对应一张页表/段表

虚拟存储器

引入

  • 解决问题

    • 基本分页、基本分段存储管理具有一次性和驻留性,即作业需要一次性装入内存,并且长期驻留在内存中
  • 局部性原理

    • 时间局部性

      • 当前执行的指令,在短时间内很可能再次执行
    • 空间局部性

      • 当前访问的存储单元,在短时间内很可能再次访问
  • 特征

    • 离散型
    • 多次性
    • 交换性
    • 虚拟性

请求分页存储管理

  • 操作

    • 请求分页=基本分页+请求页面+页面置换
  • 页表

    • 页号
    • 物理块号
    • 访问位
    • 修改位
    • 状态位
    • 外存地址
  • 缺页中断

    • 产生

      • 当请求分页时,内存中不存在请求的页面,则产生缺页中断
    • 与其他中断的区别

      • 在指令执行期间产生和处理中断信号
      • 一条指令可以产生多个缺页中断
  • 页面置换算法

    • 最佳置换OPT

      • 换出以后再也不用或最迟再被使用的页面
    • 先进先出FIFO

      • 换出最先进入内存的页面
    • 最近最久未用LRU

      • 换出在内存中停留最久的页面
    • 时钟置换算法CLOCK

      • 具体步骤

        • 不缺页

          • 对应的页面的访问位置为 1
          • 指针位置不变
        • 缺页

          • 循环遍历链表

            • 指针指向的页面访问位为0,则换页,换页后对应的访问位置为 1;指针指向下一个页面
            • 指针指向的页面访问位为 1,则将其访问位置为 0;指针指向下一个页面
    • 改进型时钟置换算法

      • 概念

        • 每个页面对应一个二元组(a, b),a 为访问位,b 为修改位
      • 具体步骤

        • 不缺页

          • 对应的页面元组置为(0,0)
        • 缺页

          • 三步

              1. 遍历链表,找出二元组为 (0, 0) 的页面
              1. 遍历链表,找出二元组为 (0, 1) 的页面,并将遍历过的页面的二元组的访问位置为 0
              1. 如果上述两步未找到需要置换的页面,则重复步骤1、2

内部碎片与外部碎片

内部碎片

已经分配给进程,装入之后剩下的

外部碎片

未分配给进程,但是由于空闲分区太小而装不下的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值