📂 操作系统 - Operating System / Chapter II 虚拟化 / Section 2 内存虚拟化 / 2-3 超越物理内存

策略:应对内存压力

2026-05-14
#OS
  • 内存不够了怎么办

    • 当系统需要空闲内存或将硬盘中的页换入内存,而你的物理内存已经全部被占满时,迫于内存压力(Memory pressure),系统需要将一些页换出(Paging out),为所需的页提供空间。
    • OS通过替换策略(Replacement policy) 来决定要踢出(Evict) 哪些页
  • 缓存管理

    • 由于物理内存中只含有所有页中的子集,所以就相当于我们将一些页放进了缓存(Cache) ,我们的目标就是让缓存未命中(Cache miss)最少,让缓存命中(Cache hit)最多
    • 我们可以计算程序的平均内存访问时间(AMAT, Average memory access time): $AMAT = (P_Hit * T_M) + (P_Miss * T_D)$
      • $T_M$为访问内存的成本
      • $T_D$为访问磁盘的成本
      • $P_Hit$为缓存命中的概率
      • $P_Miss$为缓存未命中的概率($P_Miss = 1 - P_Hit$)
    • 我们需要做的,就是让AMAT更高
  • 策略

    • 最优替换策略

      • 最优(Optimal)替换策略(原先叫做MIN)是指替换内存中在最远将来才会被访问到的页,但显然它难以实现
      • 通过与最优替换策略比较,我们可以衡量各个策略的性能
    • 简单策略:FIFO

      • FIFO策略非常好理解,通过先进先出的队列规则,让新来的页替换掉最早来的页
      • 它不够智能,无法理解每一页的重要性之分,也无法根据重要性来判断该替换什么页
    • 简单策略:随机

      • 随机策略就更简单了,直接随便找一个页踢掉,换成新来的页
      • 显然,随机策略的性能如何完全看运气
    • 利用历史记录的策略:最近最少使用(LRU)

      • 最近最少使用(LRU, Least-recently-used) 可以顾名思义:如果一个页在近期内被访问了很多次,那么说明它很可能很重要,不应该被替换;而如果一个页在近期一段时间内很少被访问,那么说明它可能不那么被需要,可以被替换
      • LRU使用了一个历史信息:频率(Frequency),是基于局部性原则(Principle of location)
      • 于此类似的,还有很多利用历史记录的策略,例如最不经常使用(Least-frequently-used)
    • 近似LRU

      • 我们在硬件中增加一个使用位(Use bit),也被称为引用位(Reference bit)每个页都拥有一个对应使用位。当页被引用时,硬件会将使用位置1。不过置0的操作不会由硬件完成,而是由操作系统完成
      • 这个位可能存储在页表中,也可能存储在什么别的数组里
      • 我们可以有多种方法来通过使用位实现近似LRU,例如时钟算法(Clock algorithm)
        • 维护一个时钟指针(Clock hand),它开始时指向某个特定的页
        • 当需要进行页替换时,OS会检查当前时钟指针指向的页P的使用位是0还是1 - 若是1,则意味着该页P最近刚被使用,那么P不适合被替换。然后将P的使用位置0时钟指针递增到下一页(P+1),并检查P+1页 - 若是0,则意味着该页最近没被使用过,可以用这一页来替换
    • 考虑脏页

      • 如果一个页已被修改(Modified),并因此变脏(Dirty) ,则踢出它后就必须将它换入磁盘,因为我们不能丢失那些修改
      • 对于一个页没有被修改,是干净(Clean)的,那么物理帧可以被直接用于其他目的,而不需要将当前页换入磁盘,这可以节省硬盘I/O开销
      • 因此,一些系统更倾向于踢出干净页而不是脏页
      • 硬件可以通过存储一个修改位(Modified bit),又名脏位(Dirty bit),来记录一个页是否被修改过