計算機操作系統之存儲器管理(六)

文章出處:http://www.cnblogs.com/leesf456/p/5616041.html

一. 前言

在分析CPU調度後,接着分析存儲器管理,如何對存儲器進行有效的管理,直接影響着存儲器的利用率和系統性能。下面,開始存儲器管理的學習。

二、存儲器的層次結構

  2.1 主存儲器

  主存儲器是計算機系統中的一個主要部件,用於保存進程運行時的程序和數據,CPU的控制部件只能從主存儲器中取得指令和數據,數據能夠從主存儲器中讀取並將他們裝入到寄存器中,或者從寄存器存入到主存儲器,CPU與外圍設備交換的信息一般也依託於主存儲器地址空間。但是,主存儲器的訪問速度遠低於CPU執行指令的速度,於是引入了寄存機和告訴緩衝。

  2.2 寄存器

  寄存器訪問速度最快,能與CPU協調工作,價格昂貴,容量不大,寄存器用於加速存儲器的訪問速度,如用寄存器存放操作數,或用作地址寄存器加快地址轉換速度等。

  2.3 高速緩存

  高速緩存容量大於或遠大於寄存器,但小於內存,訪問速度高於主內存器,根據程序局部性原理,將主存中一些經常訪問的信息存放在高速緩存中,減少訪問主存儲器的次數,可大幅度提高程序執行速度。通常,進程的程序和數據存放在主存,每當使用時,被臨時複製到高速緩存中,當CPU訪問一組特定信息時,首先檢查它是否在高速緩存中,如果已存在,則直接取出使用,否則,從主存中讀取信息。有的計算機系統設置了兩級或多級高速緩存,一級緩存速度最高,容量小,二級緩存容量稍大,速度稍慢。

  2.4 磁盤緩存

  磁盤的IO速度遠低於對主存的訪問速度,因此將頻繁使用的一部分磁盤數據和信息暫時存放在磁盤緩存中,可減少訪問磁盤的次數,磁盤緩存本身並不是一種實際存在的存儲介質,它依託於固定磁盤,提供對主存儲器空間的擴充,即利用主存中的存儲空間,來暫存從磁盤中讀出或寫入的信息,主存可以看做是輔存的高速緩存,因爲,輔存中的數據必須複製到主存方能使用,反之,數據也必須先存在主存中,才能輸出到輔存。

三、程序的裝入和鏈接

  爲了使程序能夠運行,必須先爲之創建進程,而創建進程的第一件事,就是將程序和數據裝入內存,如何將一個用戶源程序變爲一個可在內存中執行的程序,通常要經過如下幾步,首先是編譯(由編譯程序將用戶源代碼編譯成若干個目標模塊),其次是鏈接(由鏈接程序將編譯後形成的一組目標模塊,以及它們所需要的庫函數鏈接在一起,形成一個完整的裝入模塊),最後是裝入(由裝入程序將裝入模塊裝入內存)。

  3.1 程序的裝入

  在裝入一個模塊到內存時,有絕對裝入方式可重定位裝入方式動態運行時裝入方式

  ① 絕對裝入方式,如果在編譯時知道程序駐留在內存的什麼位置,那麼,編譯程序將產生絕對地址的目標代碼,絕對裝入方式按照裝入模塊中的地址,將程序和數據裝入內存,裝入模塊被裝入內存後,由於程序中的邏輯地址與實際內存地址完全相同,故不需要對程序和數據的地址進行修改。

  ② 可重定位裝入方式,由於絕對裝入方式只能將目標模塊裝入到內存中事先指定的位置,在多道程序環境下,編譯程序不可能事先知道所編譯的目標模塊應放在內存的何處,因此,絕對裝入方式只適用於單道程序環境,在多道程序環境下,所得到的目標模塊的起始地址通常都是以0開始的,程序中的其他地址也都是相對於起始地址計算的,此時應採用可重定位裝入方式,根據內存的當前情況,將裝入模塊裝入到內存的適當位置。該方式會使裝入模塊中的所有邏輯地址與實際裝入內存的物理地址不同,需要對數據地址和指令地址進行修改,通常把再裝入時對目標程序中指令和數據的修改過程稱爲重定位,又因爲地址變換通常是在裝入時一次完成的,以後不再變化,故稱爲靜態重定位

  ③ 動態運行時裝入方式,可重定位裝入方式允許將裝入模塊裝入到內存中任何允許的位置,故可用多道程序環境,但這種方式並不允許程序運行時在內存中移動位置,因爲,程序在內存中的移動,意味着它的物理位置發生了變化,這就必須對程序和數據的地址進行修改後方能運行。然而,在運行過程中它在內存中的位置可能經常要改變,此時就應該採用動態運行時裝入方式。動態運行時的裝入程序在把裝入程序裝入內存後,並不立即把裝入模塊中的相對地址轉換爲絕對地址,而是把這種地址轉換推遲到程序真正要執行時才進行。因此,裝入內存後的所有地址都仍是相對地址,爲了使地址轉換不影響指令的執行速度,需要重定位寄存器的支持。

  3.2 程序的鏈接

  源程序經過編譯後,可得到一組目標模塊,再利用鏈接程序把這組目標模塊鏈接,形成裝入模塊,根據鏈接時間的不同,可把鏈接分爲靜態鏈接(在程序運行之前,先將各目標模塊及他們所需的庫函數,鏈接成一個完整的裝配模塊,以後不再拆開)裝入時動態鏈接(將用戶源程序編譯後所得到的一組目標模塊,在裝入內存時,採用邊裝入邊鏈接的鏈接方式)運行時動態鏈接(對某些目標模塊的鏈接,是在程序執行中需要蓋模塊時,纔對它進行鏈接)

  ① 靜態鏈接,在將目標模塊裝配成一個裝入模塊時,需要對相對地址進行修改(由於編譯程序產生的所有目標模塊中,使用的都是相對地址,其起始地址都爲0,每個模塊中的地址都是相對於起始地址計算的)。也需要變換外部調用符號(將每個模塊中所用的外部調用符號都變換爲相對地址),這種先進行鏈接所形成的一個完整的裝入模塊,又稱爲可執行文件,通常都不再拆開它,要運行時可直接將它裝入內存,這種事先進行鏈接,以後不再拆開的鏈接方式,稱爲靜態鏈接方式。

  ② 裝入時動態鏈接,用戶源程序經編譯後所得是目標模塊,是在裝入內存時邊裝入邊鏈接的,即在裝入一個目標模塊時,若發生一個外部模塊調用事件,將引起裝入程序去找出相應的外部目標模塊,並將它裝入內存,裝入時動態鏈接有如下優點,便於修改和更新(各目標模塊是分開的存放的,所以要修改或更新各目標模塊非常容易),便於實現對目標模塊的共享(很容易將一個目標模塊鏈接到幾個應用模塊上,實現多個應用程序對該模塊的共享)

  ③ 運行時動態鏈接,將某些模塊的鏈接推遲到程序執行時才進行鏈接,即在執行過程中,當發現一個被調用模塊尚未裝入內存時,立即由OS去找到該模塊並將之裝入內存,把它鏈接到調用者模塊上,凡在執行過程中未被調用到的模塊,都不會被調入內存和被鏈接到裝入模塊上,這樣不僅加快程序的裝入過程,同時也節省了大量的內存空間。

