操作系统 [第三章]内存管理

本文内容来自我自己的笔记软件,所有跳转链接都为无效链接 (懒得调)
笔记内容来源与考研书籍和自己写过的一些简单项目结合
如若有疑问或者想询问可以+Q1403145273

操作系统 [第三章]内存管理_第1张图片
操作系统 [第三章]内存管理_第2张图片
操作系统 [第三章]内存管理_第3张图片操作系统 [第三章]内存管理_第4张图片操作系统 [第三章]内存管理_第5张图片

基本概念

内存管理基本功能 :: 内存的分配与回收,地址转换,内存扩充,内存共享,存储保护

源代码变成可执行文件的过程 :: 编译(有编译程序将源代码编译成若干目标模块),链接(将模块以及所需的库函数链接在一起,形成一个完整的模块),装入(由装入程序(可执行程序)装入内存运行)

链接方式 :: 静态链接(在程序运行之前就所有模块链接,在运行时整个程序的最大逻辑地址是固定的),装入时动态链接(装入内存时才链接,在装入前模块没有逻辑地址,装入后就有了),运行时动态链接(运行时需要用到的模块才会生成逻辑地址,没用到的模块没有逻辑地址)

装入方式

  • 绝对装入

    适合单道系统,链接时用到就是物理地址,不可改变模块位置

  • 可重定位装入

    链接使用逻辑地址,在装入后将逻辑地址更改位物理地址

    内存分配必须连续 且 必须分配足够的内存

    运行时,模块进入内存就不可移动,不能再申请空间

  • 动态运行时装入

    链接和装入后都不用物理地址,使用相对地址

    在真正执行模块时通过重定位寄存器+逻辑地址 寻找 物理地址

    运行时不需要连续的内存空间,可以动态申请所需内存

    动态链接与程序的逻辑结构有关,所以分段存储管理更有利(不代表分页和连续分配不能用动态链接)于动态链接


进程映像(由程序段,相关数据段,PCB构成)

程序段 :: 代码段(存放指令和可执行机器码),数据段(存放全局初始化(静态)变量),BSS段(存放全局未初始化(静态)变量),只读数据段(存放常量,整数常量直接嵌入代码段)

相关数据段 :: 数据栈(存放局部变量),数据堆(存放动态动态分配数据)

可重入编码(一种允许多进程同时访问的代码.不允许进行修改)属于(共享)程序段

内存保护 :: 设置上下限寄存器,采用重定位寄存器和界地址寄存器(限长寄存器,包含逻辑地址的最大值)

内存共享 :: 可重入编码一种允许多进程同时访问的代码. 不允许进行修改属于(共享)程序段

  • 内存扩充(新版已删覆盖和交换)

    • 覆盖技术

      将程序分为多个段(模块),常用的段常驻内存,不常用的段需要时才调入内存

      内存分为 一个固定区 和 若干个覆盖区(互斥的模块共享一个覆盖区)

      打破了必须全部装入内存才能运行的限制

      必须有程序员来声明覆盖结构(类似union)对用户不透明(使用者能够使用,透明则为使用者不能使用)

    • 交换技术

      将进程移动到外存(挂起态) 内存调度

      将磁盘空间分为文件区(追求存储空间利用率,主要用于存储,空间占比大,离散分配)和对换区(追求与内存的交换速度,主要用于数据,空间占比小,连续分配)

      换出技术不会把PCB换出

    • 虚拟存储技术

内存的分配与回收

目的 :: 方便用户 和 提高内存利用率

