[英]Why doesn't Linux prevent spawning infinite number of processes and crashing?
使用下面非常简单的代码,我的系统(Ubuntu Linux 14.04)甚至崩溃甚至不让鼠标响应。 我不得不用电源按钮强制退出。 我认为Linux是可以处理此类基本程序错误的稳定操作系统。 我错过了什么?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
void check(int isOkay){
if(!isOkay){
printf("error\n");
abort();
}
}
int main(void){
#define n 1000000
int array[n];
sem_t blocker;
int i;
while(1){
if(!fork()){
for(i = 0; i < n; ++i){
array[i] = rand();
}
check(sem_init(&blocker, 0, 0) == 0);
check(sem_wait(&blocker) == 0);
}
}
return 0;
}
恭喜,您发现了叉子炸弹 。 有一些外壳一线可打出相同类型的哈维琴,而您打字的次数少得多。
实际上,可以使用ulimit限制用户可以产生的进程数量-有关详细信息,请参见链接的Wikipedia文章的底部。
但是,桌面安装的Ubuntu并非完全是加固的服务器。 它是为可用性而设计的。 如果您需要一个不会崩溃的锁定系统,那么还有更好的选择。
命令ulmit -u
显示可以启动的最大进程数。 但是,不要在后台启动那么多流程:您的机器会花时间在多个流程之间进行切换,并且无法完成实际工作。
linux会处理您的请求以创建一个进程,它是由用户根据此限制实现其代码的。
这里的主要问题是确定最佳极限。 许多软件根本不使用fork()
,那么您将限制设置为5之类的吗? 某些软件在收到来自网络的请求时可能会创建一个新进程,那么您是否将限制设置为“最大网络数据包数”? 如果您认为大多数软件不是错误的,那么您会倾向于将限制设置得较高,以使正确的软件正常工作。
另一个问题是调度优先级之一。 在设计良好的系统中,GUI之类的东西将是“高优先级”,并且如果需要CPU时间,它将立即抢占正常/低优先级的工作。 如果是这种情况,以正常/较低优先级运行的大型叉子炸弹将不会影响系统响应用户的能力,并且用户可以毫无问题地杀死叉子炸弹。
不幸的是,由于各种原因,Linux中的调度程序无法像这样工作。 它确实支持优先级,但是要使用优先级,您必须是“实时”进程,并且必须以root用户身份运行(这是严重的安全灾难)。 如果没有合理的优先级,Linux会假定每个派生进程都与其他所有进程一样重要,并且CPU最终会忙于进行派生,并且没有足够的CPU时间来响应用户。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.