操作系统如何处理分叉炸弹?
How do operating systems deal with fork bombs?
考虑 Python (source) 中的以下分叉炸弹:
import os
while 1:
os.fork()
我不敢自己测试它,但我有点怀疑如果我只是使用这个程序 运行 它我的电脑会死机。假设这是真的,我的问题是——我的操作系统使用什么机制或策略来对抗它?
我的问题可以被视为一种“应用”问题,即人们在 OS class 中可能学到的东西。
不出所料,当我在我的机器上试用时,电脑死机了,我不得不硬重启。所以绝对不要经常这样做。
我能够从程序中捕获的最后一个错误是:
BlockingIOError: [Errno 11] Resource temporarily unavailable
File "fork_bomb.py", line 3, in <module>
os.fork()
所以在某些时候,OS 无法处理 OS 分支调用并返回错误。我可以从 /var/log/syslog
看到的唯一其他有用信息是
cgroup: fork rejected by pids controller in /user.slice/user-1000.slice/session-2.scope
Cgroups 是一种限制来自特定 cgroup 内进程的资源的方法。因此,据推测,python 个进程位于已达到其 pid/task 限制的 cgroup 中。所以这是 OS 尝试处理分叉炸弹的一种方式,即使用 cgroups 限制任务。当然,fork 的无限循环,即使 fork 失败了,仍然需要从 OS 请求资源的开销,因此系统冻结。
理论上,OS 可以尝试限制分叉炸弹的另一种方法是通过内存限制。忽略写时复制,如果所有派生进程都需要额外的内存,那么 Linux OOM(内存不足)杀手将被调用。当内存紧张时,这个内核进程将被唤醒,然后它的工作是开始杀死它认为有助于释放足够内存以维持系统运行的进程运行。可以使用 cgroups 或使用 /proc/sys/vm/min_free_kbytes
.
设置最小可用内存来设置内存限制
考虑 Python (source) 中的以下分叉炸弹:
import os
while 1:
os.fork()
我不敢自己测试它,但我有点怀疑如果我只是使用这个程序 运行 它我的电脑会死机。假设这是真的,我的问题是——我的操作系统使用什么机制或策略来对抗它?
我的问题可以被视为一种“应用”问题,即人们在 OS class 中可能学到的东西。
不出所料,当我在我的机器上试用时,电脑死机了,我不得不硬重启。所以绝对不要经常这样做。
我能够从程序中捕获的最后一个错误是:
BlockingIOError: [Errno 11] Resource temporarily unavailable
File "fork_bomb.py", line 3, in <module>
os.fork()
所以在某些时候,OS 无法处理 OS 分支调用并返回错误。我可以从 /var/log/syslog
看到的唯一其他有用信息是
cgroup: fork rejected by pids controller in /user.slice/user-1000.slice/session-2.scope
Cgroups 是一种限制来自特定 cgroup 内进程的资源的方法。因此,据推测,python 个进程位于已达到其 pid/task 限制的 cgroup 中。所以这是 OS 尝试处理分叉炸弹的一种方式,即使用 cgroups 限制任务。当然,fork 的无限循环,即使 fork 失败了,仍然需要从 OS 请求资源的开销,因此系统冻结。
理论上,OS 可以尝试限制分叉炸弹的另一种方法是通过内存限制。忽略写时复制,如果所有派生进程都需要额外的内存,那么 Linux OOM(内存不足)杀手将被调用。当内存紧张时,这个内核进程将被唤醒,然后它的工作是开始杀死它认为有助于释放足够内存以维持系统运行的进程运行。可以使用 cgroups 或使用 /proc/sys/vm/min_free_kbytes
.