精灵王


  • 首页

  • 文章归档

  • 所有分类

  • 关于我

  • 搜索
设计模式-行为型 设计模式-创建型 设计模式-结构型 设计 系统设计 设计模式之美 分布式 Redis 并发编程 个人成长 周志明的软件架构课 架构 单元测试 LeetCode 工具 位运算 读书笔记 操作系统 MySQL 异步编程 技术方案设计 集合 设计模式 三亚 游玩 转载 Linux 观察者模式 事件 Spring SpringCloud 实战 实战,SpringCloud 源码分析 线程池 同步 锁 线程 线程模型 动态代理 字节码 类加载 垃圾收集器 垃圾回收算法 对象创建 虚拟机内存 内存结构 Java

(七)操作系统-主存储器管理

发表于 2021-04-22 | 分类于 操作系统 | 0

主存储器的管理功能

主存分配

  • 可以使多个程序同时驻留在主存中,以提高CPU利用率;
  • 保证系统的高性能,提高存储利用率和主存的分配和释放(回收)速度,以加快任务的执行。

地址转换和重定位

  • 程序不必事先约定存放地址,可在执行过程中移动;
  • 可以运行只装入了一部分的程序,缩短程序的启动时间;
  • 研究和使用各种有效的地址转换技术以及相应的地址转换机构。

存储保护和主存共享

  • 如何保护各存储区中信息不被破坏和偷窃;
  • 由于许多不同的任务可能要执行同一个程序,进程中多个合作进程要访问相同的数据结构,所以存储保护机制要提供进程对某些主存区共享的灵活性。

存储扩充

  • 使用有效的存储管理技术来实现逻辑上的扩充——即虚拟存储技术;
  • 运行的程序应不受主存大小的限制,理想情况下应能运行任意大小的程序。

地址映射

什么是地址映射?

首先,在多用户共享主存时,需要由系统分配主存;

一般情况下,一个作业程序分配到的存储空间和它的地址空间是不一致的;

因此作业的相应进程在处理器上运行时,所要访问的指令和数据的实际地址和地址空间中的地址是不同的;

所以,处理器在执行指令时,必须把逻辑地址转换为绝对地址后,方能访问信息。

地址映射方式

  1. 编程或编译时确定地址映射关系
    • 如果虚——实地址间的对应关系是在程序编写或者程序编译时实现的,则结果为一个不能浮动的程序模块,它必须被放在主存某一确定的地址中,而且永不会改变,因为它所包含的全部地址都是主存地址,在这种情况下,把这样一个程序装入主存,就必须在申请主存时,具体地提出申请的主存容量和主存地址,因此主存分配程序在分配时将没有什么活动余地。
  2. 静态地址映射
  3. 动态地址映射

固定分区存储管理

把主存分成若干个固定大小的存储区(又称存储块),每个存储区分给某一个作业使用,直到该作业完成后才把该存储区归还系统;

分单道作业和多道作业两种情况;

  1. 单用户、单道作业情况
  2. 多道作业情况
    • 操作系统区、用户使用的分区;
    • 主存中分区的区数是固定不变的,每区的大小也是固定不变的;
    • 分给每个作业一块大于或等于作业大小的主存分区,不允许两个作业同时放于同一个分区中;
    • 问题:分区中常有未用的、剩下的空闲部分,即存储碎片,降低了主存的利用率;
    • 存储分块表:主存分区情况说明信息,存储区的使用状况信息,包括大小、位置和状态三项信息。

存储分块表

  • 大小:指出该存储块的大小,以字节为单位;
  • 位置:指出该存储块在主存中的起始地址;
  • 状态:表明该存储块是否已被使用。

储保护功能

  • 一对“界地址寄存器”,如果处理器要访问主存某单元时,系统硬件自动将该单元地址
    与界限寄存器的内容进行比较,以判断此次访问是否合法。

优点:简单,要求的硬件支持只是一对界地址寄存器,软件算法简单;

缺点:主存利用率不高。

可变分区存储管理

所谓可变分区,是指主存事先并未划分成一块块分区,而是在作业进入主存时,按该作业的大小建立分区,分给作业使用;

特点:

  1. 分区个数是可变的,每个分区的大小也是不固定的;
  2. 主存中分布着个数和大小都是变化的空闲分区或碎片,这些空闲分区有些可能相当大,而有些则相当小。

存储分配算法

最佳适应法

  • 从所有未分配的分区中挑选一个最接近作业尺寸且大于或等于作业大小的分区分给要求的作业;
  • 从而使分区内未用部分即碎片最少;

最先适应法

  • 按分区序号从存储分块表的第一个表目起查找该表,把最先找到的且大于或等于作业大小的未分配分区分给要求的作业;
  • 可以缩短查找时间;

最坏适应法

  • 从所有未分配的分区中挑选最大的且大于或等于作业大小的分区分给要求的作业;
  • 可用于可变分区分配技术中。

三种放置策略的说明:

Untitled

碎片问题

由于各作业请求和释放主存块的结果,产生很多小的碎片,碎片的存在降低了多道的程度,造成了主存空间的大量浪费;

解决碎片问题

  1. 把程序分成几部分装入不同的分区中去,改变一直把程序作为一个连续的整体在主存中存放的要求;
    • 改善了碎片问题,但却增加了程度管理和执行的复杂性;
  2. 把小碎片集中起来使之成为一个大分区;
    • 移动各用户分区中的程序,使它们集中于主存的一端,使碎片集中于另一端,从而连成一个完整的大分区,即存储器的“紧缩”或“澄清”。

动态重定位

动态重定位:

