一、 分段
程序的逻辑关系被划分为不同的段,每个段有一个段名,并且每个段都从0开始编址。这些段在内存中分配,每个段占据连续的内存空间,但不同段之间可以不相邻。
这种分段管理有一些特点和优势:
-
逻辑划分: 每个段都有一个明确定义的逻辑关系,这有助于程序员理解和维护代码。
-
段名标识: 段名用于在低级语言中编程,使程序员能够直接引用特定的段。
-
内存分配灵活: 段在内存中占据连续空间,但不同段之间可以不相邻,这提供了更大的灵活性,允许进程的地址空间可以不需要完全连续。
-
模块化: 通过将程序划分为逻辑上相关的段,可以实现更好的模块化和代码组织。
-
代码复用: 不同的段可以独立地进行编译和链接,有助于代码的重用和维护。
在这种管理方式下,操作系统负责将程序的不同段加载到内存中,并维护它们之间的关系。这种分段管理的一个缺点是可能会产生外部碎片,因为不同段可以在内存中不相邻,导致一些零散的未被使用的内存空间。为了解决这个问题,一些系统引入了分页管理,将内存进一步划分为页面,以更好地利用内存空间。
页是信息的物理单位。分页的主要目的是为了实现离散分配,提高内存利用率。分页仅仅是系统管理上的需要,完全是系统行为,对用户是不可见的。
段是信息的逻辑单位。分段的主要目的是更好地满足用户需求。一个段通常包含着一组属于一个逻辑模块的信息。分段对用户是可见的,用户编程时需要显式地给出段名。
页的大小固定且由系统决定。段的长度却不固定,决定于用户编写的程序。分页的用户进程地址空间是一维的,程序员只需给出一个记忆符即可表示一个地址。分段的用户进程地址空间是二维的,程序员在标识一个地址时,既要给出段名,也要给出段内地址。
分段比分页更容易实现信息的共享和保护
-
分段:
- 特点:将信息分割成较小的单元,每个单元都包含一定量的信息。
- 信息共享:容易实现信息的局部共享,只需分享特定段落或单元。
- 信息保护:可以更灵活地控制对不同段落或单元的访问权限,实现细粒度的权限管理。
- 实现难度:相对较容易实现,不需要考虑整体结构的完整性。
-
分页:
- 特点:将信息分割成页面,每个页面包含多个段落或单元。
- 信息共享:整页分享,不如分段灵活,需要分享更多信息。
- 信息保护:权限控制相对整页更为复杂,可能需要更高级的权限管理系统。
- 实现难度:在某些情况下可能比较容易实现,但可能需要更多的系统资源
分页(单级页表):第一次访存一一查内存中的页表,第二次访存一一访问目标内存单元。总共两次访存分段:第一次访存一一查内存中的段表,第二次访存一一访问目标内存单元。总共两次访存与分页系统类似,分段系统中也可以引入快表机构,将近期访问过的段表项放到快表中,这样可以少一次访问,加快地址变换速度。
二、段页式管理
-
段页管理(Segmentation with Paging):
- 结合方式:将程序的地址空间首先划分为若干段,每个段内再使用分页技术。
- 优点:克服了分段和分页各自的缺点,提供了更灵活和高效的内存管理。
- 实现:使用段表来映射段的基址和长度,每个段内使用页表来映射页的逻辑地址到物理地址。
- 灵活性:可以在段内采用不同大小的页,提高对不同类型数据的适应性。
-
工作流程:
- 当程序引用一个地址时,先通过段表找到对应的段。
- 接着,通过页表找到该地址在段内的具体位置。
- 最后,得到物理地址,可以访问实际的数据。
段页管理结合了分段和分页的优点,提供了更灵活和高效的内存管理方式。这种方式在现代操作系统中广泛应用,允许了更好的内存利用率、虚拟内存支持以及动态增长的特性。