eye Asked: 2018-04-30 06:24:31 +0800 CST2018-04-30 06:24:31 +0800 CST 2018-04-30 06:24:31 +0800 CST 如果 Linux 发行版安装时没有交换,并且当它几乎没有 RAM 时执行一个新应用程序会发生什么?[复制] 772 如果安装了没有交换分区或交换文件的 Linux,比如 Arch Linux 或 Debian,会发生什么情况。然后,当在几乎没有 RAM 的情况下运行操作系统时,用户会打开一个新应用程序。考虑到这个新应用程序需要的 RAM 内存比实际需要的多,会发生什么? 操作系统的哪一部分处理 RAM 管理操作,我可以将其配置为不同的行为吗? memory ram 3 个回答 Voted Best Answer Hauke Laging 2018-04-30T06:31:56+08:002018-04-30T06:31:56+08:00 Linux 内核有一个称为 OOM 杀手(内存不足)的组件。正如帕特里克在评论中指出的那样,OOM 杀手可以被禁用,但默认设置是允许过度使用(从而启用 OOM 杀手)。 应用程序向内核请求更多的内存,而内核可以拒绝给他们(因为没有足够的内存或者因为ulimit已经被用来拒绝给进程更多的内存)。如果启用了过量使用,则应用程序已请求一些内存并被授予该数量,但如果应用程序写入新的内存页面(第一次)并且内核实际上必须为此分配内存但不能这样做,那么内核必须决定要杀死哪个进程以释放内存。 内核宁愿杀死新进程而不是旧进程,尤其是那些(连同他们的孩子)消耗大量内存的进程。因此,在您的情况下,新进程可能会开始,但可能会被杀死。 您可以使用文件 /proc/self/oom_adj /proc/self/oom_score /proc/self/oom_score_adj 检查当前设置并告诉内核在必要时它应该以什么顺序杀死进程。 casualunixer 2018-04-30T09:17:21+08:002018-04-30T09:17:21+08:00 请记住,内核可以丢弃文本页面以腾出更多内存空间。文本页是包含可执行代码的内存。这可能会导致一种颠簸,因为页面被丢弃并随后从磁盘上的可执行文件中加载。 G-Man Says 'Reinstate Monica' 2018-05-02T18:12:41+08:002018-05-02T18:12:41+08:00 Hauke Laging 的回答侧重于“内存不足”进程杀手,几乎没有提到事情可能会失败的事实。您提到了“用户打开一个新应用程序”的场景。打开“新应用程序”的标准机制是让某个进程(通常是 shell 或窗口管理器)“分叉”,创建一个作为现有进程副本的新进程,并让新进程调用“exec”,用新程序替换自己。任何一个都可能因内存不足而失败。 从fork(2): 错误 (即,可能的故障条件列表) ︙ ENOMEM由于内存紧张, fork()未能分配必要的内核结构。 ︙ 同样execve(2): ︙ ENOMEM可用的内核内存不足。 ︙ 此 Google 搜索显示其他可能返回“ENOMEM”错误的系统函数。 因此,您(用户)可能会在内存不足时尝试启动新程序运行或以其他方式启动新活动时收到错误消息。
Linux 内核有一个称为 OOM 杀手(内存不足)的组件。正如帕特里克在评论中指出的那样,OOM 杀手可以被禁用,但默认设置是允许过度使用(从而启用 OOM 杀手)。
应用程序向内核请求更多的内存,而内核可以拒绝给他们(因为没有足够的内存或者因为
ulimit
已经被用来拒绝给进程更多的内存)。如果启用了过量使用,则应用程序已请求一些内存并被授予该数量,但如果应用程序写入新的内存页面(第一次)并且内核实际上必须为此分配内存但不能这样做,那么内核必须决定要杀死哪个进程以释放内存。内核宁愿杀死新进程而不是旧进程,尤其是那些(连同他们的孩子)消耗大量内存的进程。因此,在您的情况下,新进程可能会开始,但可能会被杀死。
您可以使用文件
检查当前设置并告诉内核在必要时它应该以什么顺序杀死进程。
请记住,内核可以丢弃文本页面以腾出更多内存空间。文本页是包含可执行代码的内存。这可能会导致一种颠簸,因为页面被丢弃并随后从磁盘上的可执行文件中加载。
Hauke Laging 的回答侧重于“内存不足”进程杀手,几乎没有提到事情可能会失败的事实。您提到了“用户打开一个新应用程序”的场景。打开“新应用程序”的标准机制是让某个进程(通常是 shell 或窗口管理器)“分叉”,创建一个作为现有进程副本的新进程,并让新进程调用“exec”,用新程序替换自己。任何一个都可能因内存不足而失败。
从fork(2):
同样execve(2):
此 Google 搜索显示其他可能返回“ENOMEM”错误的系统函数。
因此,您(用户)可能会在内存不足时尝试启动新程序运行或以其他方式启动新活动时收到错误消息。