12 linux c linux-kernel
#include <unistd.h>
int main(int argc, char* argv[]) {
while(1)
{
fork();
}
}
Run Code Online (Sandbox Code Playgroud)
我在我的 linux 上运行这个程序,终端上没有任何输出,操作系统似乎死了。linux对这种内存不足的程序有什么保护措施吗?
Oli*_*rth 18
这被称为叉炸弹。
linux对这种内存不足的程序有什么保护措施吗?
并不真地。每个 fork 都会产生一个新进程,具有自己的虚拟地址空间和内存使用情况。所以每个副本都比较小。最终,您将用完系统上的所有物理+交换内存,内存不足 (OOM) 杀手将开始杀死单个进程。但是分叉炸弹仍然会以同样快的速度创建进程(如果不是更快的话)。
首先防止这种情况发生的一种方法是限制用户进程的数量,使用ulimit -u(假设您正在使用 Bash;其他 shell 将具有等效项)。
Jay*_*Jay 10
是的,尽管默认情况下您的系统可能未启用它。的setrlimit系统调用定义系统限制-包括每个用户的进程数。
让我们首先在内核 API 中查看它(因为您提到了“linux”):您可以使用 setrlimit 的联机帮助页,它会告诉您执行类似的操作
#include <sys/resource.h>
...
struct rlimit r;
rnew.r_cur = 40;
rnew.r_max = 50;
setrlimit(RLIMIT_NPROC,&r);
Run Code Online (Sandbox Code Playgroud)
这会将每个用户的最大进程数 ( RLIMIT_NPROC) 设置为 40(软限制)和 50(硬限制)。
现在,从 shell 中,如果您使用 bash,则可以使用ulimit内置命令:
ulimit -u
29089
Run Code Online (Sandbox Code Playgroud)
您可以通过将其作为参数传递来设置限制:
ulimit -u 100
Run Code Online (Sandbox Code Playgroud)
ulimit --help 将显示您可以设置其他几个限制(可能感兴趣的是用户使用的最大文件描述符数)。
这取决于您是要在用户级别还是系统级别使用它。在用户级别ulimit(或其他 shell 的相应命令)将是最简单的解决方案。
然而,在系统级别,有一些机制可以防止恶意用户(或只是不使用 ulimit)停止系统。Linux cgroups 机制可以限制每个组的资源。您可以(通过机制pam_systemd)强制用户会话位于特定组中。这还有其他好处,例如 CPU 调度程序。
| 归档时间: |
|
| 查看次数: |
4163 次 |
| 最近记录: |