1.每個進程都有自己獨立的4G記憶體空間,各個進程的記憶體空間具有類似的結構。
Linux記憶體管理採用的是頁式管理,使用的是多層頁表,動態位址轉換機構與主記憶體、輔存共同實現虛擬記憶體一個新進程建立的時候,
將會建立起自己的記憶體空間,此行程的數據,程式碼等從磁碟拷貝到自己的行程空間,哪些資料在哪裡,
都由進程控製表中的task_struct記錄,task_struct中記錄中一條鍊錶,記錄中記憶體空間的分配情況,
哪些位址有數據,哪些位址無數據,哪些可讀,哪些可寫,都可以透過這個鍊錶記錄每個行程已經分配的記憶體空間,都與對應的磁碟空間映射。
2.每個程式都能看到一片完整連續的位址空間,這些空間並沒有直接關聯到實體內存,而是作業系統提供了記憶體的一種抽象概念,
使得每個行程都有一個連續完整的位址空間,在程式的運作過程,再完成虛擬位址到實體位址的轉換。
我們同樣知道,進程的位址空間是分段的,存在所謂的資料段,程式碼段,bbs段,堆,棧等等。每個段都有特定的作用。
同時電腦沒有那麼多的記憶體(n個進程就需要對應n*4G記憶體),建立一個進程,就要把磁碟上的程式檔案拷貝到進程對應的記憶體中去,
# 對於有一個程式對應多個進程這種情況,浪費記憶體。
# 3.每個行程的4G記憶體空間只是虛擬記憶體空間,每次存取記憶體空間的某個位址,都需要把位址翻譯為實際物理位址所有行程共享相同實體內存,
每個進程只把自己目前需要的虛擬記憶體空間映射並儲存到實體記憶體上進程要知道哪些記憶體位址上的資料在實體記憶體上,哪些不在,還有在實體記憶體上的哪裡,
需要頁表記錄頁表的每個表格項目分為兩部分,第一部分記錄此頁是否在實體記憶體上,第二部分記錄實體記憶體的位址當行程存取某個虛擬位址,
去查看頁表,如果對應的資料不在實體記憶體中,,則缺頁異常缺頁異常的處理過程,就是把進程需要的資料從磁碟拷貝到實體記憶體中,
如果記憶體已經滿了 ,沒有空地方,那就找一個頁來覆蓋,當然如果被覆蓋的頁曾經被修改過,需要將此頁寫回磁碟。
# 4.竟然每個行程的記憶體空間都是一致且固定的,所以連結器在連結執行檔時,可以設定記憶體位址,而 不用去管這些資料最終實際的記憶體位址,
這是有獨立內存 空間的好處當不同的程序使用同樣的程式碼時,例如庫檔案中的程式碼,物理記憶體中可以只儲存一份這樣的程式碼,
不同的進程只要要把自己的虛擬記憶體映射過去就可以了,節省內存在程式需要分配連續的記憶體空間的時候,
只需要在虛擬記憶體空間分配連續空間,而不需要實際實體記憶體的連續空間,可以利用碎片。
以上是linux的虛擬記憶體機制是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!