operating-system - 操作系统如何处理分叉炸弹?
问题描述
考虑以下 Python 中的 fork 炸弹(source):
import os
while 1:
os.fork()
我太害怕自己测试它,但我有点怀疑如果我只是拿这个程序运行它,我的电脑会死机。假设这是真的,我的问题是——我的操作系统使用什么机制或策略来对抗它?
我的问题可以被视为一种“应用程序”问题,对于一个人在操作系统课程中可能学到的东西。
解决方案
正如预期的那样,当我在我的机器上试用它时,电脑死机了,我不得不硬重启。所以绝对不要定期这样做。
我能够从程序中捕获的最后一个错误是:
BlockingIOError: [Errno 11] Resource temporarily unavailable
File "fork_bomb.py", line 3, in <module>
os.fork()
因此,在某些时候,操作系统无法处理操作系统分叉调用并返回错误。我能从中看到的唯一有用的信息/var/log/syslog
是
cgroup: fork rejected by pids controller in /user.slice/user-1000.slice/session-2.scope
Cgroups 是一种限制特定 cgroup 内进程资源的方法。因此推测,python 进程位于已达到其 pid/task 限制的 cgroup 中。所以这是操作系统尝试处理分叉炸弹的一种方式,即使用 cgroups 限制任务。当然,fork 的无限循环,即使 fork 失败,仍然需要从操作系统请求资源的开销,因此系统冻结。
从理论上讲,操作系统可以尝试限制分叉炸弹的另一种方法是通过内存限制。忽略写时复制,如果所有分叉的进程都需要额外的内存,则会调用 Linux OOM(内存不足)杀手。当内存紧张时,该内核进程将被唤醒,然后它的工作是开始杀死它认为有助于释放足够内存以保持系统运行的进程。可以使用 cgroups 设置内存限制,也可以使用/proc/sys/vm/min_free_kbytes
.
推荐阅读
- ios - 用于包装现有框架的 iOS 框架
- kubernetes - 将 kubernetes (kubespray) 节点移动到另一个 IP 范围
- java - 获取与 Android 设置应用程序中类似的时区列表
- python - 获取values前面的列名和索引名-Panda数据框
- javascript - 如何将 HTML 文本放在 CSS 动画前面
- android - suspendCancellableCoroutine 返回 CompletedWithCancellation 而不是实际类型
- django - Django:保存前更新记录
- numpy - Tensorflow V2.1.0 和 Numpy 兼容性
- oracle - 使用sql删除oracle上的重复数据失败
- python - 如何将 Python Pandas 列中的“2+3”等值转换为其聚合值