Linux深入理解内存管理7

Linux深入理解内存管理7(基于Linux6.6)---页面置换

一、概述

在 Linux 操作系统中,内存管理是一个至关重要的部分,它确保进程能够高效地使用内存资源,同时避免出现内存不足的情况。页面置换(Page Replacement)是 Linux 内存管理中的一个关键技术,涉及当物理内存不足时,如何选择并替换内存中的页面,以保持系统的高效运行。

以下是关于 Linux 页面置换的概述:

1. 什么是页面置换?

页面置换是操作系统内存管理的一部分,用于处理内存不足的情况。操作系统将物理内存划分为若干个固定大小的页(通常是4KB或更大),当进程需要使用某个虚拟页面,而该页面尚未加载到内存时,会触发“缺页异常”(Page Fault)。如果内存中没有足够的空间来加载新的页面,操作系统就需要将某个不常用的页面从内存中移出(即置换出),然后将新页面加载到内存中。

2. 页面置换的触发条件

页面置换通常在以下几种情况下发生:

  • 内存不足:当系统的物理内存不足以容纳所有进程的页面时,操作系统需要进行页面置换。
  • 缺页异常:当一个进程访问了一个尚未加载到内存中的页面,系统会触发缺页异常,触发页表更新并判断是否需要置换页面。
  • 内存压力:在内存压力较大的情况下,操作系统会通过页面置换释放内存资源。

3. Linux 页面置换的工作流程

Linux 页面置换的过程可以分为以下几个步骤:

  1. 缺页异常发生

    • 当进程试图访问的页面不在内存中时,CPU 会触发缺页异常(Page Fault)。操作系统会通过页面表检查该页面的状态。
  2. 查找可替换页面

    • 如果内存满了,操作系统需要从物理内存中选择一个页面进行置换。这个页面一般是一个不常用的页面。Linux 采用不同的策略来选择要替换的页面。
  3. 写回页面

    • 如果被替换的页面有修改过(即脏页),操作系统需要将该页面的内容写回到磁盘(通常是交换区 swap),确保数据不丢失。
  4. 加载新页面

    • 一旦选定页面并写回磁盘后,操作系统会将新页面从磁盘或交换区加载到内存中的空闲位置。
  5. 更新页表

    • 操作系统会更新页表,标记已置换出的页面为不在内存中,并更新新页面的映射关系。
  6. 恢复进程执行

    • 操作系统将控制权返回给进程,进程可以继续执行,访问新的页面。

4. 页面置换算法

当内存中空间不足时,操作系统需要决定哪些页面应该被替换。Linux 使用了多种页面置换算法,最常用的是 LRU(Least Recently Used) 算法的变种。

LRU(最近最少使用)

LRU 算法基于“最近使用”原则,优先替换那些长时间未被访问的页面。Linux 实际上使用了一个近似的 LRU 算法,称为 “LRU Lists”。操作系统将页面分为多个不同的“使用”队列,根据访问频率将页面分配到不同的队列中。最少使用的页面会被置换。

改进的 LRU(带有多个队列)

Linux 中的 LRU 机制实际上并没有直接采用传统的 LRU 算法,而是基于一个改进的 LRU 实现方式,使用多个队列(如 Active ListInactive List)来表示页面的使用状态:

  • Active List:包含那些正在频繁使用的页面。
  • Inactive List:包含那些不活跃的页面,可能是“候选替换页面”。

当系统需要置换页面时,会选择从 Inactive List 中移除页面。如果页面已经被访问过,可能会被重新移动到 Active List 中,表示该页面仍然活跃。

按需求分页和懒加载

Linux 在实现页面置换时还支持 按需分页(On-Demand Paging)和 懒加载(Lazy Loading),即只有在实际访问时才将页面加载到内存中,这种方式可以减少内存的占用并提高效率。

5. Linux 的交换空间(Swap)

