问题很简单,但我还没有找到信息(更准确地说,我找到了有关这两个选项(下面的选项)的信息,但没有说明每种情况下使用哪一个)。
选项 1:内核决定哪个是可以从内存中逐出并交换到磁盘的最佳页面,并进行逐出,以便新页面可以到达。
选项 2:内核杀死一个(或多个)进程以立即释放大量内存空间。
第二个选项似乎在性能上更好(而不是一张一张地释放,而是一次释放许多内存页),但它存在杀死进程的问题。那么,我提到的两个选项中哪一个正在实现现代 Linux 发行版呢?这要看具体情况吗?
如果它取决于确切的 Linux 发行版,请以一般方式回答。
答案1
根据具体情况,使用这两种选项。
当内核需要分配页面,并且没有可用页面(或者已达到水位线)时,它将尝试从非活动列表中回收页面(在 中查找“Inactive” /proc/meminfo
)。回收页面并不一定涉及交换:
- 非脏的、文件支持的页面将被丢弃(它们可以从其后备存储中恢复);
- 脏的、文件支持的页面将被写入其后备存储并被丢弃;
- 只有没有自己的后备存储的可驱逐页面才会涉及交换。
OOM 杀手仅在上述内容不够充分时才会介入;它选择“最差”的进程(基于许多标准)并杀死它。
答案2
只要有交换空间,页面就会被换出。它们通过页面错误中断被带回。
如果没有交换空间,内核的一部分就会被手动创建为一个进程,即“OOM-killer”,它会杀死其他进程以释放内存。
答案3
您可以从@StephenKitt 找到完美的答案,这是官方接受的答案。但对于像我这样的学生,仍然有很多东西需要学习才能 100% 理解它,我想根据 Stephen Kitt 的答案对问题的答案进行简化近似:
如果主内存中没有足够的空间,则将选择被逐出的页面,该页面可以是以下任何类型:
-非脏文件支持页面。如果我们在这种情况下,可以从内存中删除该页面(而不是复制到交换区域!!)。
-脏文件支持的页面。如果我们在这种情况下,该页面可以从内存中删除,但不能复制到交换区域! (并将其内容复制到其文件支持的位置)。
-非文件支持的页面(无论它是否脏)。如果是这种情况,则必须将该页复制到交换区域。但是,如果交换区域中没有足够的空间,OOM 杀手必须杀死整个进程(或其中一些进程)。