進程需要放到內存中才能被cpu讀取和執行,那么進程要放到內存的哪里才是合適的呢?
進程代碼中會有具體語句表明代碼的入口地址,但這個地址之只能是相對地址,因為任何時刻內存的狀態都是不確定的,不能保證哪個物理地址一定是空閑的並且可以讓用戶使用的,但cpu只能根據指令找到對應的物理地址來執行程序,那么這個相對地址應該在什么時候變成物理地址呢?
1.編譯時:程序在編譯時就將相對地址轉變為物理地址,這種情況比較少見,由於程序在運行時內存狀態是不確定的,所以在編譯時就重定位會容易出現問題
2.載入時:程序在載入內存時重定向,但是仍然會存在問題,多線程存在於內存中,由於內存空間有限,有時需要借助磁盤,swap行為就有可能出現:進程從磁盤重新寫回內存時,原來的物理地址已經被新的進程占用,此時程序的物理地址還是原來的物理地址,就會指向這個“鳩占鵲巢”的新進程,而產生錯誤。
3.運行時:進程的物理地址是根據pcb中的基地址和程序的相對地址換算而成的,每一次執行一條指令,都要從邏輯地址算出物理地址,這樣就不會出錯啦~
