在分段之前,操作系统会直接把进程的地址空间完整的加载到内存当中,但是栈和堆中间却有很大一块空间没有使用,如下图:

image-20230417134359838

但是由于进程的地址空间被加载到了内存中,那么就意味着这些虚拟的地址空间都会被分配对应的物理地址,虽然这些地址没有被该进程写入内容,但是他们已经不能再分配给其他进程使用。

为了解决这个问题,引入了分段的概念。有了分段的概念后,就不是给每个地址空间一个寄存器,而是让地址空间内的每个段都有自己的基址寄存器和界限寄存器。一个段是地址空间中连续的定长区域。

这样设计,就可以把进程的单个段加载到内存中,而不是将整个地址空间都加载到内存中,这样就能确保被加载到物理内存空间中的内容都是正在使用的,或者说最小程度的浪费一些空间。

在经典的地址空间中,有三个逻辑不同的段:代码,栈和堆。分段之后,我们可以把这三个部分分别加载到物理内存对应的位置,如下图所示:

image-20230417141138659

而不需要像之前那样,必须把整个地址空间全部加载到内存当中。

分段存在的问题

分段的出现会导致内存中零散的分布很多的段,如果现在有不连续的24k空间,现在有一个20k大小的段,则会导致该段进入内存失败。

即分段会造成一定的外部碎片。

注意

这篇笔记是在学习操作系统导论时写的,该书采用的是层层递进的方式,由最初的设计,存在什么问题,一步一步解决问题,更改设计,得到一个现代的操作设计方案。所以本文中有些内容可能并非目前操作系统正确的设计。

参考

《操作系统导论》