Lazy loaded image
操作系统
👏分段
Words 1343Read Time 4 min
2025-3-20
2025-4-6
type
status
date
slug
summary
tags
category
icon
password
类型
标签
状态

分段存储管理

在一维地址空间中,当有多个动态增加的表时,一个表可能会与另一个表发生碰撞。
如果一个程序有非常多的变量,但是其他部分都是正常数量时,地址空间中分给符号表的块可能会被装满,但这时其他表中还有大量的空间。
notion image
通过在机器上提供多个相互独立的段(segment)的地址空间,能够把程序员从管理表的扩展和收缩的工作中解放出来。
每个段由一个从0到最大的线性地址序列构成。各个段的长度可以是0到某个允许的最大值之间的任何一个值。不同的段的长度可以不同,并且通常情况下也都不相同。段的长度在运行期间可以动态改变,比如,堆栈段的长度在数据被压入时会增长,在数据被弹出时又会减小。
每个段都构成了一个独立的地址空间,它们可以独立地增长或者减小而不会影响到其他的段。如果一个在某个段中的堆栈需要更多的空间,他就可以立刻得到所需的空间。
notion image
分段的优点还有:
  • 如果每个进程都位于一个独立的段中并且起始地址是0,那么把独立编译好的过程链接起来的操作就能得到简化。
  • 有助于在几个进程间共享过程和数据。(共享库)
分页与分段的比较:
notion image
一般来说,一个段中不会既包含一个过程又包含一个堆栈,而是只会包含其中一个。也就是因为该特性,段就可以设置针对当前的特定类型的何时的保护。
在分段系统中,由于用户会认为所有的段都一直在内存中,也就是说他可以当作所有这些段都在内存中那样去访问,他可以分别保护各个段,所以不需要关心覆盖它们的管理工作。
  1. 纯分段的实现
    1. 页面是定长的而段不是,下图所示的物理内存在出生时包含了五个段:
      notion image
      当段1被淘汰后,比它小的段7放在它的位置时,段7和段2间是一个未使用的区域,即一个空闲区。随后被段4和段5代替;段3被段6代替。在OS运行一段时间后内存被划分为许多快,一些快包含着段,一些成为了空闲区,这种现象称为棋盘型碎片或外部碎片(external fragmentation)。空闲区的存在使一些内存被浪费了,而这可以通过内存紧缩来解决。
  1. 分页和分段的结合—MULTICS
    1. 如果一个段比较大,把它整个保存在内存中可能很不方便甚至是不可能的,我们可以选择对它进行分页,这样只要那些真正需要的页面才会被调入内存。
      MULTICS为每个进程提供了最多 个段(超过250 000个),每个段的虚拟地址空间最长为65 536个(36位)字长。它将每个段看作一个虚拟内存并对其进行分页,以结合分页的优(统一的页面大小和在只使用段的一部分时不会把它全部调入内存)和段的优点(易于编程、模块化、保护和共享)。
      每个MULTICS程序都有一个段表,每个段对应一个描述符。一个段描述符包含了一个段是否在内存中的标志,只要一个段的任何一部分在内存中这个段就被认为是在内存中,并且它的页表也会在内存中。
      notion image
      每个段都是一个普通的虚拟内存地址空间,与非分段式分页存储相同的方式进行分页。
      MULTICS中一个地址由两部分构成:段和段内地址。段内地址又进一步分为页号和页内的字:
      notion image
      在访问内存时,执行这样的算法:
      notion image
    2. 根据段号找到段描述符号
    3. 检查该段的页号是否在内存中。如果在,则找到它的位置;如果不在,则产生一个段错误。如果访问违反了段的保护要求就发出一个越界错误(陷阱)。
    4. 检查所请求虚拟页面的页表项,如果该页面不在内存中则产生一个缺页中断,如果在内存就从页表项中取出这个页面在内存中的起始地址。
    5. 把偏移量加到页面的起始地址上,得到要访问的字在内存中的地址。
    6. 最后进行读或写操作。
上一篇
浮点数
下一篇
随记-1