虚拟内存页面替换

ven*_*s.w 0 x86 operating-system kernel memory-management

众所周知,当所有帧都已满时,需要在页面需求中替换一些页面.但是,页面可以用作文本,rodata,数据,这些都是从磁盘I/O调用的,但页面如堆栈,程序堆只在内存中分配,磁盘中没有副本.我想知道堆栈和堆的页面是否涉及页面替换,如果是这样,它们是否应暂时交换到磁盘中?否则,它们应该固定在内存中吗?也许这个问题与具体实施密切相关,可以采用不同的策略,但我很想知道通常的做法.

Sec*_*att 5

所有用户模式页面都可以从RAM中删除.未经修改且由磁盘上的实际数据支持的页面(例如DLL和EXE的可执行文件和只读部分)将被简单地从内存中删除并重新请求页面.所有其他页面都被写入页面文件并请求页面返回这包括堆栈,堆和VirtualAlloc的内存.

靠近活动线程的堆栈内存往往不会被分页,因为它最近被访问过,因此被分页守护进程/ APC分页出来是一个糟糕的选择,但是远离callstack的页面和悬浮常常由系统调出,并且当然不是在存储器中被钉扎.

唯一的一般例外是内核堆栈.每个核心必须至少有一个永远不会被分页的内核堆栈,否则页面错误会导致处理器三重故障并且核心重新启动.

此外,Linux和Windows都有一个"非页面缓冲池"的概念,它是永远不会被分页的堆内存.这与"分页池"内存形成对比,后者根据需要通过分页守护进程进行分页.(这个"非分页"内存需要服务页面故障守护程序本身,核心系统服务和服务,这些服务是分页守护程序工作所必需的,例如文件系统驱动程序,内存管理器等)