当物理内存不足时,Linux 会使用 交换空间(Swap) 来存放不常用的页面。交换空间通常是一个在磁盘上创建的特殊区域(交换分区或交换文件)。当页面被移出内存时,它们会被写入交换空间,待需要时再从交换空间读入。

  • 交换空间的管理:Linux 会监控内存的使用情况,并通过 swap 机制将不常用的页面移到磁盘上。页面置换算法通过控制哪些页面应该被移入交换空间,以保证系统性能。

6. 页面置换的优化

Linux 对页面置换进行了多方面的优化,以提高效率和减少性能损失。以下是一些常见的优化手段:

  • 页面访问频率跟踪:通过跟踪页面的访问频率,操作系统可以选择那些长时间未被访问的页面进行置换。
  • 页表缓存(TLB):通过缓存页表中的映射,减少页面查找的时间,减少由于置换带来的延迟。
  • 批量置换:在某些情况下,Linux 会批量置换多个页面,减少频繁进行页表操作的开销。
  • 调度算法:操作系统通过智能调度进程,使得占用大量内存的进程优先被处理,从而减少系统的内存压力。

7. 页面置换的影响与挑战

页面置换虽然有助于在物理内存不足时提高系统的稳定性,但它也可能带来一些性能开销:

  • 磁盘 I/O 延迟:页面从磁盘加载到内存会引起磁盘 I/O 操作,这通常比内存访问慢得多,因此频繁的页面置换会导致性能大幅下降。
  • 页面抖动(Thrashing):如果系统频繁进行页面置换,进程会被迫不断从磁盘加载页面,导致 CPU 利用率低下,系统陷入“抖动”状态,进程无法有效执行。


二、页面置换算法

当出现缺页异常,需调入新页面而内存已满时,置换算法选择被置换的物理页面,其主要的目的是以尽可能减少页面的调入调出次数,把未来不再访问或短期内不访问的页面调出,以提高系统的性能。

2.1、局部页面置换算法

1. 最优页面置换算法(Optimal Page Replacement, OPT)

基本原理:

最优页面置换算法的基本思路是:在当前进程的页面中,选择未来最长时间内不再使用的页面进行置换。这是理论上最好的置换策略,因为它能够保证替换掉最不可能被再次访问的页面,从而减少页面置换的次数。

特性:

  • 理论最优:最优算法能够提供最低的页面错误率。
  • 不可实现:由于最优算法需要知道未来的页面访问序列,在实际应用中不可实现,通常作为性能的基准算法。
  • 复杂性高:需要预先了解所有后续的页面访问,这在实际运行中是不可行的。

示例:

假设当前内存中有三个页面 [A, B, C],并且下一个要访问的页面序列是 [B, A, D]。根据最优算法,应该选择C进行置换,因为在接下来的访问序列中,C是最后一个被访问的页面。


局部页面置换的选择范围仅限于当前进程占用的物理页面内,其主要由最优算法、先进先出算法、最近最久未使用算法,其基本的原理和特性如下图:

2.2、全局页面置换算法

1. 全局置换算法的基本原理

全局置换算法通过动态地分配每个进程的物理页面,通常以最小化整体缺页率为目标。全局置换算法可以对所有进程的页面进行统一的置换,而不仅仅是局限于单个进程内部。这样做可以更加灵活地使用系统内存,同时避免某个进程因缺页率过高而过度占用内存资源。

全局置换策略通常包括两个重要概念:

  1. 常驻集(Resident Set):是指一个进程当前时刻实际驻留在内存中的页面集合。常驻集的大小决定了进程能够有效进行内存访问的能力,常驻集大小越大,进程能够使用的内存越多,访问的速度也越快。

  2. 工作集(Working Set):是指在某个特定时间段内,进程正在频繁访问的页面集合。工作集代表了进程在某一时间范围内的内存需求,它反映了进程运行时的局部性(时间局部性和空间局部性)。在操作系统中,通常会根据进程的工作集来调整其常驻集的大小,从而确保进程能够尽量避免频繁的缺页。

2. 全局置换算法的类型

