一、引入
加载程序会将程序代码全部从磁盘中加载进内存吗?
为什么你的电脑的运存只有16GB,但你可以运行上百GB的游戏,如黑神话马喽?
这就涉及到 操作系统的按需加载策略
二、页表的存在位
页表的一个标志位:存在位 isexists (is exeist)
,用于表示该页面是否已经加载到内存中,如果 isexists 为 false,表示该页面尚未加载到内存中;如果 isexists 为 true,表示该页面已经在内存中。
当一个进程试图访问一个存在位为 0 的页面时,硬件会生成一个缺页中断,操作系统会处理这个中断,并进行重新加载磁盘内存与判断非法访问等操作。
三、按需分页概念
在现代操作系统中,程序并不会在运行时一次性将所有代码和数据从磁盘加载到内存中。相反,操作系统采用了一种叫做**按需分页(Demand Paging)**的技术来管理内存,这种技术可以显著减少程序启动时所需的内存开销,并提高系统的整体性能。
1、按需分页
按需分页是一种内存管理技术,它只有在实际需要访问某个页面时才会将该页面从磁盘加载到内存中。具体来说,当程序尝试访问一个尚未加载到内存中的页面时,硬件会产生一个缺页中断(Page Fault),操作系统会捕获这个中断,并负责将请求的页面从磁盘加载到内存中。
比如你正在玩“黑神话马喽”,整个游戏的总资源大小为130GB,但你的电脑只有16GB的内存。以下是你玩游戏时可能发生的情况:
- 启动游戏:游戏启动时,操作系统只加载必要的初始化代码和资源,这部分可能只需要几十MB的内存。
- 进入游戏:当你进入游戏的第一个场景(如黑风山),操作系统会根据需要加载该场景的资源。这些资源可能包括地图数据、角色模型、纹理等。
- 移动到新场景:当你从黑风山移动到黄风岭时,操作系统会卸载黑风山的资源,并加载黄风岭的资源。这个过程中可能会发生多次页面故障,但操作系统会按需加载所需的资源。
- 内存管理:在游戏运行过程中,操作系统会不断监控内存使用情况。如果内存不足,它会将不常用的页面换出到交换分区,以释放内存空间,这里就涉及到 页面置换(后面章节有讲解)
若游戏运行卡顿,可能是因为物理内存资源不充足,影响到系统调度进程,同时游戏资源大,需要不断和磁盘进程IO交互(和磁盘IO交互本就耗时)。
2、缺页中断处理流程
【Linux系统】缺页中断机制-CSDN博客
四、按需分页可能会导致性能下降:功大于过
按需分页(Demand Paging)确实有可能导致程序在运行时偶尔出现性能下降的情况,尤其是在首次访问未加载到内存中的页面时。然而,这种技术带来的好处远远超过了潜在的负面影响。下面是按需分页可能导致性能下降的原因及操作系统是如何缓解这些问题的:
1、可能导致的性能下降原因
⭐🚩精华:处理中断耗时、磁盘IO耗时、额外上下文切换耗时
- 缺页中断:当程序访问一个尚未加载到内存中的页面时,会产生一个缺页中断。处理这个中断需要一定的时间,包括从磁盘读取页面数据并将其加载到内存中。
- 磁盘 I/O 开销:从磁盘读取数据通常比从内存读取要慢得多。因此,频繁的磁盘 I/O 操作可能会导致程序运行速度减慢。
- 上下文切换:在处理缺页中断期间,操作系统可能会暂时挂起当前进程,并调度其他进程运行,这会导致额外的上下文切换开销。
2、操作系统的缓解措施
⭐🚩精华:提前加载、缓存用过的、先调度别人
为了减轻按需分页可能带来的性能影响,操作系统采取了多种策略和技术:
- 预读取(Prefetching):操作系统可以预测程序将来可能会访问的页面,并提前将这些页面从磁盘加载到内存中。这样可以减少实际发生缺页中断的情况。
- 高速缓存(Caching):操作系统维护了一个高速缓存系统,用于存储最近使用过的页面。这样,当程序再次访问同一个页面时,可以从高速缓存中快速获取,而不需要再次从磁盘读取。
- 智能调度(Smart Scheduling):操作系统在调度进程时会考虑当前进程的活动模式。例如,在处理缺页中断时,操作系统可能会优先调度那些等待 I/O 完成的进程,而不是立即恢复当前进程的执行。
- 页面置换算法(Page Replacement Algorithms):操作系统使用高效的页面置换算法(如 LRU 最近最少使用算法)来决定哪些页面应该被替换出内存。这有助于保持最常使用的页面始终驻留在内存中。
3、实际效果
尽管按需分页可能会在某些情况下导致短暂的性能下降,但在大多数情况下,它带来的好处远大于这些负面影响:
- 内存利用率高:由于不是一次性加载所有页面,内存可以被更高效地利用,更多的进程可以同时运行而不必担心内存不足的问题。
- 快速启动:程序可以在较少的内存资源下快速启动,因为只有真正需要的页面才会被加载。
- 节省磁盘 I/O:由于不是所有页面都需要频繁访问,磁盘 I/O 的次数可以大大减少,从而提高整体系统性能。
五、页面置换:舍小保大
当操作系统接收到一个缺页中断,并且发现没有足够的物理内存空间来加载新的页面时,它会采取一系列措施来腾出物理内存空间。这一过程通常被称为页面置换(Page Replacement)。页面置换的目标是在尽可能不影响系统性能的前提下,选择合适的页面从物理内存中移除(换出)以腾出空间。
1、页面置换的基本步骤
⭐🚩精华:要多大,选择舍谁,舍掉放到swap,加载新的
- 确定需要腾出的空间:操作系统首先确定需要多少物理内存空间来满足新的页面加载需求。
- 选择页面置换算法:操作系统会根据所使用的页面置换算法来决定哪些页面应当被移出物理内存。常见的页面置换算法包括:
- 最近最少使用(LRU, Least Recently Used):选择最近最少使用的页面进行换出。
- 先进先出(FIFO, First In First Out):选择最早进入内存的页面进行换出。
- 页面标记和选择:根据选定的页面置换算法,操作系统会对内存中的页面进行标记,并选择需要换出的页面。
- 页面换出(Page Swap Out):操作系统将选中的页面从物理内存中移出,并保存到磁盘上的交换区(Swap Space)中。交换区通常是硬盘上的一个分区或文件,专门用来存储暂时不用的内存页面。
- 页面换入(Page Swap In):一旦腾出了足够的物理内存空间,操作系统就可以将新请求的页面加载到物理内存中,并更新页表,以便后续的访问可以直接命中内存。