2012-04-10 130 views
5

這是我以前的question的續作。我正在使用fork來創建子進程。裏面的孩子,我給命令來運行如下的過程:分叉子程序所用的時間

if((childpid=fork())==0) 
{ 
system("./runBinary "); 
exit(1) 
} 

我runBinary具有測量它從開始多少時間到結束的功能。

令我感到驚訝的是,當我直接在命令行上運行runBinary時,大約需要60秒。但是,當我將它作爲子進程運行時,它需要更多,例如~75或更多。有什麼我可以做或者我現在做錯了,這是導致這一點?

感謝您的幫助提前。 更多詳細信息:我正在使用24核心的Linux RHEL服務器上運行。我正在測量CPU時間。一次,我只使用taskset(未在代碼中顯示)分叉8個孩子(按順序),每個孩子綁定到不同的核心。系統除了我自己的程序外沒有加載。

+1

也許需要15秒,你的睡眠父進程得到由O/S喚醒孩子退出後? – 2012-04-10 01:45:23

+0

@JonathanLeffler你能告訴如何確認嗎?謝謝 – user984260 2012-04-10 01:47:32

+0

@sarnold實際上它是運行二進制,它本身就是測量時間。 – user984260 2012-04-10 01:50:12

回答

2

system()函數調用shell。你可以做任何事情,包括運行腳本。這給了你很大的靈活性,但它帶來了一個代價:你正在加載一個shell,然後在其中運行runBinary。雖然我不認爲加載shell會對時差產生太大的影響(畢竟是15秒),因爲它似乎並不需要它 - 只是運行應用程序 - 嘗試使用exec()中的某些內容家庭。

+0

謝謝。你的回答非常有說服力。你認爲exec家族更快嗎?我沒有使用execvp的原因是在系統中我可以做系統(「./ Binary argument1 argument2」);但是,我無法在execvp中這樣做。你能告訴。 – user984260 2012-04-12 16:41:14

+1

好吧,只需不加載shell並解釋給出的命令行就可以提高速度。關於命令行,我不明白,你說你不能做什麼?您可以將參數傳遞給它,唯一的額外工作是必須將參數放入數組中 - 如果使用execv變體 - 或者至少使用分隔字符串中的二進制名稱 - 如果使用execl變體。例如,可以用strtok來完成這些事情。 – 2012-04-12 16:54:25

+0

謝謝。我看到並遵循。 – user984260 2012-04-12 17:04:30

0

如果沒有分析應用程序,如果父進程中哪些分支具有較大的內存空間,則可能會發現嘗試分叉進程本身並嘗試複製內存空間需要花費時間。

這不是在紅帽企業Linux 6中的問題,但在早期版本的Red Hat Enterprise Linux的5