學習筆記 | Linux虛擬地址空間

請你說一說Linux虛擬地址空間

爲了防止不同進程同一時刻在物理內存中運行而對物理內存的爭奪和踐踏,採用了虛擬內存。

虛擬內存技術使得不同進程在運行過程中,它所看到的是自己獨自佔有了當前系統的4G內存。所有進程共享同一物理內存,每個進程只把自己目前需要的虛擬內存空間映射並存儲到物理內存上。 事實上,在每個進程創建加載時,內核只是爲進程“創建”了虛擬內存的佈局,具體就是初始化進程控制表中內存相關的鏈表,實際上並不立即就把虛擬內存對應位置的程序數據和代碼(比如.text .data段)拷貝到物理內存中,只是建立好虛擬內存和磁盤文件之間的映射就好(叫做存儲器映射),等到運行到對應的程序時,纔會通過缺頁異常,來拷貝數據。還有進程運行過程中,要動態分配內存,比如malloc時,也只是分配了虛擬內存,即爲這塊虛擬內存對應的頁表項做相應設置,當進程真正訪問到此數據時,才引發缺頁異常。

請求分頁系統、請求分段系統和請求段頁式系統都是針對虛擬內存的,通過請求實現內存與外存的信息置換。

虛擬內存的好處:

1.擴大地址空間;

2.內存保護:每個進程運行在各自的虛擬內存地址空間,互相不能干擾對方。虛存還對特定的內存地址提供寫保護,可以防止代碼或數據被惡意篡改。

3.公平內存分配。採用了虛存之後,每個進程都相當於有同樣大小的虛存空間。

4.當進程通信時,可採用虛存共享的方式實現。

5.當不同的進程使用同樣的代碼時,比如庫文件中的代碼,物理內存中可以只存儲一份這樣的代碼,不同的進程只需要把自己的虛擬內存映射過去就可以了,節省內存

6.虛擬內存很適合在多道程序設計系統中使用,許多程序的片段同時保存在內存中。當一個程序等待它的一部分讀入內存時,可以把CPU交給另一個進程使用。在內存中可以保留多個進程,系統併發度提高

7.在程序需要分配連續的內存空間的時候,只需要在虛擬內存空間分配連續空間,而不需要實際物理內存的連續空間,可以利用碎片

虛擬內存的代價:

1.虛存的管理需要建立很多數據結構,這些數據結構要佔用額外的內存

2.虛擬地址到物理地址的轉換,增加了指令的執行時間。

3.頁面的換入換出需要磁盤I/O,這是很耗時的

4.如果一頁中只有一部分數據,會浪費內存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章