全局置换算法可以分为两种常见类型:

  1. 工作集置换算法(Working Set Replacement Algorithm)

    工作集置换算法基于每个进程的工作集来动态调整常驻集的大小。在该算法中,操作系统会根据进程的工作集大小,计算每个进程在当前时间段内需要的页面数,并根据这些信息来决定页面置换策略。工作集置换算法的核心目标是尽量让进程的常驻集大小与其工作集大小匹配,避免因为常驻集过小而导致频繁的缺页。

    • 工作集的确定:通常使用时间窗口(如过去一段时间内的访问记录)来确定进程的工作集。若工作集大小超过进程的常驻集大小,则会发生缺页,系统可能需要置换掉其他进程的页面。
    • 适应性强:工作集置换算法能够适应不同进程的访问模式和资源需求,在多任务环境中较为有效。

    工作集置换算法的基本步骤

    • 定期检查每个进程的工作集大小。
    • 如果某个进程的工作集大小大于其常驻集大小,则该进程会优先从内存中获得更多的页面。
    • 如果内存不足,操作系统会选择其他进程的页面进行替换,直到所有进程的常驻集能够匹配各自的工作集。
  2. 缺页率置换算法(Page Fault Rate Replacement Algorithm)

    缺页率置换算法的基本思想是通过动态调整每个进程的常驻集大小,以最小化系统的整体缺页率。在这种算法中,操作系统会根据进程的缺页率来动态地调整每个进程的内存分配。若一个进程的缺页率较高,说明它需要更多的内存来满足其访问需求,此时系统可能会增加该进程的常驻集大小,并从其他进程中减少分配的页面。

    • 基于缺页率的决策:系统会根据每个进程的缺页率,适时地调整每个进程的常驻集大小,进而调节全局的内存资源分配。
    • 适用于内存充裕的系统:当系统内存足够时,缺页率置换算法能够较好地平衡各进程之间的内存分配,避免某个进程由于缺页而影响其他进程的执行效率。

    缺页率置换算法的基本步骤

    • 监控每个进程的缺页率。
    • 若某进程的缺页率过高,尝试增加其常驻集的大小。
    • 若内存不足,减少其他进程的常驻集,优先将页面换出。
    • 继续优化进程的常驻集和内存分配,直到系统整体缺页率达到最小。

3. 全局置换算法的优缺点

算法类型优点缺点
工作集置换算法- 能根据进程的动态需求调整内存分配<br>- 确保每个进程有足够的内存来执行当前任务- 需要实时跟踪每个进程的工作集,管理开销较大<br>- 确定工作集的时间窗口选择可能影响效果
缺页率置换算法- 通过缺页率来动态调整常驻集大小,避免资源浪费<br>- 能平衡系统内存分配- 对内存资源有较高的需求,可能导致频繁的页面置换<br>- 系统可能会花费大量时间和资源来监控缺页率

在局部算法里面并没有考虑各个进程之间的访存差异,全局置换算法为进程分配可变数目的物理页面。常驻集是指进程在运行时,当前时刻实际驻留在内存当中的页面集合。而工作集是进行再运行过程所固有的特征。置换算法的工作就是在进程的工作集的前提下,确定常驻集的大小以及相应页面。

对于全局置换算法,其又可以分为工作集置换算法和缺页率置换算法,其原理如下图:

1.3、页面锁定

采用虚拟存储技术后,会产生缺页机制,缺页机制又会带来系统的开销,那么就会使得进程运行的时间变得越来越不确定,那么操作系统就导入了页面锁定技术,给每一个页增加一个页面锁定位。通过设置相应的锁定位,不让操作系统将操作系统使用的页面置换出内存,避免产生由交换过程带来的不确定性延迟,如以下的

  • 1.操作系统核心代码
  • 2.关键数据结构
  • 3.I/O缓冲区

1. 页面锁定技术

为了应对虚拟存储带来的缺页开销,操作系统引入了页面锁定技术。该技术通过给每个页面设置一个锁定位,防止这些页面被替换出去,从而确保这些页面在内存中保持不被交换,直到锁定解除。