四、連續分配方式

  連續分配方式是指爲一個用戶程序分配一個連續的內存空間,可以將連續分配方式分爲單一連續分配固定分區分配動態分區分配動態重定位分區分配

  4.1 單一連續分配

  這是一種最簡單的存儲管理方式,但只能在單用戶、單任務的操作系統中,將內存分爲系統區和用戶區,系統區供OS使用,通常放在內存的低地址,用戶區是指除系統區以外的全部內存空間,提供給用戶使用。

  4.2 固定分區分配

  固定分區分配是一種最簡單的可運行多道程序的存儲管理方式,將內存用戶空間劃分爲若干個固定大小的區域,在每個分區只裝入一道作業,這樣,便允許多道作業併發執行,當有空閒分區時,便可以再從外存的後備作業隊列中選擇一個適當大小的作業裝入該分區,當該作業結束時,又可再從後備作業隊列中找出另一作業調入該分區。

  對於內存的用戶空間的劃分,有如下兩種方法。

  ① 分區大小相等,即所有的內存分區大小相等。缺點是缺乏靈活性,即當程序太小時,會造成內存資源的浪費,程序太大時,一個分區由不足以裝入該程序,只是該程序無法運行。

  ② 分區大小不等,把內存區劃分成含有多個較小的分區、適量中等分配和少量大分區,這樣,便可根據程序的大小爲之分配適當的分區。

  爲了便於內存分配,將分區按大小進行排隊,併爲之簡歷一張分區使用表,其中各表項包括每個分區的起始地址、大小、狀態(是否已分配),當有一個程序需要裝入時,由內存分配程序檢索該表,從中找出一個能滿足要求的,尚未分配的分區,將之分配給該程序,然後將該表項中的狀態設置爲已分配,若未找到大小足夠的分區,則拒絕爲該用戶分配內存。

  4.3 動態分區分配

  動態分區分配是根據進程的實際需要,動態地爲之分配內存空間,在實現可變分區分配時,將涉及到分區分配中所用的數據結構、分區分配算法、分區的分配和回收等。

  ① 分區分配中的數據結構,爲了實現分區分配,胸中必須配置相應的數據結構,用來描述空閒分區和已分配分區的情況,爲分配提供依據,常用的數據結構有如下兩種形式:空閒分區表(在系統中設置一張空閒分區表,用於記錄每個空閒分區的情況,每個空閒分區佔一個表目,表目中包括分區序號、分區始址、分區大小等,在前面已有介紹)、空閒分區鏈(爲了實現對空閒分區的分配和鏈接,在每個分區的起始部分,設置一些用於控制分區分配的信息,以及用於鏈接各分區所用的向前指針;在分區尾部設置一向後指針,這樣,可以將空閒分區鏈接成一個雙向鏈),爲了檢索方便,在分區尾部重複設置狀態爲和分區大小表目,當分區被分配出去以後,把狀態爲從0改成1,此時前後指針都失去意義(已經不再空閒鏈表中)。

  ② 分區分配算法,爲把一個新作業裝入內存,需按照一定的分配算法,從空閒分區表或空閒分區鏈中選出一分區分配給該作業,目前常用一下五種分配算法

  1. 首次適應算法(First Fit)

  以空閒分區鏈爲例進行說明,FF算法要求空閒分區鏈以地址遞增的次序鏈接,在分配內存時,從鏈首開始順序查找,直至找到一個大小能滿足要求的空閒分區爲止,然後再按照作業的大小,從該分區劃出一塊內存空間分配給請求者,餘下的空閒分區仍留在空閒鏈中,若從鏈首直至鏈尾都不能找到一個能滿足要求的分區,則此次內存分配失敗,返回。該算法傾向於優先利用內存中低址部分的空閒分區,從而保留了高址部分的大空閒區,這給以後達到的大作業分配大的內存空閒創造了條件,缺點在與低地址空間不斷被劃分,會留下許多難以利用的、很小的空閒分區,而每次查找又都是從低地址部分開始,這無疑會增加查找可用空閒分區的開銷。

  2. 循環首次適應算法(Next Fit)

  由首次適應算法演變而來,在未進程分配內存空間時,不再是每次都從鏈首開始查找,而是從上次找到的空閒分區的下一個空閒分區開始查找,直至找到一個能滿足要求的空閒分區,從中劃分出一塊與請求大小相等的內存空間分配給作業。進行空閒分區分配時,會採用循環查找方式,即如果最後一個(鏈尾)空閒分區的大小仍不能滿足要求,則返回第一個空閒分區。該算法能使內存中的空閒分區分佈得更加均勻,從而減少了查找空閒分區時的開銷,但是會缺乏大的空閒分區

  3. 最佳適應算法(Best Fit)

  該算法總是能把滿足要求、又是最小的康縣分區分配給作業,避免大材小用,爲了加速尋找,該算法要求把所有的空閒分區按其容量以從小到大的順序形成一個空閒分區鏈,這樣,第一次就能找到滿足要求的空閒區,必然是最佳的,孤立地看,最佳適應算法似乎是最佳的,然而宏觀上卻不一定,因爲每次分配後所切割下來的剩餘部分總是最小的,會留下很多難以使用的小空閒區

  4. 快速適應算法(Quick Fit)

  該算法又稱爲分類搜索法,是將空閒分區容量大小進行分類,對於每一類具有相同容量的所有空閒分區,單獨設立一個空閒分區鏈表,這些,系統中存在多個空閒分區鏈表,同時在內存中設立一張管理索引表,該表的每一項對應了一種空閒分區類型,並記錄了該類型空閒分區鏈表表頭的指針。該算法的優點是查找效率高,僅需根據進程的長度,尋找到能容納它的最小空閒區鏈表,並取下第一塊進行分配即可。該算法在進行空閒分區分配時,不會對任何分區產生分割,所以能保留大的分區,滿足對大空間的需求,也不會產生內存碎片。但是在分區歸還主存時算法複雜,系統開銷大。

  ③ 分區分配操作,在動態分區分配存儲管理中,主要的操作是分配內存回收內存

  1. 分配內存

  系統利用某種分配算法,從空閒分區鏈(表)中找到所需大小的分區,其流程圖如下

  說明:size表示事先規定的不再切割的剩餘分區的大小。空閒分區表示爲m.size,請求分區的大小爲u.size。

  2. 回收內存

  當進程運行完畢釋放內存時,系統根據回收區的首址,從空閒區鏈(表)中找到相應的插入點,此時會出現如下四種情況之一:回收分區與插入點的前一個空閒區F1相鄰接,此時將回收區與插入點的前一分區合併,不必爲回收區分配新表項,只需要修改前一分區F1的大小。回收分區與插入點的後以空閒分區F2相鄰接,此時將兩分區合併,形成新的空閒分區,用回收區的首址作爲新空閒區的首址,大小爲兩者之和。回收區同時與插入點的前、後兩個分區鄰接,此時將三個分區合併,使用F1的表項和F1的首址,取消F2的表項,大小爲三者之和。回收區既不與F1鄰接,也不與F2鄰接,這時爲回收區單獨建立一個新表項,填寫回收區的首址和大小,並根據其首址插入到空閒鏈中的適當位置。

  4.4 夥伴系統

  夥伴系統規定,無論已分配分區還是空閒分區,其大小均爲2的k次冪,k爲整數,1<= k <= m,其中,2^1表示分配的最小分區的大小,2^m表示分配的最大分區的大小,通常2^m是整個可分配內存的大小。假設系統開始時的初始容量爲2^m個字,由於不斷切分,可能會形成若干個不連續的空閒分區,將這些空閒分區根據分區的大小進行分類,對於每一類具有相同大小的所有空閒分區,單獨設立一個空閒分區雙向鏈表。這樣,不同大小的空閒分區形成了k個空閒分區鏈表。

  當需要爲進程分配一個長度爲n的存儲空間時,首先計算一個i值,使2^i-1 < n <= 2^i,然後,在空閒分區大小爲2^i的空閒分區鏈表中查找,若找到,即把該空閒分區分配給進程,否則,表明2^i的空閒分區已經耗盡,在大小爲2^i+1的空閒分區鏈表中查找,若存在,則將該空閒分區分爲兩個大小爲2^i的分區,一個用於分配,一個加入到大小爲2^i的空閒分區鏈表中,若還是不存在,則繼續在大小爲2^i+2的空閒分區鏈表中查找,若存在,則將空閒分區進行兩次分割,一次分割爲兩個大小爲2^i+1的空閒分區,一個加入到大小爲2^i+1的空閒分區鏈表中,另外一個繼續進行分割,分成兩個大小2^i的空閒塊,一個用於分配,另外一個加入到大小爲2^i的空閒分區鏈表中,以此類推。在最壞的情況下,可能需要對2^k的空閒分區進行k此分割才能得到所需分區。

  當回收空閒分區時,也需要經過多次合併,如回收大小爲2^i的空閒分區時,若事先已經存在2^i的空閒分區,則應將其與夥伴分區合併爲一個大小爲2^i+1的空閒分區,若事先已存在2^i+1的空閒分區,則再次進行合併,合併爲2^i+2的分區,以此類推。

  4.5 可重定位分區分配

  在連續分配方式中,必須把一個系統或用戶程序裝入一連續的內存空間,若果在系統中只有若干個小的分區,即使他們容量總和大於要裝入的程序,但由於這些分區不相鄰接,也無法把該程序裝入內存。若想裝入,則將內存中的所有作業進行移動,使他們全部相鄰接,這樣,即可把原來分散的多個小分區拼接成一個大分區,這時,就可以把作業裝入該區。經過緊湊後的某些用戶程序在內存中的位置發生了變化,此時若不對程序和數據的地址加以修改(變換),則程序必將無法執行,爲此,在每次緊湊之後,都必須對移動了的數據和程序進行重定向

  在動態運行時裝入的方式中,作業裝入內存後的所有地址都仍然是相對地址,將相對地址轉化爲物理地址的工作,退推遲到程序指令要真正執行時進行。爲了是地址變換不影響指令的執行速度,在系統中增設了一個重定位寄存器,用它來存放程序(數據)在內存中的起始地址。在程序執行時,真正訪問的內存地址是相對地址與重定位寄存器中的地址相加而形成的。該動作是隨着對每條指令或數據的訪問自動進行的,故稱爲動態重定位,當系統對內存進行了緊湊而使若干程序在內存中移動時,不需要對程序做任何修改,只要用該程序在內存的新起始地址去置換原來的起始地址即可。

  動態重定位分區分配算法與動態分區分配算法基本上相同,差別僅在於:在這種分配算法中,增加了緊湊功能,通常,在找不到足夠大的空閒分區來滿足用戶需求時進行緊湊。

  4.6 對換

  在多道程序環境下,一方面,在內存中的某些進程由於某事件尚未發生而被阻塞運行,但它卻佔用了大量的內存空間,甚至有時可能出現在內存中所有進程都被阻塞而迫使CPU停止下來等待的情況,另一方面,卻有很多作業在外存上等待,因無內存而無法進入內存運行的情況,這是對系統資源的浪費,爲了解決這個問題,增設了對換設施,對換是把內存中暫時不能運行的進程或者暫時不用的程序和數據調出到外存上,以便騰出足夠的內存空間,再把已具備運行條件的進程或者進程所需要的程序和數據調入內存。對換是提高內存利用率的有效措施。如果對換的單位是進程,便稱爲整體對換或進程對換,爲了實現進程對換,系統必須實現對換空間的管理進程的換出進程的換入

  ① 對換空間的管理,在具有對換功能的OS中,通常把外存分爲文件區和對換區,前者用於存放文件,後者用於存放從內存換出的進程。由於文件通常是較長久的駐留在外存上,文件區的管理主要目標是提高存儲空間的利用率,採取離散分配方式,進程通常在對換區中駐留的時間較短暫,對換操作較頻繁,故對對換空間管理的主要目標是提高進程換入和換出的速度,採取的是連續分配的方式,較少考慮外存中的碎片問題。

  ② 進程的換出,每當進程由於創建子進程而需要更多的內存空間,但又無足夠的內存空間情況時,系統應將某進程換出,首先,系統首先選擇處於阻塞狀態且優先級最低的進程作爲換出進程,然後啓動磁盤,將該進程的程序和數據傳送到磁盤的對換區上,若傳送過程沒有錯誤,則可回收該進程所佔用的內存空間,並對該進程的進程控制塊做相應的修改。

  ③ 進程的換入,系統定時地查看所有進程的狀態,從中找出就緒狀態但已換出的進程,將其中換出時間最久的進程作爲換入進程,將其換入,直至無換入的進程或無可換出的進程爲止。

