操作系統--虛擬內存學習

內存的發展流程:

一.嵌入式實時操作系統
表現:在早期的單片機上,程序運行在物理內存中,也就是說,程序在運行時直接訪問到物理地址,在程序運行開始,將全部程序加載到內存中,所有的數據地址和程序地址就此固定。
在運行多任務系統時,比較直接的辦法也是直接爲每個任務分配各自需要的內存空間,比如總內存爲100M,task1需要40M,task2需要50M,task3需要20M,那麼最簡單的辦法是給task1分配40M,給task2分配50M,而task3,不好意思,內存不夠了,不允許運行
弊端:

  1. 地址空間不隔離
    所有程序都可以直接訪問物理內存,那麼task1就可以直接訪問task2的地址,這就給了一些惡意程序機會來進行一些非法操作,即使是非惡意但是有bug的程序,也可能會導致其他任務無法運行,這對於需要安全穩定的的計算機環境的用戶是不能容忍的。
  2. 內存使用效率極低
    由於沒有有效的內存管理機制,通常在一個程序執行時,將整個程序裝載進內存中運行,如果我們要運行task3,內存已經不夠了,其實系統完全可以將暫時沒有運行的task2先裝入磁盤中,將task3裝載到內存,當需要運行task2時,再將task2換回,雖然犧牲了一些執行效率,但總歸是可以支持更多程序運行。
  3. 程序地址空間不確定
    需要了解的是程序在編譯階段生成的可執行文件中符號地址是連續且確定的,即使實現了內存數據與磁盤的交換,將暫時不需要的任務放入磁盤而運行其他任務,程序每次裝入內存時,都需要從內存中分配一段連續內存,這個空間是不確定的,但是在程序實現過程中,有些數據往往要求其地址空間是確定的,這就會給編寫程序帶來很大的麻煩。

二.虛擬內存機制的誕生
操作系統後來爲內存添加了一層中間層,也就是虛擬內存機制,此時針對開發者來說操作的全部都是虛擬地址,這樣,只要我們能妥善處理好虛擬地址到物理地址的映射過程,而這個映射過程被當作獨立的一部分存在,就可以解決上述提到的三個問題:
1.對於地址隔離,因爲程序員操作的是虛擬地址,虛擬地址在最後會轉化爲物理地址,可能程序A訪問的0x8000,轉換到物理地址是0x3000,而程序B同樣訪問0x8000,但是會被轉換到物理地址0x4000,這樣程序中並不知道自己操作的物理地址,也操作不到實際的物理地址,因爲虛擬地址的轉換總會將地址映射到不衝突的物理地址上,同時進行檢測,也就無從影響到別的任務執行。
2.對於內存使用效率,建立完善的內存管理機制,可以更方便地進行內存與磁盤數據的交換,將空置的內存利用起來而不增加編程者的負擔。
3.對於程序空間不確定 虛擬內存機制完美地解決了這個問題,在直接操作物理地址時,因爲內存與磁盤的交換,可能導致函數或者變量地址的變化,原來程序中的數據必須進行更新。
而引入虛擬內存機制,程序員只操作虛擬地址,函數、變量虛擬地址不變,物理地址可能變化,但是程序員只需要關注虛擬地址就行了,虛擬地址到物理地址的轉換就由內存管理部分負責。
既然增加了一箇中間層,那麼這個中間層最好是由獨立的部分進行管理,實現這個功能的器件就是MMU,它接管了程序中虛擬地址和物理地址的轉換,MMU一般直接集成在CPU中,不會以獨立的器件存在。
三.內存分段分頁機制
分段:
它把虛擬地址空間映射到了物理地址空間,並且你寫的程序操作的是虛擬地址。假設,程序A的虛擬地址空間是0x00000100~0x00000200。此時,不僅需要一塊連續的物理內存來存放程序A,還需要把程序A的虛擬地址空間映射到(轉換爲)物理地址空間。可能,程序A的虛擬地址空間從0x00000100~0x00000200映射到了物理地址空間0x00000000~0x00000100。
解決了問題1,3
分頁:
分段映射的是一段連續的內存
分頁這個技術仍然是一種虛擬地址空間到物理地址空間映射的機制。但是,粒度更加的小了。單位不是整個程序,而是某個“頁”,一段虛擬地址空間組成的某一頁映射到一段物理地址空間組成的某一頁。
分頁這個技術,它的虛擬地址空間仍然是連續的,但是,每一頁映射後的物理地址就不一定是連續的了。正是因爲有了分頁的概念,程序的換入換出就可以以頁爲單位了。那麼,爲什麼就可以只換出某一頁呢?實際上,不是爲什麼可以換出某一頁,而是可以換出CPU還用不到的那些程序代碼、數據。但是,把這些都換出到磁盤,萬一下次CPU就要使用這些代碼和數據怎麼辦?又得把這些代碼、數據裝載進內存。性能有影響對吧。所以,我們把換入換出的單位變小,變成了“頁”。(實際上,這利用了空間局部性)
分頁和分段區別的主要核心在於粒度。
分段就是將一個程序分成代碼段,數據段,堆棧段什麼的
在這裏插入圖片描述
分頁就是將這些段,例如代碼段分成均勻的小塊,然後這些給這些小塊編號,然後就可以放到內存中去,由於編號了的,所以也不怕順序亂
在這裏插入圖片描述
然後我們就能通過段號,頁號,頁內偏移找到程序的地址
在這裏插入圖片描述

參照:
https://www.cnblogs.com/downey-blog/p/10482472.html
https://www.zhihu.com/question/50796850
深入理解計算機操作系統

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