连续分配管理方式

  • 单一连续分配

    内存分为系统区(仅供操作系统,通常低地址)和用户区(只有一个用户程序独占,用于单道程序),使用覆盖技术

    简单,无外部碎片,无需内存保护

    单道,有内部碎片,存储利用率低

  • 固定分区分配

    • 分区大小相等(程序太小会造成浪费,程序太大又无法装入)
    • 分区大小不等(划分若干较小分区,适量中等分区,少量大分区)

    通常建立分区使用表^(记录每个分区的 起始地址,大小,是否分配)^便于分配

    实现简单,无外部碎片

    有内部碎片,在分区不能满住进程需求时需要覆盖技术

  • 动态分区分配

    根据所需内存分配,不会预先划分内存分区,采用空闲分区表^(记录 分区号,空间大小,起始地址,分配状态)和空闲分区链(记录分区 起始地址,末尾地址,分区大小,分配状态)^

    因为紧凑技术导致不能使用静态重定位

    • 首次适应算法(地址从低到高匹配,使用第一个满足的空间)
    • 邻近适应算法(由首次适应算法改进,下次匹配上次结束的地址而不是从头)
    • 最佳适应算法(找最小且满足空间需求的分区,最多内存碎片(易看成内部碎片))
    • 最坏适应算法(找到最大的分区)

内部碎片(进程内部未被使用的内存空间)

外部碎片(进程之间未被使用的内存空间)

紧凑技术(对进程进行移动和整理)可以解决外部碎片,动态运行时装入

非连续分配管理方式

  • 基本分页存储管理(将主存分为大小相等相对较小的块作为分配的基本单位)

    (内存分配单元(存储单元是字/字节))

    页框(进程的最大页数)

    注意页框号和页号的区别(页框号是作业在内存的实际物理地址,页号一般指逻辑地址.选择题往往考察给你个虚地址,先让你判断是否在内存,然后置换算法,等找到页框号后加页内偏移量组成实际物理地址)

    页表 :: 是一种存储结构,数组结构导致页号可以用地址隐含表示不需要存储

    • 注意区分Cache映射方式与页表的关系

      页表负责将逻辑地址转换为主存地址,然后在拿主存地址再进行一次页表查询是否再Cache中

    • 地址变换机构的任务是逻辑地址转内存物理地址

      • 快表 :: 将页表放入高速缓冲存储器,遵循局部性原理

        • 放入主存的页表称为慢表
        • 通常采用全相联或组相联方式,是相联存储器,可以按内容寻址
        • 命中率一般在 90% 以上
        • 快表加速的是将逻辑地址转化成物理地址的速度,类似与ARP
    • 多级页表

      各级页表不能超过一个页面的最大页表项数目(页面大小/页表项大小)

      n = log(虚地址位数 - 页内偏移量)/log(页面大小/页表项大小)

      n级页表访存次数 = n + 1 次,才能获得物理地址

  • 基本分段存储管理 :: 段式虚拟存储器 :: 按照功能模块拆分段

    每个段从0开始编址,拥有段名被程序员使用

    无内部碎片,有外部碎片

    内存分配规则,每个段占连续的内存空间,段之间离散

    • 优点 :: 具有逻辑独立性,易于修改,管理和保护
    • 缺点 :: 分配空间不变,容易留下碎片造成浪费

    逻辑地址 (段号(一个程序最多有多少个段),段内偏移量(段内地址,表示段的最大长度))

    段表 (段号(可以被隐含,不占存储空间),段长(一个段的长度),段基址地址(段的起始地址)),段表项是相等大小

    满足 方便编程,信息保护,信息共享,动态增长,动态链接 需求

  • 段页式管理

    逻辑地址(段号,页号,页内偏移量)

    段表只有一个,页表有多个



分页 分段
单位 页是信息的物理单位,长度固定 段是信息的逻辑单位,长度不固定
目的 实现离散分配提高内存利用率 更好的满足用户需求
可见性 系统行为,用户不可见 用户使用,用户可见
地址维度
一维,用户只需给出逻辑地址
二维,给出段名和段内地址
更容易实现信息的共享和保护,可重入编码
在不使用TLB时访存两次才可以得到物理地址
也可以使用TLB
物理地址空间 总空间-页表长度
长度不能确定,物理空间也不确定
总空间-段表长度
长度不能确定,提供的物理空间也不确定