五、基本分頁存儲管理方式

  連續分配方式會形成很多碎片,爲之進行緊湊操作的開銷非常大,如果允許一個進程直接分散地裝入到許多不相鄰接的分區中,則無須進行緊湊操作,基於這一思想產生了離散分配方式,如果離散分配的基本單位是頁,則稱爲分頁存儲管理方式,若爲段,則爲分段存儲管理方式。

  5.1 頁面與頁表

  分頁存儲管理是將一個進程的邏輯地址空間分成若干個大小相等的片,稱爲頁面或頁,併爲各頁進行編號,從0開始。相應地,把內存空間分成與頁面相同大小的若干個存儲塊,稱爲(物理)塊或者頁框,也同樣爲它們編號,如0#塊,1#塊等。在未進程分配內存時,以塊爲單位將進程的若干個頁分別裝入到多個可以不相鄰接的物理塊中,由於進程的最後一頁經常裝不滿一塊而形成不可利用的碎片,稱之爲頁內碎片

  在分頁系統中的頁面其大小應適中,頁面若太大,一方面可以是內存碎片減少,有利於提供內存利用率,但是,每一個進程佔用的頁面較多,導致頁表過長,佔用太多內存,會降低頁面換進換出的效率。頁面若太大,可減少頁表的長度,提供頁面換進換出的速度,但是,內存碎片會增大,所以,也頁面大小應適中,通常爲512B~8K

  分頁地址中的地址結構如下

  說明:前一部分爲頁號P,後一部分爲位移量W(或稱爲頁內地址),總共32位,其中0~11位爲頁內地址,每頁大小4KB,12~31位爲頁號,地址空間最多允許1M頁。

  爲了能夠保證在內存中找到每個頁面所對應的物理塊,系統爲每個進程建立了一張頁面映射表,簡稱爲頁表。頁表項紀錄了相應頁在內存中對應的物理塊號,在配置了頁表後,進程執行時,通過查找該表,即可找到每頁在內存中的物理塊號,頁表實現了從頁號到物理塊號的地址映像

  即使在簡單的分頁系統中,也常在頁表的表項中設置一存取控制字段,用於對該存儲塊中的內存加以保護,當存取控制字段僅有一位時,可用來規定該存儲塊中的內存時允許讀/寫,還是隻讀;若存取控制字段爲二位,則可規定爲讀/寫、只讀、只執行等存取方式。

  5.2 地址變換機構

  爲了能夠將用戶地址空間中的邏輯地址變換爲內存空間中的物理地址,在系統中必須設置地址變換機構,該機構的基本任務是實現從邏輯地址到物理地址的轉換,由於頁內地址與物裏塊內的地址一一對應,無須再進行轉換,因此,地址變換機構的任務實際上只是將邏輯地址中的頁號轉換爲內存中的物理塊號。又因爲頁面映射表的的作用就是用於實現從頁號到物理塊號的變換,因此,地址變換任務是藉助頁表來完成的

  頁表的功能可以由一組專門的寄存器來實現,一個頁表項用一個寄存器,由於寄存器具有較高的訪問速度,因而有利於提高地址變換的速度,但成本較高,且頁表項一般會很多,都使用寄存器實現不太現實,因此,頁表大多駐留在內存。在系統中只設置一個頁表寄存器PTR(Page-Table Register),用於存放頁表在內存的始址和頁表的長度,平時,進程執行時,頁表的始址和頁表長度存放在本進程的PCB中,當調度程序調度到某進程時,將這兩個數據裝入頁表寄存器,因此,在單處理機環境下,雖然系統中可以運行多個進程,但只需要一個頁表寄存器。

  當進程要訪問某個邏輯地址中的數據時,分頁地址變換機構會自動地將有效地址(相對地址)分爲頁號和頁內地址兩部分,再以頁號爲索引去檢索頁表,查找操作由硬件執行,在執行檢索前,先將頁號與頁表長度進行比較,若頁號大於或等於頁表長度,則表示本次訪問的地址超越了進程的地址空間,這一錯誤將被系統發現併產生一個地址越界中斷。若未出現錯誤,則將頁表始址加上頁號與頁表項長度的乘積,便得到該表項在頁表中的位置,於是可從中得到該頁的物理塊號,將之裝入物理地址寄存器,與此同時,再將有效地址寄存器中的頁內地址送入物理地址寄存器的塊內地址字段中,這樣,便完成了邏輯地址到物理地址的轉換。

  上述操作中,每次存取一個數據時,都會訪問內存兩次,第一次是訪問內存中的頁表,從中找到指定頁的物理塊號,再將塊號與頁內偏移量W拼接,以形成物理地址,第二次訪問時,纔是從第一次所得的地址中獲得所需數據,因此,這種方式會使計算機的處理速度降低一半,爲了提高地址變換速度,可以在地址變換機構中增設一個具有並行查詢能力的特殊高速緩衝寄存器,又稱爲聯想寄存器或快表,用以存放當前訪問的那些頁表項

  此時的變換過程如下,在CPU給出有效地址後(邏輯地址),由地址變換機構自動的將頁號P送入高速緩衝寄存器,並將此頁號與高速緩存中的所有頁號進行比較,若其中有與之相匹配的頁號,便表示所要訪問的頁表項在快表中,於是,可以直接從快表中讀出該頁所對應的物理塊號,並送到物理地址寄存器中,如在快表中沒有找到,則還需要再訪問內存中的頁表,找到後,把從頁表項讀出的物理塊好送入地址寄存器,同時,再將此頁表項存入快表的寄一個寄存器單元,即修改快表,如果快表已滿,則OS需要找到一個老的且已被認爲不再需要的頁表項,將它換出。

  5.3 兩級和多級頁表

  現代計算機系統中,可以支持非常大的邏輯地址空間(2^32~2^64),這樣,頁表就變得非常大,要佔用非常大的內存空間,如,具有32位邏輯地址空間的分頁系統,規定頁面大小爲4KB,則在每個進程頁表中的頁表項可達1M(2^20)個,又因爲每個頁表項佔用一個字節,故每個進程僅僅頁表就要佔用1MB的內存空間,而且要求連續,這顯然是不現實的,可以通過如下兩個方法解決該問題。

  ① 採用離散分配方式來解決難以找到一塊連續的大內存空間的問題。

  ② 只將當前需要的部分頁表項調入內存,其餘頁表項仍駐留在磁盤上,需要時再調入。

  對於要求連續的內存空間來存放頁表的問題,可利用將頁表進行分頁,並離散地將各個頁面分別存放在不同的物理塊中的辦法來解決,同樣的,也要爲離散分配在頁表再建立一張頁表,稱爲外層頁表。在每個頁表項中記錄了頁表頁面的物理塊號,以32位邏輯地址空間爲例進行說明。

  說明:外層頁號P1爲10位,可以表示1024個物理塊,外層頁表中的外層也內地址P2爲10位,可以表示1024個物理塊,頁內地址爲12位,表示頁面大小爲4K。

  說明:在頁表的每一個表項中存放的是進程的某頁在內存中的物理塊號,如第0頁的0頁存放1#物理塊,第1頁存放4#物理塊,而在外層頁表的每個頁表項中,所存放的是某頁表分頁的首址,如第0頁頁表存放在1011#物理塊中,第1頁頁表存放在1078#物理塊中。

  爲了實現地址變換,在地址變換機構中需要增設一個外層頁表寄存器,用於存放外層頁表的始址,並利用邏輯地址中的外層頁號,作爲外層頁表的索引,從中找到指定頁表分頁的始址,在利用P2作爲指定頁表分頁的索引,找到指定的頁表項,其中即含有該頁在內存的物理塊號,用該塊號和頁內地址d即可構成訪問的內存物理地址。

  將頁表施行離散分配的方法,雖然解決了對大頁表無需大片存儲空間的問題,但是並未解決用較少的內存空間去存放大頁表的問題,換言之,只用離散分配空間的辦法並未減少頁表所佔用的內存空間,解決辦法是把當前需要的一批頁表項調入內存,以後再根據需要陸續調入。在採用兩級頁表結構的情況下,對於正在運行的進程,必須將其外層頁表調入內存,而對頁表則只需要調入一頁或者幾頁,爲了表徵某頁的頁表是否已經調入內存,還應在外層頁表項中增設一個狀態位S,其值若爲0,表示該頁表分頁尚未調入內存,否則,說明已經在內存,進程運行時,地址變換機構根據邏輯地址P1,去查找外層頁表,若所找到的頁表項中的狀態位爲0,則產生一中斷信號,請求OS將該頁表分頁調入內存。

  對於64位的機器而言,採用兩級頁表已經不太合適,如果頁面大小仍採用4KB,那麼剩下52位,若還是按照物理塊的大小(2^12位)來劃分頁表,每個頁表項4B,故一頁中可存放2^10個頁表項,則將餘下的42位用於外層頁號,此時,外層頁表中可能有4096G個頁表項,要佔用16384GB的連續內存空間,顯然是不行的。必須採用多級頁表,即將外層頁表再進行分頁。若計算機的虛擬地址空間大小爲2^64,頁面大小爲4KB,頁表項爲4B,則最少頁表的級數爲6級,首先總的頁面個數爲2^52(64 - 12),其次,每個物理塊能裝入的頁表項爲4KB/4B = 2^10個,10 * 6 > 52,即最少需要6級。