2. 页面锁定的工作原理

  1. 页面锁定位:每个页面(或页框)都有一个锁定位(Lock bit),操作系统通过该锁定位来判断一个页面是否可以被置换出内存。如果页面被锁定(即锁定位被设置为“1”),该页面就不能被置换出去。

  2. 锁定页面的使用

    • 关键数据的锁定:操作系统或程序可以选择锁定某些关键数据或代码页面,以确保这些页面在程序运行过程中始终驻留在内存中。例如,操作系统内核代码或某些需要高性能的应用程序可能会锁定其常用页面,以避免缺页导致的性能损失。
    • 锁定内核空间:操作系统通常会锁定内核的页面,防止它们在操作系统运行时被换出,因为如果内核页面被置换出内存,会导致系统崩溃或响应延迟。
  3. 锁定的解除:在需要时,锁定的页面可以通过操作系统的调度策略被解锁。解锁后的页面可以参与常规的页面置换机制。

3. 页面锁定的优点

  1. 减少缺页开销:通过锁定关键页面,可以避免它们频繁被置换,从而减少缺页中断的发生,提升系统的整体性能,尤其是在对时间敏感的任务中。

  2. 提高性能:锁定关键页面避免了大量不必要的页面置换操作,特别是在需要快速响应的系统或实时系统中,页面锁定是至关重要的。

  3. 保证关键任务的稳定性:某些进程(如操作系统内核、硬件驱动程序、实时任务等)需要始终在内存中驻留,页面锁定技术可以确保它们不会被换出,从而提高系统的可靠性和稳定性。

4. 页面锁定的缺点

  1. 内存管理复杂性增加:页面锁定使得内存管理更加复杂,因为操作系统需要追踪哪些页面被锁定,哪些页面是可以被置换的。如果锁定的页面数量过多,可能导致内存资源紧张,影响系统的内存利用效率。

  2. 内存浪费:如果过多的页面被锁定,可能会导致内存中存储着大量不能使用的页面,从而影响其他进程的内存分配。这可能会导致内存的浪费,尤其是在内存资源较为有限的环境中。

  3. 降低灵活性:页面锁定限制了操作系统在内存页面置换中的灵活性,可能会导致某些不重要的页面无法被及时置换,影响其他进程的内存需求。

5. 页面锁定的实现机制

操作系统中的页面锁定通常通过以下方式实现:

  • 锁定位:在每个页面的描述符中增加一个锁定位(Lock bit),当该页面被锁定时,该锁定位为1,表示该页面不能被交换出去。

  • 锁定系统调用:操作系统提供一些系统调用或API,允许程序或操作系统本身将特定的页面进行锁定。例如,UNIX系统中,mlock 系列函数可以用来锁定进程的内存页,Windows中则有类似的 VirtualLock 函数。

  • 内存分页管理:操作系统的内存管理子系统会在页面访问时,检查页面的锁定状态。如果页面被锁定,则忽略置换机制;如果没有锁定,则根据页面置换算法(如LRU、FIFO等)进行相应的置换。

三、Linux的页面置换算法

对于虚拟页式存储系统的工作的最佳状态,发生缺页的时候,系统中有大量的空闲页表,使得系统中保存一定数目的空闲页框。对于该问题,linux设计了一个分页的守护进程,多数的时候休眠,可定期唤醒以检查内存状态,其需要定时做以下操作

  • 如果空闲页框过少,分页守护进程通过预定的页面置换算法选择页面换出内存
  • 如果页面装入内存后被修改,则将他们写回磁盘,分页守护进程可保证所有的空闲页是干净的

对于页面置换的算法,linux采用的是守护进程和缓冲技术来解决该问题,在后期的swap技术进项详细分析。

1. 虚拟页式存储系统的最佳状态

