存儲器的層次結構‘
多層結構的存儲器系統
存儲器的多層結構。
存儲層次至少應具有三級:最高層為 CPU 寄存器,中間為主存,最底層是輔存。還可以根據具體的功能分工細劃為寄存器、高速緩存、主存儲器、磁盤緩存、固定磁盤、可移動存儲介質等 6 層。在存儲層次中越往上,存儲介質的訪問速度越快,價格也越高,相對存儲容量也越小。
寄存器、高速緩存、主存儲器和磁盤緩存均屬于操作系統存儲管理的管轄范疇,掉電后它們存儲的信息不再存在。固定磁盤和可移動存儲介質屬于設備管理的管轄范疇,它們存儲的信息將被長期保存。
可執行存儲器。
寄存器和主存儲器又被稱為可執行存儲器。
主存儲器與寄存器
主存儲器。
主存儲器簡稱內存或主存。由于主存儲器的訪問速度遠低于 CPU 執行指令的速度,為緩和這一矛盾,在計算機系統中引入了寄存器和高速緩存。
寄存器。
寄存器具有與處理機相同的速度。主要用于存放處理機運行時的數據。如用寄存器存放操作數,或用作地址寄存器加快地址轉換速度等。
高速緩存和磁盤緩存
高速緩存。
高速緩存是介于寄存器和存儲器之間的存儲器,主要用于備份主存中較常用的數據。其容量遠大于寄存器,而比內存約小兩到三個數量級左右。
根據程序執行的局部性原理(即程序在執行時將呈現出局部性規律,在一較短的時間內,程序的執行僅局限于某個部分),將主存中一些經常訪問的信息存放在高速緩存中。當 CPU 訪問一組特定信息時,首先檢查它是否在高速緩存中,在則直接取出使用,否則再從主存中讀取。
磁盤緩存。
由于目前磁盤的 I/O 速度遠低于對主存的訪問速度,因此將頻繁使用的一部分磁盤數據和信息,暫時存放在磁盤緩存中,可減少訪問磁盤的次數。但磁盤緩存與高速緩存不同,它本身并不是一種實際存在的存儲介質,而是利用主存中的部分存儲空間暫存從磁盤中讀出(或寫入)的信息。
程序的裝入和鏈接
用戶程序要在系統中運行,必須先將它裝入內存,然后再將其轉變為一個可以執行的程序,通常都要經過以下幾個步驟:
1)編譯,由編譯程序將用戶源代碼編譯成若干個目標模塊。
2)鏈接,由鏈接程序將編譯后形成的一組目標模塊,以及它們所需要的庫函數鏈接在一起,形成一個完整的裝入模塊。
3)裝入,由裝入程序將裝入模塊裝入內存。
程序的裝入
絕對裝入方式。
僅能運行單道程序時可以采用該種方式。裝入模塊被裝入內存后,程序中的邏輯地址與實際內存地址完全相同。
可重定位裝入方式。
采用可重定位裝入方式,根據內存的當前情況,將裝入模塊裝入到內存的適當位置。值得注意的是,在采用可重定位裝入程序將裝入模塊裝入內存后,會使裝入模塊中的所有邏輯地址與實際裝入內存的物理地址不同。通常是把在裝入時對目標程序中指令和數據地址的修改過程稱為重定位。又因為地址變換通常是在裝入時一次完成的,以后不再改變,故稱為靜態重定位。
動態運行時裝入方式。
動態運行時的裝入程序在把裝入模塊裝入內存后,并不立即把裝入模塊中的相對地址轉換為絕對地址,而是把這種地址轉換推遲到程序真正要執行時才進行。因此,裝入內存后的所有地址都仍是相對地址。為使地址轉換不影響指令的執行速度,這種方式需要一個重定位寄存器的支持。
程序的鏈接
靜態鏈接方式。
在程序運行之前,先將各目標模塊及它們所需的庫函數,鏈接成一個完整的裝配模塊,以后不再拆開。在將這幾個目標模塊裝配成一個裝入模塊時,須解決以下兩個問題:
1)對相對地址進行修改。這是因為在由編譯程序所產生的所有目標模塊中,使用的都是相對地址,其起始地址都為 0,每個模塊中的地址都是相對于起始地址計算的。
2)變換外部調用符號。將每個模塊中所用的外部調用符號也都變換為相對地址。
這種先進行鏈接所形成的一個完整的裝入模塊,又稱為可執行文件。
裝入時動態鏈接。
指用戶源程序經編譯后所得的目標模塊,在裝入內存時采用邊裝入邊鏈接的鏈接方式。這樣便于裝入前修改和更新,以及實現對目標模塊的共享。
運行時動態鏈接。
將對某些模塊的鏈接推遲到程序執行時才進行鏈接,亦即,在執行過程中,當發現一個被調用模塊尚未裝入內存時,立即由 OS 去找到該模塊并將之裝入內存,把它鏈接到調用者模塊上。凡在執行過程中未被用到的目標模塊,都不會被調入內存和被鏈接到裝入模塊上,這樣不僅可加快程序的裝入過程,而且可節省大量的內存空間。
連續分配存儲管理方式
為了能將用戶程序裝入內存,必須為它分配一定大小的內存空間。
單一連續分配
只能用于單道程序環境下,整個內存的用戶空間由一個程序獨占。
固定分區分配
將內存用戶空間劃分為若干個固定大小的區域,在每個分區中只裝入一道作業。
劃分分區的方法。
分區大小相等、分區大小不等。
內存分配。
通常將分區按大小進行排隊,并為之建立一張分區使用表,其中各表項包括每個分區的起始地址、大小及狀態(是否已分配)。當有一用戶程序要裝入時,由內存分配程序檢索該表,從中找出一個能滿足要求的、尚未分配的分區,將之分配給該程序,然后將該表項中的狀態置為“已分配”。
動態分區分配
又稱可變分區分配。
動態分區分配中的數據結構。
常用的數據結構有以下兩種形式:
空閑分區表,表目:分區號、分區大小、分區始址、狀態。
空閑分區鏈,在每個分區的起始部分設置一些用于控制分區分配的信息,以及用于鏈接各分區所用的前向指針;在分區尾部則設置一后向指針,以及前后都重復設置狀態位和分區大小表目。通過前、后向鏈接指針,可將所有的空閑分區鏈接成一個雙向鏈。
動態分區分配算法。
順序式搜索算法、索引式搜索算法。
分區分配操作。
1)分配內存:
系統應利用某種分配算法,從空閑分區鏈(表)中找到所需大小的分區。設請求的分區大小為 u.size,表中每個空閑分區的大小可表示為 m.size。若 m.size-u.size≤size(size 是事先規定的不再切割的剩余分區的大小),說明多余部分太小,可不再切割,將整個分區分配給請求者;否則(即多余部分超過 size),從該分區中按請求的大小劃分出一塊內存空間分配出去,余下的部分仍留在空閑分區鏈(表)中。然后,將分配區的首址返回給調用者。
2)回收內存:
當進程運行完畢釋放內存時,系統根據回收區的首址,從空閑區鏈(表)中找到相應的插入點,此時可能出現以下四種情況之一:
①回收區與插入點的前一個空閑分區相鄰接,此時應將回收區與插入點的前一分區合并。
②回收分區與插入點的后一空閑分區相鄰接,此時也可將兩分區合并。
③回收區同時與插入點的前、后兩個分區鄰接,此時將三個分區合并。
④回收區既不與前一個鄰接,又不與后一個鄰接,這時應為回收區單獨建立一新表項,填寫回收區的首址和大小,并根據其首址插入到空閑鏈中的適當位置。
基于順序搜索的動態分區分配算法
順序搜索,是指依次搜索空閑分區鏈上的空閑分區,去尋找一個其大小能滿足要求的分區。
碎片:內存空間不斷被劃分,會留下許多難以利用的、很小的空閑分區。
首次適應算法。
要求空閑分區鏈以地址遞增的次序鏈接。在分配內存時,從鏈首開始順序查找,直至找到一個大小能滿足要求的空閑分區為止,缺點是低址部分會不斷被劃分,形成碎片。
循環首次適應算法。
在為進程分配內存空間時,不再是每次都從鏈首開始查找,而是從上次找到的空閑分區的下一個空閑分區開始查找。實現可通過設置一起始查尋指針,用于指示下一次起始查尋的空閑分區,并采用循環查找方式。缺點缺乏大的空閑分區。
最佳適應算法。
總是把能滿足要求、又是最小的空閑分區分配給作業,為了加速尋找,該算法要求將所有的空閑分區按其容量以從小到大的順序形成一空閑分區鏈。缺點產生許多碎片。
最壞適應算法。
在掃描整個空閑分區表或鏈表時,總是挑選一個最大的空閑區,分割一部分空間給作業使用。要求將所有的空閑分區按其容量以從大到小的順序形成一空閑分區鏈,查找時只要看第一個分區能否滿足作業要求即可。缺點缺乏大的空閑分區。
基于索引搜索的動態分區分配算法
快速適應算法。
又稱為分類搜索法。是將空閑分區根據其容量大小進行分類,對于每一類具有相同容量的所有空閑分區,單獨設立一個空閑分區鏈表,同時在內存中設立一張管理索引表,該表的每一個表項對應了一種空閑分區類型,并記錄了該類型空閑分區鏈表表頭的指針。
該算法僅需要根據進程的長度,尋找到能容納它的最小空閑區鏈表,并取下第一塊進行分配即可。在分配過程中,不會對任何分區產生分割。
伙伴系統。
規定,無論已分配分區或空閑分區,其大小均為 2 的 k 次冪(k 為整數,l≤k≤m)。通常 2^m是整個可分配內存的大小。
對于每一類具有相同大小的所有空閑分區,單獨設立一個空閑分區雙向鏈表。
當需要為進程分配一個長度為 n 的存儲空間時,首先計算一個 i 值,使 2^(i-1) < n ≤ 2^i,然后在空閑分區大小為 2^i 的空閑分區鏈表中查找。若找到則直接分配。否則,則在分區大小為 2^(i+1) 的空閑分區鏈表中尋找。若存在 2^(i+1) 的一個空閑分區,則把該空閑分區分為相等的兩個分區,這兩個分區稱為一對伙伴,其中的一個分區用于分配,而把另一個加入分區大小為 2^i 的空閑分區鏈表中。若仍然找不到,依次類推去尋找更高1次冪的分區。
與一次分配可能要進行多次分割一樣,一次回收也可能要進行多次合并,如回收大小為 2^i的空閑分區時,若事先已存在回收塊所對應的2^i伙伴塊的空閑分區時,則應將其與伙伴分區合并為大小為2^(i+1)的空閑分區,若事先已存在新合并空閑塊對應的2^(i+1)伙伴塊的空閑分區時,依次類推合并。
對于一個大小為2^k,地址為x的內存塊,其伙伴塊的地址則用buddy k (x)表示,其通式為:
if(x MOD 2^(k+1) == 0) {
buddy k (x) = x + 2^k;
}
else if(x MOD 2^(k+1) == 2^k) {
buddy k (x) = x - 2^k;
}
哈希算法。
構造一張以空閑分區大小為關鍵字的哈希表,該表的每一個表項記錄了一個對應的空閑分區鏈表表頭指針。
動態可重定位分區分配
緊湊。
在連續分配方式中,必須把一個系統或用戶程序裝入一連續的內存空間。當一臺計算機運行了一段時間后,它的內存空間將會被分割成許多小的分區,而缺乏大的空閑分區。
通過移動內存中作業的位置,以把原來多個分散的小分區拼接成一個大分區的方法,稱為“拼接”或“緊湊”。由于經過緊湊后的某些用戶程序在內存中的位置發生了變化。為此,在每次“緊湊”后,都必須對移動了的程序或數據進行重定位。
動態重定位。
在動態運行時裝入的方式中,作業裝入內存后的所有地址都仍然是相對(邏輯)地址,將相對地址轉換為物理地址的工作,被推遲到程序指令要真正執行時進行。
地址變換過程是在程序執行期間,隨著對每條指令或數據的訪問借助重定位寄存器自動進行的,故稱為動態重定位。當系統對內存進行了“緊湊”而使若干程序從內存的某處移至另一處時,不需對程序做任何修改,只要用該程序在內存的新起始地址,去置換原來的起始地址即可。
動態重定位分區分配算法。
動態重定位分區分配算法與動態分區分配算法基本上相同,差別僅在于:在這種分配算法中,增加了緊湊的功能。
對換
多道程序環境下的對換技術
對換的引入。
所謂“對換”,是指把內存中暫時不能運行的進程或者暫時不用的程序和數據調出到外存上,以便騰出足夠的內存空間,再把已具備運行條件的進程或進程所需要的程序和數據調入內存。
對換的類型。
1)整體對換。
處理機中級調度實際上就是存儲器的對換功能。其目的用于解決內存緊張問題。由于中級調度是以進程為單位的,故又稱之為“進程對換”或“整體對換”。
2)頁面(分段)對換。
以進程的一個“頁面”或“分段”為單位進行的,分別稱為“頁面對換”、“分段對換”,又統稱為“部分對換”。
在此,我們只介紹進程對換,而分頁或分段對換將放在虛擬存儲器中介紹。
對換空間的管理
對對換空間管理的主要目標。
在具有對換功能的 OS 中,通常把外存分為文件區和對換區。
1)對文件區管理的主要目標。
是提高文件存儲空間的利用率,為此,對文件區采取離散分配方式。
2)對對換區管理的主要目標。
對換操作較頻繁。故是提高進程換入和換出的速度。為此,采取的是連續分配方式,較少考慮外存中的碎片問題。
對換空間空閑盤塊管理中的數據結構。
與動態分區分配方式中的數據結構相似,即空閑分區表或空閑分區鏈。在每個表目中包含兩項:對換區的首址及其大小,分表用盤塊號和盤塊數表示。
對換空間的分配與回收。
與動態分區分配方式中內存分配與回收方法雷同。
進程的換出與換入
進程的換出。
換出過程:
1)選擇被換出的進程。首先選擇處于阻塞或睡眠狀態的進程,如果有多個,則選擇優先級最低的進程。在有的系統除了考慮優先級,還需考慮進程在內存的駐留時間。如果系統中已無阻塞進程且內存仍不足時,則選擇優先級最低的就緒進程換出。
2)進程換出過程。只能換出非共享的程序和數據段,對于共享的只要還有進程需要,就不能換出。在進行換出時,①需要申請對換空間。②若申請成功,就啟動磁盤,將該進程的程序和數據傳送到磁盤的對換區上。③若傳送成功,便可回收該進程所占的內存空間,并對該進程的PCB和內存分配表等進行相應的修改,若還有可換出進程,則繼續換出,直至內存中再無阻塞進程為止。
進程的換入。
定時執行換入操作。找出“就緒”狀態但已換出的進程,將其中換出時間最久的進程作為換入進程,為它申請內存。若申請成功則調入,若失敗則需先將內存中的某些進程換出,再將進程換入。直到外存中再無“就緒且換出”狀態的進程為止,或者已無足夠的內存來換入進程時,對換進程停止換入。
基本分頁存儲管理方式
比較連續分配方式:
作業邏輯地址空間有M大,就需要向內存申請一個M大的連續區域。
分頁的目的是更細粒度的處理空間,減少粗放管理的浪費或開銷問題。
離散分配內存:
作業規定大小劃分成小份;內存也按同樣大小劃分成小份
作業的任一小份可分散放入內存任意未使用的小份
分頁方式下,內存的使用率高,浪費少。但不是絕對沒有碎片(進程的最后一頁不總是能占滿一個物理塊)
1)頁面的概念
內存劃分成多個小單元,每個單元K大小,稱(物理)塊。作業也按K單位大小劃分成片,稱為頁面。
① 物理劃分塊的大小 = 邏輯劃分的頁的大小
②頁面大小要適中。
太大,(最后一頁)內碎片增大,類似連續分配的問題。 ?
太小的話,頁面碎片總空間雖然小,提高了利用率,但每個進程的頁面數量較多,頁表過長,反而又增加了空間使用。
2)頁表的概念
為了找到被離散分配到內存中的作業,記錄每個作業各頁映射到哪個物理塊,形成的頁面映射表,簡稱頁表。
每個作業有自己的頁表
頁表的作用:
?? ??? ?頁號到物理塊號的地址映射
要找到作業A
?? ??關鍵是找到頁表(PCB)
?? ??根據頁表找物理塊
若內存和作業均按1K大小劃分塊或頁,一個4K大的作業可如下圖般分配:
①離散分配過程:
找空---空閑空間管理
放入---裝入與地址映射 (形成頁表)
記錄---頁表地址記入pcb
②如何運行一個作業?
連續方式下
? PCB記錄內存首地址,根據該地址順序取指令執行即可。
離散方式下
? 頁表記錄作業的各頁分別占用了內存的哪些塊; ?pcb則記錄頁表在內存的地址——進程構造時伴隨著構造頁表,該核心信息也要放在內存中供訪問;
3)地址的處理
地址映射(地址計算)的過程:
若要執行某作業的一條指令,其相對地址是24B (設10B一頁,頁表如右表),其物理地址到底是多少呢?
分析其所在的頁和偏移得:2號頁(頁號從0開始) ,偏移4B處是該條指令
查頁表找頁面對應的塊(2號頁保存在6號物理塊)
找物理塊6,向下偏移4B,找到要執行的指令。取出執行即可。
計算上就是求商(頁號)及取余(偏移量)的過程
任意一條指令的相對地址如何知道是第幾頁的第幾條指令?
邏輯地址空間分析 ?
設一分頁系統,頁面大小為8B(設8條指令) ?一個大小為 32B 的作業分配內存
規律
作業相對地址在分頁下不同位置的數有一定的意義結構:
?? ??? ??? ?頁號+頁內地址(即頁內偏移)
關鍵的計算是:根據系統頁面大小找到不同意義二進制位的分界線。
從地址中分析出頁號后,地址映射只需要把頁號改為對應物理塊號,偏移不變,即可找到內存中實際位置。
注意:一作業所有指令在用戶地址空間是順序編址
計算口訣 ? ? ? ? ? ??
頁面大小決定偏移量(頁內地址)的位數 n;
作業大小?頁面數量
? ? ? ?頁表長度 a
? ? ? ?頁號的位數 m(或總位數-頁內位數)
內存容量決定塊數,塊數決定編址位數,即頁表項位數 b。
4)地址變換機構
圍繞頁表進行工作,那么頁表數據放在哪?
寄存器。一個進程有n個頁,頁表就需要記錄n項數據,需要n個寄存器。不現實。
內存。只設置一個頁表寄存器PTR(page table register)記錄頁表在內存中的首地址和頁表長度,運行時快速定位頁表。
地址變換過程:
分頁系統中,進程創建,放入內存,構建頁表,在PCB中記錄頁表存放在內存的首地址及頁表長度。
1.運行某進程A時,將A進程PCB中的頁表信息寫入PTR中;
2.每執行一條指令時,根據分頁計算原理,得到指令頁號X和內部偏移量Y;
3.CPU高速訪問PTR找到頁表在哪里;
? ? ? 為防止錯誤檢索,增加預先的判斷: ?計算得到的頁號是否大于頁表長度(即頁表項數) ?一個5頁的進程,頁面編號0-4,若地址計算出的頁號不在該范圍,一定產生了越界錯誤。
4.查頁表數據,得到X實際對應存放的物理塊,完成地址映射計算,最終在內存找到該指令。
5)引入快表——針對訪問速度問題
問題:基本分頁機制下,一次指令需兩次內存訪問,處理機速度降低1/2,分頁空間效率的提高以如此的速度為代價,得不償失。
改進:減少第1步訪問內存的時間。增設一個具有“并行查詢”能力的高速緩沖寄存器,稱為“快表”,也稱“聯想寄存器”(Associative memory),IBM系統稱為TLB(Translation Look aside Buffer)。
快表放什么?: 正在執行進程的頁表的數據項。
快表的寄存器單元數量是有限的,不能裝下一個進程的所有頁表項。雖不能完全避免兩次訪問內存,但如果命中率a高還是能大幅度提高速度。
設一次查找訪問快表時間為t' ,則 ?
EAT= a*t' + (1-a)(t'+t) ? ?+ ? ?t
?? ??? = 2t +t' -t*a
6)兩級、多級頁表,反置頁表 ——針對大頁表占用內存問題
?進程分頁離散存放,但頁表的數據是連續在存放內存的。而頁表可能很大:
?? ??? ?現代操作系統支持非常大的邏輯地址空間的進程。如32位系統,可編址的最大代碼數為232,若頁面大小為4KB(4*210),則支持的最大進程頁表項數可達碼232/212=220,有1M個,每個頁表項占1B(字節),則頁表大小就有1MB。
兩級頁表
將頁表分頁,并離散地將頁表的各個頁面分別存放在不同的物理塊中
為離散分配的頁表再建立一張頁表,稱為“外層頁表”,其每個表項記錄了頁表頁面所在的物理塊號。
分段存儲管理方式
請求分段式的虛擬存儲器系統是基于分段基礎的,自然也具有分段管理系統的好處;同時,同請求分頁管理方式一樣,也需要擴展頁表項的字段,增加狀態位、修改位、存取方式、訪問字段、外存地址和增補位;最后一個字段是分段系統獨有的,用來標記該段是否發生過動態增長;
分段系統的特點就是便于信息的保護和共享;而分段保護中包括越界檢查、存取控制檢查和環保護機構;環保護機制是一種比較完善的保護機制,在該機制中規定:低編號的環具有較高的優先級。OS內核處于0號環內;某些重要的實用程序和操作系統服務處于中間環;而一般程序則被安排到外環上;在環系統中,程序的訪問和調用遵守以下規則:一個程序只可以訪問駐留在相同環或者較低特權環(外環)中的數據和服務;
至于地址轉換、內存空間的分配和回收等與分段系統基本類似(增加了分段置換功能以實現虛擬存儲的需求),詳見存儲器管理之分段存儲管理方式;