?? 程序規模的增長遠大于存儲器容量的發展的速度,為了讓更多的程序運行在有限的內存中,理想情況下,我們希望有更大、更快、更便宜的非易失性存儲器。
?????? 在實際中的存儲器情況如下:
???? 從圖中我們可以得出,把容量小、速度快的存儲器我們希望放在靠近CPU的地方,讓CPU可以更快的運行;由于內存相對于寄存器的速度較慢,因此寄存器和內存之間還有一層Cache,Cache目的是緩存內存的數據使得CPU盡量可以從Cache中獲得內存數據,而不用每次訪問主存,這樣保證了CPU訪問數據的效率更高。
?????? 操作系統支持存儲器可以達到更大、更快、更便宜好用的理想狀態,但是數據隨著掉電會丟失的影響的情況還存在。
?????? 如果程序太大,超過了內存的容量,可以采用手動的覆蓋技術,只把需要的指令和數據保存至內存中;
?????? 如果程序太多,超過了內存的容量,可以采用自動的交換技術,把暫時不能執行的程序送到外存中;
?????? 如果想要在有限容量的內存中,以更小的頁力度為單位裝入更多更大的程序,可以采用自動的虛擬存儲技術。
覆蓋技術
如果是程序太大, 超出了內存的容量, 可以采用手動的覆蓋(overlay)技術, 只把需要的指令和數據保存在內存當中。
目的 : 是在較小的可用內存中運行較大的程序, 常用于多道程序系統, 與分區存儲管理配合使用
原理 :
?????? 把程序按照其自身邏輯結構, 劃分為若干個功能上相互獨立的程序模塊, 那些不會同時執行的模塊共享同一塊內存區域, 按時間先后來運行。(分時共享內存區域)
必要部分(常用功能)的代碼和數據常駐內存;
可選部分(不常用功能)在其他程序模塊中實現, 平時存放在外存中, 在需要用到時才裝入內存;
不存在調用關系的模塊不必同時裝入到內存, 從而可以相互覆蓋, 即這些模塊共用一個分區。
也就是說,程序松耦合的部分可以按需裝入內存,不需要的時候放在外存中,多個不常用部分共用一個分區.
A(20k) | B(50k) ____ C(30k) | ____ D(30k) ____ E(20k)? F(40k)
因此不需要將整個程序190k的數據全部放入內存中, 而是劃分為常駐區(20k) 覆蓋區0(50k)覆蓋區1(40k) 壓縮至了110k的內存空間使用
缺點 :
???? 由程序員來把一個大的程序劃分為若干個小的功能模塊, 并確定各個模塊之間的覆蓋關系, 費時費力, 增加了編程的復雜度;
???? 覆蓋模塊并從外存裝入內存, 實際上是以時間延長來換取空間節省。
Turbo Pascal的Overlay系統單元支持程序員控制的覆蓋技術。
交換技術
目標:多道程序在內存中運行時,讓正在運行的程序或需要運行的程序獲得更多的內存資源。
實現方法:
?????? 可將暫時不能運行的程序送到外存,從而獲得空閑內存空間;
?????? 操作系統把一個進程的整個地址空間的內容保存到外存中(患處swap out),而將外存中的某個進程的地址空間讀入到內存中(換入swap in)。換入和換出內容的大小為整個程序的地址空間。
交換技術實現中的幾個問題:
?????? 交換時機的確定:何時需要發生交換?只當內存空間不夠或有不夠的危險時換出;
?????? 交換區的大小:必須足夠大以存放所有用戶進程的所有內存映像的拷貝;必須能對這些內存映像進行直接存取;
?????? 程序換入時的重定位:換出后再換入的內存位置一定要在原來的位置上嗎?最好采用動態地址映射方法
覆蓋與交換技術的比較
1.覆蓋只能發生在那些相互之間沒有調用關系的程序模塊之間,因此程序員必須經常手動指定程序內各模塊的邏輯覆蓋結構;
2.交換技術是以在內存中的程序大小為單位來進行的,它不需要程序員給出各個模塊之間的邏輯覆蓋技術。
3.總的來說,交換發生在內存中程序與管理程序或操作系統之間,而覆蓋技術發生在運行程序的內部。