六、基本分段存儲管理方式

   從固定分區到動態分區分配,再到分頁存儲管理方式,其主要動力爲提高內存利用率,引入分段存儲管理的目的在於滿足用戶在編程和使用上多方面的要求。如

  ① 方便編程,用戶可以把自己的作業按照邏輯關係劃分爲若干段,每個段都是從0開始編址,並有自己的名字和長度。

  ② 信息共享,在實現對程序和數據的共享時,是以信息的邏輯單位爲基礎的,比如共享某個函數。

  ③ 信息保護,信息保護同樣是對信息的邏輯單位進行保護。

  ④ 動態增長,在實際應用中,數據段在使用過程中往往會不斷增長,而實現無法確切知道數據段會增長到多大,分段可以較好的解決這個問題。

  ⑤ 動態鏈接,再運行時,先將主程序所對應的目標程序裝入內存並啓動運行,當運行過程中有需要調用某段時,纔將該段調入內存並進行鏈接。

  6.1 分段系統的基本原理

  在分段管理中,作業的地址空間被劃分爲若干個段,每個段定義了一組邏輯信息,如有主程序段MAIN,子程序段X,數據段D及棧段S,每個段都有自己的名字,每個段從0開始編址,並採用一段連續的地址空間,段的長度由相應的邏輯信息組的長度決定,因而各段長度不等,整個作業的地址空間由於是分成多個段,因而是二維的,即其邏輯地址由段號和段內地址構成

  說明:一個作業允許最長有64K個段,每個段的最大長度爲64KB。

  在分段式存儲管理系統中,爲每個分段分配一個連續的分區,而進程中的各個段可以離散地移入內存中不同的分區,爲了使程序正常運行,能夠物理內存中找出每個邏輯段所對應的位置,應該爲每個進程建立一張段映射表,稱爲段表,每個段在表中有一個表項,其中記錄了該段在內存中的起始地址段的長度。段表可以存放在一組寄存器中,這樣有利於提高地址轉換速度,但通常將段表放在內存中。段表用於實現從邏輯段到物理內存區的映射

  爲了實現從進程的邏輯地址到物理地址的變換功能,在系統中設置了段表寄存器,用於存放段表始址和段表TL,在進行地址變換時,系統將邏輯地址中的段號與段表長度TL進行比較,若S>TL,表示段號太大,訪問越界,產生越界中斷信號,若未越界,則根據段表的始址和該段的段號,計算該段對應段表項的位置,從中讀出該段在內存中的起始地址,然後,再檢查段內地址d是否超過該段的段長SL,若超過,同樣發出越界中斷信號,若爲越界,則將該段的基址與段內地址d相加,即得到要訪問的內存物理地址。

  每次訪問一個數據時(需給出段號和段內地址),也需要訪問兩次內存,第一次根據段號獲得基址,第二次根據基址與段內地址之和訪問真實數據的物理地址。這降低了計算機的速率,也可以增設一個聯想存儲器,用來保存最近常用的段表項,用來加速存取數據的時間。

  可以看到,分頁與分段存在很大的相似性,如都採用離散分配方式,都需要通過地址映射機構實現地址變換,但兩者的主要區別如下。

  ① 頁是信息的物理單位,分頁是爲實現離散分配方式,以消減內存的外零頭,提高內存的利用率,或者說,分頁僅僅是由於系統管理的需要而不是用戶的需要,段則是信息的邏輯單位,它含有一組意義相對完整的信息,分段的目的是爲了能更好地滿足用戶的需要。

  ② 頁的大小固定且由系統決定,由系統把邏輯地址劃分爲頁號和頁內地址兩部分,是由機器硬件實現的,一個系統中,只存在一種大小的頁面,段的長度則不固定,決定於用戶所編寫的程序,通常由編譯程序在對源程序進行編譯時,根據信息的性質來劃分。

  ③ 分頁的作業的地址空間是一維的,即單一的線性的地址空間,程序員只利用一個記憶符即可表示一個地址,而分段的作業地址空間是二維的,程序員在標識一個地址是,需要給出段名和段內地址。

  6.2 段頁式存儲管理方式

  分頁系統能夠有效的提高內存利用率(但是會存在頁內碎片),分段系統則能夠很好地滿足用戶需要。若能將兩種方式結合起來,既具有分段系統的便於實現、分段可共享、易於保護、可動態鏈接等優點,又能像分頁系統那樣很好地解決內存的外部碎片問題,基於此,提出了段頁式系統。

  段頁式系統先將用戶程序分成若干個段,再把段分爲若干個頁,併爲每一個段賦予一個段名。段頁式系統中,地址結構由段號段內頁號頁內地址三部分構成。

  

  在段頁式系統中,爲了便於實現地址轉換,須配置一個段表寄存器,其中存放段表始址和段表長TL,進行地址變換時,首先利用段號S,將它與段表長TL進行比較,若S<TL,表示未越界,於是利用段表始址和段號來求出該段所對應的段表項在段表中的位置,從中得到該段的頁表始址,並利用邏輯地址中的段內頁號P來獲得對應頁的頁表項位置,從中讀出該頁所在的物理塊號b,再利用b和頁內地址構成物理地址。

  在段頁式系統中,爲了獲得一條指令或數據,需要訪問內存三次,第一次訪問時訪問內存中的段表,從中取得頁表始址,第二次訪問是訪問內存中的頁表,從中取出該頁所在的物理塊號,並將該塊號與頁內地址一起形成指令或數據的物理地址,第三次訪問纔是真正的從第二次訪問所得的地址中,取出指令或數據。同樣,也可以增設高速緩衝寄存器用於加快訪問速度。

