程序載入進化史與虛擬記憶體

2021-09-07 11:33:45 字數 2066 閱讀 3988

程式載入的本質是:將可執行檔案載入進記憶體,以供cpu呼叫執行。

原始載入:

在早期的計算機中,程式是直接執行在物理記憶體上的,程式在執行時訪問的位址就是實體地址。

假設我們計算有128mb記憶體,程式a需要10mb,程式b需要100mb,程式c需要20mb。如果我們需要同時執行程式a和b,那麼比較直接的做法是將記憶體的前10mb分配給程式a,10mb~110mb分配給b。

但這樣做,位址空間不隔離,記憶體使用效率低,程式執行的位址不確定。

原始載入就是將可執行檔案全部載入進記憶體,以完成程序任務。

原始載入存在的問題:

1)程式的位址不是從0開始,有違於人們的思維習慣。

2)記憶體不足。

第一次進化:動態裝入

用於解決記憶體不足的問題。

程式執行時所需要的指令和資料必須在記憶體中才能夠正常執行。當然,最簡單的辦法就是將程式執行所需要的全部資源全部裝入記憶體。但是這樣會造成記憶體的浪費。研究發現程式執行是有區域性性原理的,所以比較好的解決方法就是將程式最常用的部分駐留在記憶體中,而將一些不太常用的資料存放在磁碟裡,這就是動態裝入的基本原理。

覆蓋裝入(overlay)和頁對映(paging)是兩種典型的動態裝載方法,它們都利用了程式的區域性性原理。動態裝入的基本思想就是用到哪個模組就將哪個模組裝入記憶體,如果用不到則暫時不裝入,存放到磁碟。

覆蓋裝入

覆蓋裝入的方法把挖掘記憶體潛力的任務交給了程式設計師,程式在編寫時必須手工分割成若干塊,然後編寫乙個小的輔助**來管理這些模組何時應該駐留記憶體,何時應該被替換掉。這個小的輔助**就是所謂的覆蓋管理器(overlay manager)。

程式設計師需要手工將模組按照它們之間的呼叫依賴關係組織成樹狀結構。覆蓋管理器,保證某個模組被呼叫時,整個呼叫路徑上的模組都在記憶體中

頁對映(paging)

頁對映是將記憶體和所有磁碟中的資料和指令按照「頁」為單位劃分成若干個頁,以後所有的裝載和操作的單位就是頁。利用換入換出機制(如fifo,lur等)即可完成。

第二次進化:

安全與共享控制

分頁實際是乙個純粹邏輯上的概念,因為實際的程式和記憶體並沒有被真正的分為了不同的頁面。而分段則不同,他是乙個邏輯實體。乙個段中可以是變數,源**或者堆疊。一般來說每個段中不會包含不同型別的內容。而分段主要有以下幾個作用:

重新編譯: 因為不同型別的資料在不同的段中,但其中乙個段進行修改後,就不需要所有的段都重新進行編譯。

記憶體共享: 對記憶體分段,可以很容易把其中的**段或資料段共享給其他程式,分頁中因為資料**混合在乙個頁面中,所以不便於共享。

安全性: 將記憶體分為不同的段之後,因為不同段的內容型別不同,所以他們能進行的操作也不同,比如**段的內容被載入後就不應該允許寫的操作,因為這樣會改變程式的行為。而在分頁系統中,因為乙個頁不是乙個邏輯實體,**和資料可能混合在一起,無法進行安全上的控制。

動態鏈結: 動態鏈結是指在作業執行之前,並不把幾個目標程式段鏈結起來。要執行時,先將主程式所對應的目標程式裝入記憶體並啟動執行,當執行過程中又需要呼叫某段時,才將該段(目標程式)調入記憶體並進行鏈結。可見,動態鏈結也要求以段作為管理的單位。

保持相容性

所以在現在的x86的體系結構中分段記憶體管理是必選的,而分頁管理則是可選的。

缺點:程序必須全部裝入記憶體。

第三次進化:段頁式管理與虛擬記憶體

分段記憶體管理的優勢在於記憶體共享和安全控制,而分頁記憶體管理的優勢在於提高內利用率。他們之間並不是相互對立的競爭關係,而是可以相互補充的。也就是可以把2種方式結合起來,也就是目前計算機中最普遍採用的段頁式記憶體管理。段頁式管理的核心就是對記憶體進行分段,對每個段進行分頁。這樣在擁有了分段的優勢的同時,可以更加合理的使用記憶體的物理頁。

程序 虛擬記憶體概念與擴充套件

程序執行緒 位址空間 全域性變數 開啟的檔案 程式計數器 子程序暫存器 堆疊 賬戶資訊 狀態程序維護乙個資料結構 包含程序所必須的先關資源 程序控制塊 執行緒 核心態 使用者態 混合使用 訊息傳遞 kill signal pid 套接字 共享記憶體 檔案 訊號量 cooperative thread...

程序虛擬記憶體模型

以32位的作業系統為例,32位的作業系統每個程序對應的虛擬記憶體為4g 232 其中核心區1g,使用者區3g 程序控制塊pcb 1.pcb是程序存在的資料結構,系統通過pcb的存在而感知程序的存在 2.系統通過pcb對程序進行排程和管理 3.程序 pcb 與pid是一對一關係,而與程式檔案之間是多對...

程序的虛擬記憶體

程序屬性資訊的task struct結構體,其中包含程序使用的記憶體資訊。在32位的作業系統中,當程序建立的時候 程式執行時 系統會為每乙個程序分配大小為4gb的虛擬記憶體空間,用於儲存程序屬性資訊。c語言中的變數,通常使用 運算子來獲得其位址,那麼,這個位址就是虛擬位址,在簡單的微控制器中,編寫的...