繁体   English   中英

为什么Linux不能防止产生无限数量的进程和崩溃?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM