2015-11-04 38 views
2

如果我使用fork()系統調用來創建子進程,那麼我使用#ps aux命令來查看進程的大小,我總是看到子進程比父進程多4 KB! 我也想知道我怎麼能知道任何進程的RAM中的實際地址不顯示的相對的/ proc/PID /圖 預先感謝子進程比父進程大4 kb大小?

pid = fork(); 
if(pid == 0) 
{ 
    getchar(); 
    execlp("/usr/bin/top", NULL); 
} 
else 
{ 
    wait(&childstatus); 
    printf("Hello From Parent\n"); 
} 

我運行#ps AUX當子進程等待getchar()。

+0

你需要更具體的問題,如顯示你正在運行的代碼。你爲什麼擔心額外的4KB?您是否正在使用內存有限的微控制器運行一個進程? –

+0

我不擔心大小。我只是想了解背景中究竟發生了什麼。我知道當我使用fork()時,子進程共享父進程的地址空間。如果孩子改變任何東西(比如變量),那麼在寫入時發生拷貝並且子進程將擁有它自己的該變量的副本。現在就兩個進程最初共享地址空間的原因來說,它們爲什麼不具有相同的大小? – user3480226

回答

0

內核採用寫入時複製方法,同時將內存從父進程地址空間複製到子進程的地址空間。

另一件事是內核將在fork上的進程表上添加大約2kB(在32位系統上)描述符。

我也想知道我怎麼能知道任何進程的RAM中的實際地址不

那麼的/ proc/PID /圖所示的相對的,這需要某種形式的內核調試器。據我所知,有一些kdb or kgdb

+0

感謝您的回覆,據我所知「複製寫入」只有在孩子試圖寫東西時纔會發生。這就是爲什麼它被稱爲「複製寫」 – user3480226

+0

爲什麼這2 kb額外?它用於什麼?爲什麼我有4 kb的差異不僅2 kb? – user3480226

+0

2或4 kB取決於體系結構。它用於描述流程表中的運行流程(精確的列表)。我建議你看看'進程管理'一章中名爲'Linux Kernel Development'的Robert's Love書。 –

0

我剛剛意識到這個4 KB的額外是因爲wait()。如果我刪除它,父進程和子進程將具有相同的大小。 但是誰能告訴我爲什麼wait()消耗更多的4 KB?