程序的載入過程

2021-08-09 15:22:16 字數 1449 閱讀 3252

假如有乙個可執行程式,它有自己的大小。將可執行程式載入到記憶體空間有各種方法,以下是我們便於理解的一種方法。

如上圖,如果想再載入乙個程式進去,理論上空間夠用,但實際上放不進去,因此這種管理方案浪費的記憶體較大,會產生外部碎片

因此我們可以使用頁表來對記憶體進行管理,下圖是使用頁表的方法。

頁表:作業系統會為每乙個程序維護乙個頁表,頁表主要記錄其載入時每個塊對應的頁號。

分頁的特點:不要求所有的塊連續,可以避免外部碎片,但是會產生內部碎片。

由上圖,分頁將物理記憶體上的空間劃分為很小的區塊,這個區塊成為頁。記憶體上的程式使用完後釋放,再迴圈使用,可以提高空間使用率。

假如上圖的記憶體有20個區塊,可執行程式有5個區塊,則記憶體可以載入20/5=4個程式,此時記憶體就已經使用完了。當記憶體空間不夠用的時候,就使用虛擬記憶體。

虛擬記憶體

概念:虛擬記憶體是在磁碟空間開闢空間作為記憶體的乙個補充。

程序可以一部分駐留在記憶體上,而其他部分儲存在虛擬記憶體上。

虛擬記憶體的優點

1、作業系統同時執行的程序數量會大幅提公升。

2、作業系統可以執行比記憶體空間大的多的程序。

接下來詳細描述一下程序的載入過程:

當乙個程式載入到記憶體時,剛開始只載入0號塊,剩下的塊暫時不會訪問到,不用載入到記憶體,放在虛擬記憶體上就可以。因此上圖記憶體可以同時載入20塊,即20個程式。假如系統有3g的記憶體,第乙個程序只佔4k,其他剩餘的3g-4k的記憶體可以載入其他程式。

但是當去記憶體訪問0號塊完畢時,如果要訪問1號塊,但此時1號塊不在記憶體上而在虛擬記憶體上,此時就會發生頁中斷(頁錯誤)。此時cpu無法執行,中斷處理程式會掃瞄虛擬記憶體,然後找到1號塊所在的虛擬記憶體的空間,將其載入到記憶體,cpu再次掃瞄,程式正常執行。

使用虛擬記憶體這種管理方式的缺點是浪費時間,中斷處理程式執行時,cpu需要等待,會浪費時間。

接下來講乙個名詞,叫做系統抖動

系統抖動概念:在請求分頁儲存管理中,從記憶體剛剛換出某一頁面後,根據請求又馬上換入該頁,這種反覆換入換出的現象,叫系統抖動,或系統顛簸。

系統抖動是因為頁錯誤太多,頻繁出現頁中斷,浪費cpu大部分時間。

為了降低系統抖動,降低頁錯誤次數,就要使用頁面置換演算法(fifo),原則是先進先出,但這種演算法只是在按順序訪問位址空間時是理想的。因此我們可以使用另一種演算法,即最近最久未使用演算法(lru),它是置換最近過去一段時間最久未使用的頁面。

類的載入過程

類的載入過程 1 在建立物件時,會先判斷物件所屬的型別 類 在記憶體中是否存在,如果存在則直接使用 如果不存在,則把類載入到記憶體中的方法區下 2 在把類 class 載入到方法區時,分兩種情況 2.1 從.class檔案的上面向下依次載入內容 2.2 靜態的內容載入到方法區的靜態區域下 非靜態內容...

類的載入過程

person person new person 為例進行說明。1 因為new用到了person.class,所以會先找到person.class檔案,並載入到記憶體中 2 執行該類中的static 塊,如果有的話,給person.class類進行初始化 3 在堆記憶體中開闢空間分配記憶體位址 4 ...

類的載入過程

類的載入過程,可分為三個階段,載入 連線 初始化。初始化,為類的靜態變數賦予預設的初始值 jvm規範規定了以下六種主動使用類的場景 被動呼叫,不會導致類的載入和初始化 先看乙個面試題 public class singleton public static singleton getinstance...