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