2015-09-10 23 views
0

這個問題是我的中級考試的一部分,其教授給出的答案相當荒謬。當一個子進程正在執行時,CPU能否將進程保持在掛起狀態10秒鐘?

我只是想知道什麼是正確的答案。

CODE:

#include<unistd.h> 

    // Other Libraries 


void ChildProc() 
{ 
    sleep(10); 
    printf("Child Process\n"); 
} 

void ParentProc() 
{ 
    printf("Parent Process"); 
} 

int main() 
{ 
    pid_t pid; 
    pid = fork(); 

    if(pid==0) 
    ChildProc(); 
    else 
    ParentProc(); 

    return 0; 
} 

問題: 什麼都是下面的代碼的可能的輸出?

我的答案是,

1)
OUTPUT:None
理由:當叉失敗(系統不允許子進程的創建)

2)
OUTPUT:Parent Process
原因:父母和孩子現在都處於競爭狀態。誰可能首先執行,父母提前結束並因此退出該功能,然後程序本身將退出。父母結束後,孩子不能活下去。因此它也結束。

但是,教授考慮另一個狀態,當孩子開始執行第一次,並開始睡眠循環。現在輪到父母了,處理器太忙了,從而使進程處於掛起狀態約10秒。現在這個時候孩子完成休眠和恢復執行,並逐步父執行,從而輸出,

OUTPUT:
Child Process
Parent Process

雖然這種情況發生的概率是非常非常非常很少見,只有當流程上下文切換器非常繁忙時,但他仍然認爲這是可能的? 現在我不相信他的推理,知道什麼是真的可能,至少在現在的一天linux操作系統?

回答

2

它在理論上是可能的,父進程被阻止10秒[不是由CPU本身,而是由OS調度機制。但是由於在這種情況下分叉進程與父進程具有相同的優先級,所以子進程在父進程完成之前運行是不太可能的,但像任何兩個非同步進程一樣,不可能完全保證它們執行的順序。

在我的機器上,當然,子進程在父進程完成之後才運行。所以輸出是:

Parent process 
[my prompt $] Child Process 

每一次。但這絕不是100%保證。

+0

我有類似的觀點,但事實上,在執行之前進程保持阻塞狀態10秒實際上是不可能的。我的論點是,理論上它可能但實際上是不可能的。 –

+0

同意。這需要一些非常特殊的情況。就像另一個進程在子進程開始的時刻具有更高的優先級。但即使如此,扭轉訂單也不太可能。 –

+0

絕對同意,但問題是「是它**可能**?」 –

0

參考另一個問題來自'11:

understanding fork(), sleep() and processes flux

父進程應該使用的wait(),否則我相信它只會顯示:

父進程

子進程

(或無法分叉)

+0

呼叫等待讓家長明確等待孩子來執行,到那時它只是從字面上等待。這糾正了上面的代碼。相反,我們必須找到這個錯誤代碼的輸出。 :P –

0

我們無法預測哪個進程會先運行 ,但是如果進程處於睡眠狀態,則其他進程獲取CPU時間量。

O/P: 父進程 子進程

0

我想你還沒有準確地說出你的教授的話。這可能會發生在舊機器中,而不是現代機器中。由於系統的多任務多線程特性,您無法預測孩子是否會在父母之前執行,反之亦然。一般情況下,如果孩子進入睡眠狀態,父母因孩子睡眠而等待是沒有必要的,但在您的情況下,父母可能必須等待打印其孩子後才能收集孩子的退出狀態(以防孩子先行)。

注:

,當我運行代碼,它第一次運行父(打印父進程),還給我的控制檯,然後運行子(打印「子進程」),然後進入連續等待:)

當我把printf(「主進程」)放在main()返回0之前時, 它按以下順序打印父進程,主進程,回到控制檯,(睡眠),子進程,主進程。 有一件事情很清楚,家長不會等待孩子,並且孩子在家長之前總是得到CPU是沒有必要的。

問題:爲什麼程序進入連續的等待,爲什麼執行語句這是父母和孩子之外,兩次

+0

順便說一句,他很瞭解內核已經從第1天就清除了我的概念。你的理由不太可能發生。 –

+0

哦,我不是故意說他不知道我試圖強調,如果你有正確的措辭,他說什麼,然後他可能是適合舊機器不現代的我試圖重述我的回答 – shami

+0

@PinkeshBadjatiya PLZ檢查更新:) – shami