是指程序的重定位时机不是在程序执行前进行,而是在程序执行过程中才进行地址转换,更确切地说是在每次访问主存单元前才进行地址转换;

重定位过程:

  1. 首先将用户按相对地址编址的目标程序原封不动地装入主存中分给该用户使用的分区中;
  2. 当该用户程序被调度到处理器上执行时,操作系统自动将该用户作业的起址由作业表中取出,并将分区起始地址减去用户目标程序的相对基地址,然后将其减得值装入定位寄存器中;
  3. 当处理器要访问主存时,地址转换硬件自动将程序中的相对地址与定位寄存器中的内容相加,并按相加的和作为主存绝对地址去访问数据。

采用动态重定位后,由于目标程序装入主存后不需要修改地址指针及所有与地址有关的项,因而程序可在主存中随意浮动而不影响其正确执行,从而可以方便地进行存储器紧缩,较好地解决了碎片问题。

多重分区存储管理

单对界地址管理技术:

  • 每个用户只占据主存的一个分区,存储保护只需使用一对界地址寄存器;
  • 弊病:
    1. 首先,解决碎片问题时,移动程序进行存储器紧缩时需要硬件支持;
    2. 其次,不便于在进程之间共享数据。

多对界地址管理技术:

  • 系统中设置多对界地址寄存器,并且在为每个作业或进程分配主存时,可按界地址寄存器对的个数为其分配多个不相邻接的空闲分区;
  • 该技术既可以改善碎片情况,又便于共享;
  • 但是,在实存管理技术中,多重分区的多重程度不宜过多,否则会增加管理的复杂性。

简单分页存储管理

前述固定分区和可变分区存储技术存在着一定的缺点;

分页技术思想的由来;

分页存储管理技术中的基本作法;

  • 等分主存;(页架、页框、帧)
  • 用户逻辑地址空间的分页;(页)
  • 逻辑地址的表示。(数对(p, d))

主存分配原则;

  • 分页情况下,系统以页架为单位把主存分给进程,分给一个进程的各页架不一定是相邻和连续的;
  • 页表—指出每个进程的各页放在主存的哪些页架中;
  • 分页系统中的地址结构—分为两部分;
  • 页面尺寸应是2的幂—可以省去除法运算,拆分地址场中的数即可。

地址转换过程

  1. 首先将逻辑地址左边表示页号部分的页号抽取出来;
  2. 以页号作为索引查找该进程页表,找出该页存放的主存页架号;
  3. 用此页架号(二进制形式)取代逻辑地址的左边部分,并与右边的页内地址合并成相应的物理地址去访问主存。

简单分页方法的优点

  1. 它基本没有页内碎片,只是在每个进程的最后一页中,会有页内碎片;也不会有小到不可再用的页外碎片,主存的利用率高;
  2. 不管采用哪种数据结构(空闲页架表、位图、空闲页架链表等),分配和释放存储都很快;
  3. 管理简单(类似于固定分区的情况)。

简单分段存储管理

为什么需要按段分配主存

  1. 事先将用户逻辑地址空间连接成一维线性地址空间,既费时又不便于作业的执行,尤其不便于共享;
  2. 因此,人们希望按照程序模块来划分段,并按这些段来分配主存;
  3. 段,就是一组逻辑信息的集合,如子程序、数组和数据区等。

简单分段特点

  • 简单分段的优点是没有段内碎片,只有外部碎片;
  • 简单分段也是基于多重分区技术的进一步发展而来的;
  • 简单分段对用户是可见的,而且分段需要用户提供支持,用户也需要知道系统的最大段长度限制;
  • 当进程被交换出主存时,它的页表或段表也需随进程一起撤出主存。

分段和分页的比较

  • 分段是信息的逻辑单位,由源程序的逻辑结构所决定,用户可见,段长可根据用
    户需要来规定,段起始地址可以从任何主存地址开始;在分段方式中,源程序(段
    号,段内位移)经连结装配后仍保持二维结构。
  • 分页是信息的物理单位,与源程序的逻辑结构无关,用户不可见,页长由系统确
    定,页面只能以页大小的整倍数地址开始。在分页方式中,源程序(页号,页内位
    移)经连结装配后变成了一维结构。
精 灵 王 wechat
👆🏼欢迎扫码关注微信公众号👆🏼
  • 本文作者: 精 灵 王
  • 本文链接: https://jinglingwang.cn/archives/system07
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# 设计模式-行为型 # 设计模式-创建型 # 设计模式-结构型 # 设计 # 系统设计 # 设计模式之美 # 分布式 # Redis # 并发编程 # 个人成长 # 周志明的软件架构课 # 架构 # 单元测试 # LeetCode # 工具 # 位运算 # 读书笔记 # 操作系统 # MySQL # 异步编程 # 技术方案设计 # 集合 # 设计模式 # 三亚 # 游玩 # 转载 # Linux # 观察者模式 # 事件 # Spring # SpringCloud # 实战 # 实战,SpringCloud # 源码分析 # 线程池 # 同步 # 锁 # 线程 # 线程模型 # 动态代理 # 字节码 # 类加载 # 垃圾收集器 # 垃圾回收算法 # 对象创建 # 虚拟机内存 # 内存结构 # Java
(六)操作系统-处理器调度及死锁
(八)操作系统-虚拟存储管理
  • 文章目录
  • 站点概览
精 灵 王

精 灵 王

青春岁月,以此为伴

106 日志
14 分类
48 标签
RSS
Github E-mail
Creative Commons
Links
  • 添加友链说明
© 2023 精 灵 王
渝ICP备2020013371号
0%