簡體   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