在虚拟页式存储系统中,操作系统通过虚拟内存管理实现了物理内存的分页,进程和系统可以使用比实际物理内存更大的虚拟内存空间。当进程访问一个不在物理内存中的页面时,会发生缺页中断,操作系统需要将页面从磁盘加载到内存中。为了保持系统的高效运行,Linux 设计了内存管理机制来保证虚拟内存的有效性,避免频繁的内存交换导致性能问题。

2. 分页守护进程(Page Daemon)

分页守护进程是 Linux 中负责内存管理的重要组成部分,作用是定期检查和维护系统内存的健康状态。守护进程根据系统的内存状况决定何时触发页面置换。具体来说,它的任务包括:

(1)当空闲页框不足时触发页面置换

当系统中的空闲页框(用于存放页面的物理内存块)过少时,分页守护进程会定期唤醒,启动页面置换算法来腾出内存空间。操作系统会选择一个合适的页面将其换出,以确保内存的持续使用。例如,常见的页面置换算法有 LRU(Least Recently Used)Clock 算法。这些算法通过选择不再被频繁访问的页面进行置换,从而有效管理内存。

(2)处理脏页面

在页面置换过程中,系统必须区分干净页面脏页面。干净页面是指没有被修改过的页面,而脏页面是指内容发生过变化的页面。在将页面换出内存时,脏页面需要先被写回磁盘,以防止数据丢失。分页守护进程负责这一操作,确保所有换出的页面都是干净的,或者如果是脏页面,它会被正确写回磁盘。

(3)空闲页框管理

分页守护进程确保系统在内存压力较大时,仍然能够保持足够的空闲页框。这是通过以下操作实现的:

  • 主动回收:当内存使用达到一定阈值时,守护进程会主动执行页面置换,将不再频繁使用的页面换出内存。
  • 减少页面脏化:通过将修改过的页面及时写回磁盘,避免页面脏化导致频繁的磁盘 I/O。

3. 页面置换算法与缓冲技术

在 Linux 的页面置换系统中,通常会结合多种技术来提高性能:

(1)缓冲技术(Buffering)

Linux 使用缓冲区来缓存磁盘的读取和写入操作,这有助于减少直接 I/O 操作的频率。当需要从磁盘中读取页面时,Linux 会先将该页面加载到内存中的缓冲区中,然后再根据需要将其加载到进程的虚拟内存中。这样,缓冲技术能够减少磁盘访问的延迟,提高系统性能。

(2)内存回收(Page Reclaiming)

Linux 会定期进行内存回收操作,即通过页面置换机制清理不再需要的页面。Linux 内核会跟踪每个页面的使用状态,决定哪些页面需要被换出。回收策略依赖于内存压力(即空闲内存的多少)以及页面的访问频率。常用的回收算法包括:

  • LRU(最少使用):将长时间未被访问的页面换出。
  • Clock 算法:在 LRU 的基础上进行优化,减少开销。
  • Swap 分区:当内存和缓存不足时,系统会将部分页面写入 swap 分区(即磁盘的交换空间),以释放内存供其他进程使用。

4. Swap 技术的详细分析

Swap 技术是 Linux 页面置换机制中的重要组成部分,涉及虚拟内存的扩展。当系统内存资源紧张时,Linux 会将一些不常使用的内存页面暂时交换到磁盘上的 swap 空间中,释放物理内存用于更重要的任务。具体的 swap 操作和性能优化策略通常在后续章节进行详细分析,但在这里可以简要介绍:

  • Swap 空间的使用:当系统内存不足时,Linux 会将部分内存页面交换到 swap 空间(通常是磁盘上的一个区域),以便释放物理内存。
  • Swap 页面管理:Linux 会在页面置换时根据页面的访问频率和重要性选择哪些页面需要换入或换出,并管理与 swap 相关的页面状态(脏页面、干净页面等)。
  • 性能影响:虽然 Swap 可以提供额外的虚拟内存,但磁盘 I/O 的速度远远慢于 RAM,因此过度依赖 swap 会导致系统性能下降。操作系统需要合理平衡内存与 swap 的使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值