七、虛擬存儲器的基本概念

  前面所介紹的存儲器管理方式都有一個共同的特點,即他們都要求將一個作業全部裝入內存後方能運行,於是,出現了下面兩種情況

  ① 有的作業很大,其所要求的內存空間超過了內存總容量,作業不能全部被裝入內存,致使該作業無法運行。

  ② 做大量作業要求運行,但由於內存容量不足以容納所有這些作業,只能將少數作業裝入內存讓他們先運行,而將其他大量作業留在外存上等待。

  爲了解決上述問題,可以增加物理內存,但是其不太現實,另外是從邏輯上擴充內存容量。

  基於程序的局部性原理(時間侷限性和空閒侷限性),程序在運行之前,沒有必要全部裝入內存,僅需將那些當前要運行的少數頁面或段先裝入內存便可運行。其餘部分暫留在磁盤上,程序運行時,如果它所要訪問的頁(段)已經調入內存,便可繼續執行下去,但如果程序所要訪問的頁(段)尚未調入內存(缺頁或缺段),此時程序應利用OS的請求調頁(段)功能,將它們調入內存,以使進程繼續執行下去。如果此時內存已滿,無法再裝入新的頁(段),則還需利用頁(段)的置換功能,將內存中暫時不用的頁(段)調至磁盤上,再將要訪問的頁(段)調入內存,使程序繼續執行。這樣,可以使很大的用戶程序在較小的內存空間中運行。從用戶的調入看,該系統具有很大的內存容量,但是,用戶看到的大容量只是一種感覺,這種存儲器被稱爲虛擬存儲器。所謂虛擬存儲器,是指具有請求調入功能和置換功能,能從邏輯上對內存容量加以擴充的一種存儲器系統,其邏輯容量由內存容量和外存容量之和決定,其運行速度接近內存,成本接近外存。

  7.1 虛擬存儲器的實現方法

  在虛擬存儲器中,允許將一個作業分多次調入內存,其建立在離散分配的存儲管理方式上

  ① 請求分頁系統,在分頁系統的基礎上,增加了請求調頁功能和頁面置換功能所形成的頁式虛擬存儲系統,其允許只裝入少量頁面的程序(數據),便啓動運行,以後,再通過調頁功能及頁面置換功能,陸續地把要運行的頁面調入內存,同時把暫時不用的頁面換出到外存,置換是以頁面爲單位。其需要必要的硬件和軟件支持。硬件有請求分頁的頁表機制(它是在純分頁的頁表機制上增加若干項而形成的,作爲請求分頁的數據結構)、缺頁中斷機構(每當用戶程序要訪問的頁面尚未調入內存時,便產生一缺頁中斷,請求OS將所缺的頁調入內存)、地址變換機構(在純分頁的基礎上發展形成)。軟件有用於實現調頁的軟件和實現頁面置換的軟件。

  ② 請求分段系統,在分段系統的基礎上,增加了請求調段功能和分段置換功能所形成的段式虛擬存儲系統。其允許只裝入少量段的用戶程序和數據,即可啓動運行,以後再通過調段功能和段的置換功能將咱不運行的段調出,同時調入即將運行的段,置換是以段爲單位。其需要必要的硬件和軟件支持,硬件有請求分段的段表機制(它是在純分頁的段表機制上增加若干項而形成的,作爲請求分段的數據結構)、缺段中斷機構(每當用戶程序要訪問的段尚未調入內存時,便產生一缺段中斷,請求OS將所缺的段調入內存)、地址變換機構(在純分段的基礎上發展形成)。軟件有用於實現調頁的軟件和實現頁面置換的軟件。

   7.2 虛擬存儲器的特徵

  ① 多次性,一個作業會被分成多次調入內存運行,多次性是虛擬存儲器最重要的特徵

  ② 對換性,允許在作業的運行過程中進行換進、換出。換進換出能夠有效地提高內存利用率。

  ③ 虛擬性,使用戶所看到的內存容量遠大於實際內存容量。

  虛擬性是以多次性和對換性爲基礎的,僅當系統允許將作業分多次調入內存,並能夠將內存中暫時不運行的程序和數據換至磁盤上時,纔有可能實現虛擬存儲器,而多次性和對換性有必須建立在離散分配的基礎上。

