段式管理

段指的是一些有相似功能的程序集合(不是准确描述),例如程序段,代码段,全局变量段等。

段的分配算法

固定分区法

事先把磁盘分为大小固定的分区,之后有进程来了就将它放入可以容纳的分区中。每个分区大小可以不一样,如4k,8k等。

这种方法最大的问题就是会产生很大的内碎片。例如没有空间使用了,然后来了一个大小为1k的进程,这时一块16k的分区释放了,这个进程只能进这个空间,于是浪费了15k的空间。

还可以对每个大小的分区使用一个列表。列表中存放的是可以被这个空间容纳的进程。进程先是按照大小分配到这些列表中,然后再进行运行。

这种方法可以减小每个分区的内碎片,但是不一定能提高系统总的空间利用率,因为可能进程集中于某一个大小的分区,这样其他的分区就没有得到充分利用。

可变分区法

可变分区法就是开始不分区,等进程来了之后再分配它需要的大小给他。这种方法可以使用一个链表进行维护,每次来了一个进程就记录内存起始位置和终止位置。

  • 最先适配:从一个方向进行扫描,找到第一个可以容纳的空间放入进程
  • 下次适配:从上次分配的地方开始扫描,实际上差别并不大

此外还有两种有两种策略,最好匹配和最差匹配。最好匹配指的是每次都把这个进程分配到最大的空间中,而最差匹配是指每次都把它分配到可分配区域的最小区域中。

但是这两种分配方法都无法解决外碎片的问题。但操作系统运行一段时间后,内存中的可用区间的大小会越来越小,虽然合并起来有空间但是无法使用。这时候就需要将这些外碎片整合到一起,叫做内存紧缩。内存整理需要大量的时间。

交换技术

交换技术指的是将暂时不需要使用的进程送到外存中,空出足够的空间给需要的进程使用。

请求式分段技术和缺页替换类似。请求式分段技术和交换技术的区别是

交换技术需要交换整个进程,而请求式分段技术只需要交换一个段。

覆盖技术

覆盖技术交换同一个进程中的段的技术,它按照时间先后顺序依次替换某些段。在需要时就由程序员控制进行替换。

这种技术和请求式分段的最大区别是:

请求式分段是操作系统进行的,而覆盖技术的段交换需要程序员自己把握。

页的分配方法

虚拟内存

缓存

段分配和页分配比较

段式管理的优点:

  • 分段比分页更有逻辑性,将同类的或相关的内容放在一个段内,这样不会由于页面置换算法选择不当而形成“抖动”现象。
  • 同类内容划分在一个段内,可以实现段的保护,如代码段设置为只读,数据段设置为读写
  • 公共代码段可以通过映射共享到多个进程。

段式管理的缺点:

  • 段体积大,在内存中无法不连续存储,易形成内存外碎片,降低内存利用率。

页式管理的优点:

  • 没有外部碎片,最后一页可能有内碎片但不大;程序不必连续存放;便于改变程序占用空间大小

页式管理的缺点:

  • 逻辑地址空间划分只简单依靠页面大小,缺乏内在逻辑性,导致一方面相关内容被分散 到多页上,页面置换不当时容易造成内存抖动,另一方面不同性质的内容被分到同一页中,使得页面 权限保护设置困难

段页式内存管理是将逻辑地址分成三个部分,分别是段号,页号和页内偏移。有一个段表记录了每个段包含页的起始地址。

进行地址变换时,首先通过段表找到页表起始地址,然后再通过页表找到物理地址。这种方法和IA-32的保护机制实际上是不一样的。IA-32实际上进行了两步操作(线性地址翻译和物理地址翻译),但是这里实际上是一步操作(地址翻译)。

段页式管理:

  • 先分段再分页,以段为单位调入调出,以页为单位在内存中不连续存储,既保证了相关内容 同时进出内存,便于设置权限保护,又可以充分利用内存空间。 段页式结构复杂,实现起来效率低,所以没有被广泛采用。