操作系统 分段管理

一、分段式存储管理的引入:
1、信息共享问题:没有在逻辑上划分程序,有时在一个页面中会包含毫不相关的两段代码,使得信息共享不方便。
2、动态链接问题:一个大的程序可能包含数百、数千个程序模块构成,很多用户希望在程序执行过程中装入、动态连接所需模块,降低对内存需求,提高装载效率,而分区管理和页式管理只能采用静态链接。

二、基本思想

  • 把程序按内容或过程(函数)关系分成段,每段有自己的名字,每个段一个地址空间
  • 在装入内存后,每个段占用一片连续的存储区域,而各段之间可以不连续,可按段进行存储共享和保护。
  • 分段存储方式给用户提供了更方便灵活的程序设计环境。
  • 段式管理可将那些经常访问的段驻留内存,而把那些在将来一段时间内不被访问的段放入外存,待需要时自动调入的方法实现二维虚拟存储器,较好地支持虚拟存储器

三、地址规划

  • 给各个段安排一个从0开始的编号,各段内的每个单元(指令或数据)都有一个相对于该段起始地址的偏离值。
  • 逻辑地址要用两个成分来表示: 段号s和段内地址d。 即 在分段存储情况下, 作业的逻辑地址空间是二维的(每个段包含一部分的地址空间,又标识了逻辑关系)

四、内存分配
以段为单位进行分配,给每一个段分配一个连续的内存分区,各个分区的大小是对应段大小来决定的(这个对应的是虚拟地址)
在这里插入图片描述

五、段管理(段表)

  • 每个段在段表中占有一项。 段表项中一般应包含以下内容: 段号、 段的长度、 段在内存中的起始地址(又称“基址”)等。
  • 段表实现了从虚拟地址到物理地址的映射
    在这里插入图片描述
    操作系统 分段管理_第1张图片
    六、地址映射
  • 首先段号和控制寄存器中的段表长度比较,看是否越界,越界产生中断信号,执行中断程序
  • 段号+段表起始(控制寄存器中)=对应表项的位置,从这个位置读取这个段在内存中的起始地址(在下面的例子中,是读取到8k=8192这个起始地址)
  • 检查段内地址(也就是位偏移量的数值,这里是100)会不会超过段长(这里是500),如果超过就中断,执行中断程序
  • 没有越界,基址+位偏移量(段内地址)=物理地址(这里是100+8k=8292)
  • 我个人理解就是段号2在内存中已经分配了长度为500的内存(也就是8192-8692中的部分),然后实际上我们需要的只是从8292开始的那个。
    操作系统 分段管理_第2张图片

七、总结分段存储管理的碎片问题

  • 结论:分段管理是会产生外部碎片,但是不会产生内部碎片
    • 这个其实和动态分区很类似,就是程序员指明分段之后,内存会给程序段分配刚好能够满足程序段需求的内存大小,这样当然不会产生内部碎片,但是会产生外部碎片

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