八、請求分頁存儲管理方式

  請求分頁是建立在分頁基礎上的,增加了請求調頁功能和頁面置換功能。

  8.1 請求分頁中的硬件支持

  ① 頁表機制,其基本作用仍然是將用戶地址空間中的邏輯地址變換爲內存空間中的物理地址,由於只將應用程序的一部分調入內存,還有一部分仍在盤上,故需要再頁表中再增加若干項,供程序(數據)在換進、換出時參考,請求分頁系統中的頁表項如下

  說明:狀態位P,用於指示該頁是否已調入內存,供程序訪問時參考;訪問字段A,用於記錄本頁在一段時間內被訪問的次數,或記錄本頁最近已有多長時間未被訪問,供選擇換出頁面時參考;修改位M,表示該頁在調入內存後是否被修改過,由於內存的每一頁在外存上保留有一個副本,因此,若未被修改,則在置換時就不需要再將該頁寫回到外存上,若被修改,則必須重寫到外存上,M位供置換頁面時參考;外存地址,指出該頁在外存上的地址,通常是物理塊號,供調入該頁時參考。

  ② 缺頁中斷機構,當要訪問的頁面不在內存時,產生一個缺頁中斷,請求OS將缺的頁面調入內存,缺頁作爲中斷,也需要經過保護CPU現場、分析中斷原因、轉入中斷處理程序進行處理、恢復CPU環境等。但是,其與一般中斷相比有一些不同,主要在於:在指令執行期間產生和處理中斷信號(通常CPU都是在一條指令執行完後,才檢查是否有中斷請求到達,若有,則響應,否則,繼續執行下一條指令,然而,缺頁中斷是在指令執行期間,發現所要訪問的指令或數據不再內存時所產生和處理的),一條指令在執行期間,可能產生多次缺頁中斷

  ③ 地址變換機構,在分頁系統地址變換基礎上,爲實現存儲器而增加的某些功能而形成。如產生和處理缺頁中斷,以及從內存中換出一頁功能等。

  8.2 內存分配策略和分配算法

  在爲進程分配內存時,涉及到如下三個問題:最小物理塊數的確定物理塊的分配策略物理塊的分配算法

  ① 最小物理塊數的確定,指能夠保證進程正常運行所需的最小物理塊數,當系統爲進程分配的物理塊數小於此值時,進程將無法運行。進程應獲得的最少物理塊數與計算機的硬件結構有關,取決於指令的格式、功能、尋址方式。

  ② 物理塊的分配策略,在請求分頁系統中,可採取兩種內存分配策略,固定和可變分配策略,在進行置換時,也可採用全局置換和局部置換,可組合出如下三種適用的策略。固定分配局部置換(爲每個進程分配一定數目的物理塊,整個運行期不再改變,如果進程在運行中發現缺頁,則只能從該進程在內存的n個頁面中選出一頁換出,然後再調入一頁,以保證分配給該進程的內存空間不變,若開始爲進程分配的物理塊數太少,則會頻繁缺頁,降低系統吞吐量,若太多,則使內存中駐留的進程數目減少,進而造成CPU空閒或其他資源空閒的情況),可變分配全局置換(先爲系統中的每個進程分配一定數目的物理塊,而OS自身也保持一個空閒物理塊隊列,當某進程發現缺頁時,由系統從空閒物理塊隊列中取出一個物理塊分配給該進程,並將欲調入的缺頁裝入其中,僅當空閒物理隊列的物理塊用完時,OS才能從內存中選擇一頁調出,該頁可能是系統中任一進程的頁,這樣,會是那個進程的物理塊減少,進而使缺頁率增加),可變分配局部置換(爲每個進程分配一定數目的物理塊,當進程缺頁時,只允許從該進程在內存中的頁面中選出一頁換出,這樣不會影響其他進程的運行,如果該進程頻繁發生缺頁,則系統需要再爲該進程分配若干附加的物理塊,直至該進程的缺頁率減少到適當程度爲止,反之,若一個進程正在運行過程中的缺頁率特別低,則此時可適當減少分配給該進程的物理塊數,但不應該引起缺頁率明顯增加)。

  ③ 物理塊分配算法,可採用平均分配算法(將系統中所有可供分配的物理塊平均分配給各個進程)、按比例分配(根據進程的大小按比例分配物理塊)、考慮優先權的分配算法(將重要的,緊迫的作業分配較多的內存空間,可將系統的物理塊分成兩部分,一部分按比例分配給各進程,另一部分則根據進程的優先權適當地增加相應份額後,分配給進程)

