3.7 分段
有两个或者多个独立的地址空间可能比只有一个要好得多。因为程序在运行的过程中有些部分会不断增长,如果只用一维的线性空间可能会有很多问题。由此产生了段的概念。
通用的解决方案是在机器上提供多个互相独立的称为段(segment)的地址空间。每个段由一个从0到最大的线性地址序列构成。各个段的长度可以是0-某个运行的最大值之间的任何值。不同的段长度一般都是不同的。并且在运行期间可以动态的改变。
这样程序在运行的时候就需要提供两个地址,段号和段内地址。
段是一个逻辑实体,程序员知道这一点并把它们作为一个逻辑实体来使用。可能包括一个过程、一个数组等,但是一般它不会同时包含多种不同类型的内容。
- 段的优点
- 每个过程如果都是位于一个独立的段中间的话,并且起始地址是0的话,那么单独编译好的过程连接起来操作就可以得到很大的简化。
- 如果对程序进行修改的话,即使做很大的修改也只需要对修改的部分重新编译。原先的其他部分任然可以使用。
- 分段对于进程间共享数据和过程也是有利的。常见的例子就是共享库。分段系统中可以把共享库单独放到给段中。这样不需要每个进程都放一个共享库的副本。
- 由于每个段都是一个逻辑实体,因此可以针对不同的段提供不同的访问权限。而这在一维分页储存中是没有意义的。
- 与分页系统相同,分段系统是对上层封装完好的。用户会认为段一直都在内存中。
3.7.1纯分段的实现
段的长度是不同的,除此之外在实现方面与分页的基本思路没有什么区别。也会产生棋盘型碎片或称外部碎片(external fragmentation)
3.7.2 分段和分页的结合
书上介绍了两个例子。简单的说用我的理解是先进行分段然后对各个分段在进行分页处理。