Linux
在 execve() 呼叫之後,舊的堆棧、堆和(已初始化和未初始化的)數據段會發生什麼?
execve() 的聯機幫助頁說
execve() 執行文件名指向的程序。這會導致呼叫程序目前正在執行的程序被新程序替換,該程序具有新初始化的堆棧、堆和(已初始化和未初始化的)數據段。
如果呼叫程序是由 vfork() 創建的,則意味著 exec() 為新程序提供了新的地址空間;它不會修改父地址空間。.
如果呼叫程序通常是由 fork() 創建的,那麼舊的“堆棧、堆和(已初始化和未初始化的)數據段”通常會發生什麼?他們的空間被釋放了嗎?
execve() 的行為是否取決於呼叫程序的創建方式?
在看到引用之前,我認為 execve() 會覆蓋舊的“堆棧、堆和(已初始化和未初始化的)數據段”,而不是創建新的。所以當我看到報價時,想知道為什麼要浪費新空間?
謝謝。
execve() 的行為是否取決於呼叫程序的創建方式?
不。
在看到引用之前,我認為 execve() 會覆蓋舊的“堆棧、堆和(已初始化和未初始化的)數據段”,而不是創建新的。
否: execve() 創建新段並釋放舊段。
所以當我看到報價時,想知道為什麼要浪費新空間?
試著記住,我們說的是虛擬記憶體!
創建一個空白段只分配少量的物理記憶體來跟踪該段。無論段有多大,該分配的大小都是固定的。
必須為您寫入的每個頁面分配一個物理頁面。父程序可能已寫入大量頁面。但是,如果子程序在執行時只使用一點堆棧/堆/數據,那麼它就沒有充分的理由保留對父程序所有臟頁的引用!如果父母退出並且孩子繼續執行,它將浪費記憶體。
刪除對舊段和舊頁面的引用是最有效的方法。因為如果這是對該記憶體的唯一引用,則可以釋放物理記憶體。