九、頁面置換算法

  在進程運行過程中,若其所要訪問的頁面不在內存而需把它們調入內存,但內存已五空閒空間時,爲了保證該進程能正常運行,系統必須從內存中調出一頁程序或數據送磁盤的對換區中,但應將哪個頁面調出,必須根據一定的算法來確定,通常,把選擇換出頁面的算法稱爲頁面置換算法,置換算法的好壞,直接影響到系統的性能。一個好的頁面置換算法,應該具有較低的頁面更換頻率。

  9.1 最佳置換算法

  是一種理論上的算法,所選擇的被淘汰頁面將是以後用不使用的,或者是在最長時間內不再被訪問的,採用最佳置換算法,可以保證獲得最低的缺頁率,由於無法預知一個進程在內存的若干個頁面中,哪個頁面是未來最長時間內不再被訪問的,因而該算法無法實現,但可以以此評價其他算法。假設系統爲某進程分配了三個物理塊,並考慮如下的頁面號引用串:7, 0 ,1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1。在進程運行後的置換如下圖。

  採用最佳置換算法發生了6次頁面置換。

  9.2 先進先出頁面(FIFO)置換算法

  該算法總是淘汰最先進入內存的頁面,即選擇在內存中駐留時間最久的頁面予以淘汰,該算法實現簡單,只需要把一個進程已調入內存的頁面,按照先後次序鏈接成一個隊列,並設置一個指針,稱爲替換指針,使之指向最老的頁面,但該算法與進程實際運行的規律不相適應,因爲在進程中,有些頁面經常被訪問,FIFO算法並不能保證這些頁面不被淘汰。

  使用FIFO算法時進行了12次頁面置換。

  9.3 最近最久未使用(LRU)置換算法

  該算法根據頁面調入內存後的使用情況來進行決策,由於無法預測各頁面將來的使用情況,LRU只能使用最近的過去代替最近的將來,因此,LRU置換算法是選擇最近最久未使用的頁面予以淘汰。該算法賦予每個頁面一個訪問字段,用來記錄一個頁面自上次訪問以來所經歷的時間t,當需要淘汰一個頁面時,選擇現有頁面中其t值最大的,即最近最久未使用的頁面予以淘汰。

  使用LRU算法時進行了9次頁面置換。

  9.4 Clock置換算法

  爲每一頁設置一位訪問位,再將內存中的所有頁面都通過鏈接指針鏈接成一個循環隊列,當某頁被訪問時,其訪問位置爲1,置換算法在選擇一頁淘汰時,只需要檢查頁的訪問位,如果是0,就選擇該頁換出;若爲1,則重新置爲0,暫不換出,給該頁第二次駐留內存的機會,再按照FIFO算法檢查下一頁面。當檢查到隊列中的最後一個頁面時,若其訪問位仍然是1,則再返回到隊首去檢查第一個頁面,該算法只有一位訪問位,只能用它表示該頁是否已經使用過,而置換時是將未使用過的頁面置換出去,故又把該算法稱爲最近未用算法NRU(Not Recently Used)

  在將一個頁面換出時,如果該頁已經被修改過,便需要將該頁重新寫回到磁盤上,但如果沒有被修改過,則不必將它拷回磁盤,在改進的Clock算法中,增加了一個置換代價的因素,這樣,選擇頁面換出時,既要是未使用過的頁面,又是要未被修改過的頁面,把同時滿足這兩個條件的頁面作爲首選淘汰頁面。由訪問位A和修改位M可以組合如下四種類型的頁面

  ① (A = 0, M = 0),表示該頁最近既未被訪問,又未被修改,是最佳淘汰頁面。

  ② (A = 0, M = 1),表示該頁最近未被訪問,但已被修改,並不是很好的淘汰頁面。

  ③ (A = 1, M = 0),表示該頁最近已被訪問,但未被修改,該頁可能被再次訪問。

  ④ (A = 1, M = 1),表示該頁最近已被訪問且被修改,該頁可能再被訪問。

  對於置換而言,執行如下幾步。

  ① 從指針所指示的當前位置開始,掃描循環隊列,尋找A = 0 且 M = 0的第一類頁面,將所遇到的第一個頁面作爲所選中的淘汰頁,在第一次掃描期間不改變訪問位A。

  ② 如果第一步失敗,即查找一週後未遇到第一類頁面,則開始第二輪掃描,尋找A = 0 且 M = 1的第二類頁面,將所遇到的第一個這類頁面作爲淘汰頁。在第二輪掃描期間,將所有掃描過的頁面的訪問位置爲0。

  ③ 如果第二步也失敗,即未找到第二類頁面,則將指針返回到開始位置,並將所有的訪問位復爲0,然後重複第一步,如果仍然失敗,則重複第二步,則一定能夠找到被淘汰的頁。

