如果安装的 Linux(例如 Arch Linux 或 Debian)没有交换分区或交换文件,会发生什么情况。然后,当运行操作系统时 RAM 几乎耗尽时,用户打开一个新应用程序。考虑到这个新应用程序需要的 RAM 内存超出了实际需要,会发生什么情况?
操作系统的哪一部分处理 RAM 管理操作,我可以将其配置为不同的行为吗?
答案1
Linux 内核有一个称为 OOM Killer(内存不足)的组件。正如 Patrick 在评论中指出的,OOM 杀手可以被禁用,但默认设置是允许过度使用(从而启用 OOM 杀手)。
应用程序向内核请求更多内存,而内核可以拒绝向它们提供内存(因为没有足够的内存或因为ulimit
已被用来拒绝向进程提供更多内存)。如果启用了过量使用,则应用程序已请求一些内存并被授予了该数量,但如果应用程序写入新的内存页(第一次)并且内核实际上必须为此分配内存但无法这样做,则内核必须决定杀死哪个进程以释放内存。
内核宁愿杀死新进程而不是旧进程,特别是那些(及其子进程)消耗大量内存的进程。因此,在您的情况下,新进程可能会启动,但可能会被杀死。
您可以使用这些文件
/proc/self/oom_adj
/proc/self/oom_score
/proc/self/oom_score_adj
检查当前设置并告诉内核在必要时应按什么顺序终止进程。
答案2
请记住,内核可以丢弃文本页以腾出更多内存空间。文本页是包含可执行代码的内存。这可能会导致某种混乱,因为页面被丢弃并随后从磁盘上的可执行文件加载。
答案3
豪克·拉金的回答重点关注“内存不足”进程杀手,几乎没有提到事情可能会失败的事实。您提到“用户打开一个新应用程序”的场景。打开“新应用程序”的标准机制是让某个进程(通常是 shell 或窗口管理器)“分叉”,创建一个新进程(该进程是现有进程的副本),并让新进程调用“exec”,用新程序替换自身。两者都可能因缺乏内存而失败。
从叉子(2):
错误
(即可能的故障情况列表)
︙
伊诺梅
叉()由于内存紧张,未能分配必要的内核结构。
︙
同样地执行(2):
︙
伊诺梅
可用内核内存不足。
︙
这个谷歌搜索显示了可能返回“ENOMEM”错误的其他系统函数。
因此,当您尝试启动新程序运行或以其他方式启动新活动时,当内存不足时,您(用户)可能会收到一条错误消息。