2017-01-22 67 views
1

這裏有一個場景:我有一個父進程產生了幾個子進程。現在每個子進程必須允許運行兩秒鐘(理想情況下cpu時間),然後父進程讓孩子進入睡眠狀態或做一些工作。這個循環繼續。還有一些子流程可能會在兩者之間終止。將要產生的子過程是由一些不可信任的人寫的代碼。 (這個問題提醒輪詢調度ME)如何安排子流程?

我的解決方案和研究:

明顯的解決辦法:把父兩秒鐘睡覺,然後醒來並控制孩子。在這裏,我們花時間去了解每個進程可能得不到公平的兩秒的執行時間。

解決方法二:使用prlimit()與RLIMIT_CPU,並設置一個大hardlimit和軟限制兩秒開始。隨後軟限制可能會上升兩秒。然後子進程得到一個SIGXCPU信號。

不同的信號(實時信號)可以被分配給每個處理(命中的33更高的極限)。現在收到SIGXCPU信號後,必須使用os.kill()將指定的信號發送給父節點。這裏的問題是子進程必須自發地將信號發送給父進程。通過延遲發送信號,子進程可能會獲得額外的時間。

解決方案三:再使用setitimer()與ITIMER_VIRTUAL從子進程。 SIGVTALRM信號發送給子進程。它必須將不同的信號(如上所述)轉發給父進程。該解決方案與以前的解決方案具有相同的問題。

所有三種解決方案都是災難。我正在尋找更好的解決方案。一些最簡單的代碼解釋會非常有幫助。

+0

我孩子打印並退出,然後父母將無限期地等待!所以測量CPU時間是不好的。 –

+0

我得出的結論是,使用cpu時間不是明智的,至於隔離時間,我認爲問題仍然存在。 –

回答

0

同樣的問題被問here

一種可能的解決方案是ptrace(由親本)下運行的子進程。當您這樣做時,父母會收到任何即將發送給其ptrace d孩子的信號的通知,並且家長可以決定如何處理這些待處理的信號(可能忽略信號或將其轉發給孩子;或終止孩子等)。

要生成的子流程是由一些不可信任的人編寫的代碼。

ptrace解決方案還允許您觀察子進程在做什麼,並阻止它執行某些系統調用。

如果沒有這個,子進程可能會fork並轉到sleep,不消耗執行時間(使用無限制的CPU時間的宏程序進程)。

另請參見this有點過時的文章在Linux下的監獄。沙盒中的現有技術似乎是seccomp-bpf,例如Firejail

+0

我已經使用seccomp-bpf過濾出fork()和其他一些調用。 –