十、請求分段存儲管理方式

  只需先調入若干個分段便可啓動運行,當所訪問的段不在內存中時,可請求OS將所缺的段調入內存。也同樣需要硬件的支持。

  10.1 請求分段中的硬件支持

  爲了快速完成請求分段功能,需要支持的硬件有段表機制、缺段中斷機制、地址變換機構。

  ① 段表機制,由於只有一部分段裝入內存,其餘段仍留在外存上,需要再段表中增加若干項,以供程序調進、調出時參考。

  說明:各字段意義如下存取方式(用於標識本分段的存取屬性是隻執行、只讀、還是允許讀/寫),訪問字段A(用於記錄該段被訪問的頻繁程度),修改位M(表示該頁在進入內存後是否已被修改過,供置換時參考),存在位P(表示本段是否已調入內存,供程序訪問時參考),增補位(用於表示本段在運行過程中是否做過動態增長),外存始址(本段在外存中的起始地址,即起始盤塊號)。

  ② 缺頁中斷機構,進程運行時發現所需的段尚未調入內存,便由缺段中斷機構產生一個缺段中斷信號,進入OS後由缺段中斷處理程序將所需要的段調入內存。需要在一條指令的執行期間,產生和處理中斷,以及一條指令執行期間,可能會產生多次缺段中斷。

  ③ 地址變換機構,其在分段系統地址變換機構基礎上形成,增加了缺段中斷的請求和處理功能。

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