三者的表起始地址都位于寄存器中(进程调度时,将起始地址从PCB写入寄存器中)

这三种方式对内存的单位(分块或分段)指的是内存分配,内存访问是单位(字或字节)

进程切换不会影响页表和段表驻留内存,切换时只会改变寄存器,进程的表是独立(不和其他进程共享,注意题目中所谓的进程共享表指的是同进程中不同线程共享表)

  • 被共享的(段/页)在不同线程(进程)中各自的表的位置是不一样的
  • 这就表示该(段/页)(主存位置)的逻辑地址因不同的进程(线程)而改变

虚拟内存

局部性原理: 时间局部性,空间局部性

传统存储管理方式特征 :: 一次性(作业必须一次性装入内存才能开始运行) 和 驻留性(作业装入内存后就会一直驻留在内存中)

虚拟存储器特征 :: 多次性(允许作业分成多次调入内存),对换性,虚拟性

  • 虚拟内存需要的硬件支持

    • 一定容量的内存和外存

    • 页表(段表)机制,离散分配管理方式

    • 中断机构 :: 缺页(缺段)中断

      发生缺页(段) 就需要进程调度,缺页的进程进入阻塞态

    • 地址变换机构

  • 虚拟内存技术的实现 :: 页式虚拟存储器,段式虚拟存储器,段页式虚拟存储器


  • 页框分配

    内存分配策略 :: 固定分配局部置换(进程拥有的物理块固定只允许置换),可变分配全局置换(没有置换,允许增减物理块.会降低系统并发能力,物理块的增减是临界资源加锁),可变分配局部置换(允许置换和增减物理块,发生缺页后进行置换.在缺页率高时增加物理块,缺页率低时减少物理块)

    固定分配物理块调入算法 :: 平均分配,按比例分配,优先权分配

    调入页面策略 :: 预调页策略(运行前需要由程序员预先指出,批量调入内存可减少IO开销),请求调页策略(申请一次调入一次)

    对换策略 :: 对换空间充足(调入对换全部在交换区),对换空间不足(不会修改的文件从文件区调入,需要修改的从交换区调入),UNIX方式(未被调入的页面在文件区,调入过的页面在交换区)

  • 页面置换算法 :: Cache替换算法

    • 最佳置换算法(被淘汰的页面最久时间内不被访问的页面)

      缺页率最低,无法实现,用于评价其他算法

    • 先进先出算法(最先进入内存的页优先被置换)

      会出现Belady异常(分配的物理块越多,缺页率反增)

    • 最近最久未使用算法(选择过去最久没被访问的页进行置换)

      性能较好(仅仅指置换算法用较少的置换次数)接近OPT,需要寄存器和栈的硬件支持,开销大(需要实现排序算法)

    • 时钟置换算法

      刚调入内存的页面访问位为1

      在换出时轮询检查所有页的访问位是否为0,检查后将 访问位 改0(最多检查两次)

      改进时钟置换算法用到了修改位(访问位,修改位)

      • 第一次寻找 (0,0)
      • 第二次寻找 (0,1) 且将 访问位 改0
      • 第三次寻找 (0,0) 等同于原先的(1,0)
      • 第四次寻找 (0,1) 等同于原先的(1,1)
  • 抖动 :: 频繁的换入换出,刚配换出的块很快又被调入

    主要原因 :: 置换算法不合理

    根本原因 :: 物理块少,进程多


工作集(某段时间内,进程实际访问页面的集合)

  • 工作窗口(指定大小不去重页面) > 工作集(指定大小去重页面) > 驻留集
  • 驻留集 大于 工作集就会出现 抖动

置换算法没有更改页框,在置换时,只是将原先页框内的数据进行写入写出,页框本身还是这个进程
也就是置换算法不改变页框号(此时页框号表示的就是实际物理地址/内存地址) ​#存疑#​

你可能感兴趣的:(操作系统,操作系统,考研)