0%

内存管理

虚拟内存

虚拟内存使得物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。虚拟内存允许执行中的进程只有部分在内存中,因此程序可以比物理内存大。而且虚拟内存将内存抽象成一个巨大的数组,将用户视界的逻辑内存与物理内存分离,使得程序员不受内存存储的限制。虚拟内存展现在程序员面前的是一个比物理内存要大得多的、地址连续的内存空间,而事实上是映射到支离破碎的物理内存,乃至磁盘上。

分页存储管理

逻辑空间分页,物理空间分块,页与块同样大,页连续块离散,用页号查页表,由硬件做转换,页面和内存块大小一般选为2的若干次幂。
页表作用:实现从页号到物理地址的映射
将用户程序的逻辑地址空间分为若干个固定大小的区域,称为“页”或“页面”,典型的页面大小为1KB;相应地,内存空间分成若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。
一个虚拟地址分成两个部分,前一部分存储页面号,后一部分存储偏移量。
内存管理单元(MMU)管理着地址空间和物理内存的转换,其中的页表(Page table)存储着页(程序地址空间)和页框(物理内存空间)的映射表。

页面置换算法

在程序运行过程中,如果要访问的页面不在内存中,就会发生缺页中断,将缺页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。算法的主要目标是使页面置换频率最低(缺页率最低)。

  • 最佳置换算法:所选择的被换出的页面将是最长时间内不再被访问,通常可以保证获得最低的缺页率。(理想化的,不可实现,因为无法知道一个页面多长时间不再被访问)
  • 最近最久未使用LRU,Least Recently Used):将最近最久未使用的页面换出。
  • 最近未使用NRU,Not Recently Used):有两个状态位R与M,页面被访问时置R = 1, 页面被修改时置M = 1。
    当发生缺页中断时,NRU 算法随机地从类编号最小的非空类中挑选一个页面将它换出。
    NRU 优先换出已经被修改的脏页面(R=0,M=1),而不是被频繁使用的干净页面(R=1,M=0)。
  • 先进先出FIFO):简单,但是会把经常被访问的页面换出,提高了缺页率。
  • 第二次机会算法 (FIFO的改进):为每个页面设置了一个访问标志位R,对该页面访问时将该位置1;需要页面置换时,检查最老页面的R值,0立即替换;1则清零后放入链表尾部,重新搜索。
  • 时钟(第二次机会算法的改进):采用环形链表。

分段式存储管理

使用分页系统的一维地址空间,其动态增长的特点会出现覆盖的问题。为了使程序和数据划分开来,不出现覆盖问题而使用分段,程序和数据就在逻辑上拥有独立的地址空间。
分段是一种二维结构,把每个表分成段,一个段构成一个独立的地址空间。每个段的长度可以不同,并且可以动态增长。
段的长度由相应的逻辑信息组的长度决定,因而各段长度不等,引入分段存储管理方式的目的主要是为了满足用户(程序员)在编程和使用上多方面的要求。完整的逻辑意义信息,就是说将程序分页时,页的大小是固定的,只根据页面大小大小死生生的将程序切割开;而分段时比较灵活,只有一段程序有了完整的意义才将这一段切割开。(例如将一个人每隔50厘米切割一段,即为分页;而将一个人分割为头部、身体、腿部(有完整逻辑意义)三段,即为分段)

段页式

程序的地址空间划分成多个拥有独立地址空间的段,每个段上的地址空间划分成大小相同的页。这样既拥有分段系统的共享和保护,又拥有分页系统的虚拟内存功能。(地址空间分段,分段的基础上再分页)

分页与分段的比较

  • 对程序员的透明性:分页透明,但是分段需要程序员显式划分每个段。
  • 地址空间的维度:分页是一维地址空间,分段是二维的。
  • 大小是否可以改变:页的大小不可变,段的大小可以动态改变。
  • 出现的原因:分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护。

参考资料

CS-Notes