標籤:style blog http io os 使用 ar 檔案 資料
程式運行
將使用者的一個來源程式變成一個可在記憶體中執行的程式,通常要經過以下幾個步驟:
1、編譯:由編譯器,將程式編譯成若干個目標模組
2、連結:由連結程式將編譯後形成的一組目標模組,以及他們所需要的庫函數連結在一起,形成一個完整的裝入模組。
3、裝入:由裝入程式將裝入模組裝入記憶體
具體討論一下如何把一個裝入模組,裝入記憶體:
1、絕對裝入方式:編譯器產生帶有絕對位址的目標代碼,只適合於單道程式環境。
2、可重定位裝入方式:所得到的模組都是以0開始的,程式中的其它地址也都是相對於起始地址計算的,此時可重定位裝入方式,根據記憶體的情況,將裝入模組裝入到記憶體的適當位置。通常把在裝入時對目標程式中指令和資料的修改過程稱為重定位。又因為地址變換通常是在裝入時一次完成的,以後不再改變,故稱為靜態重定位。
3、動態運行時裝入方式:上一種方式,可將裝入模組裝入到記憶體中任何位置,故可用於多道程式環境,但並不允許程式運行時在記憶體中移動位置。而動態運行時裝入方式,是在把裝入記憶體後,並不立即把裝入模組中的相對位址轉換為絕對位址,而是把這種地址轉換延遲到程式真正要執行時才進行。因此,裝入記憶體後的所有地址都仍是相對位址。為了不影響轉換帶來的不良影響,一般使用一個重定位寄存器。
程式的連結
來源程式經過編譯後,可得到一組目標模組,再利用連結程式將這組目標模組連結,形成裝入模組。根據連結的時間的不同,可把連結分成如下三種:
1、靜態連結:在程式運行之前,先將各目標模組和它們的所用的連結庫,連結成一個完整的裝配模組,以後不再拆開。
2、裝入時動態連結:在把一系列的目標模組裝入記憶體時,採用邊裝入邊連結的連結方式。
3、運行時動態連結:這是指對某些目標模組的連結,是在程式執行中要該模組時,才對它進行連結。
對換:為什麼要用到對換?
在多道程式環境下,在記憶體中的某些進程由於某事件尚未發生,而被阻塞了,但它卻佔用了大量的記憶體空間,另一方面,其他的作業卻在外存上等待。這樣就形成了浪費。因此引用了“對換”這個概念。
對換是把記憶體中能啟動並執行進程或者暫時不用的程式和資料,調出到外存上,以便騰出足夠的記憶體,再把已經具備運行條件的進程或進程所需要的程式和資料,調入記憶體。
如果對換的單位是整個進程,則稱為整體對換,如果對換的單位是段或頁,則稱為部分對換。
對換空間的管理
在具有對換功能的OS中,通常把外存分為檔案區和對換區。前者用於存放檔案,後者用於存放從記憶體換出的進程。
由於對換分區的分配是連續分配方式,因而對換空間的分配與回收,與動態分區方式時的記憶體配置與回收方法雷同。一般用首次適應演算法,迴圈首次適應演算法或最佳適應演算法。
進程的換入與換出:
1、如果某一個進程被阻塞了或是優先順序最低的,一般會把它的程式與資料換出到對換區
2、系統應定時地查看所有的進程的狀態,從中找出“就緒”狀態但已經換出的進程,將其中換出時間最久的進程作為換入進程,將之換入。
基本的分頁儲存管理方式
連續分配方式會形成許多的片段,雖然可通過“緊湊”方法將許多片段拼接成可用的大塊空間,但須為之付出很大的開銷。如果允許將一個進程直接分散地裝入到許多不相鄰接的分區中,則無須再進行“緊湊”。基於這一思想,產生了離散的分配方式。如果離散分配的基本單位是頁,則稱為分頁儲存管理方式;如果是段,則稱為分段儲存管理方式。
在分頁儲存管理中,如果不具備頁面對換功能,則稱為基本的分頁儲存管理方式,或稱為純分頁儲存管理方式,它不具有支援實現虛擬儲存空間的功能。它要求把每個作業全部裝入記憶體後才能運行。
頁面與物理塊
分頁儲存管理,是將一個進程的邏輯地址空間分成若干個大小相等的片,稱為頁面。也把記憶體空間分成和頁面大小相等的儲存塊,稱為物理塊或頁框。由於進程的最後一頁經常裝不滿一塊而形成了不可利用的片段,稱為“頁內片段”
頁面的大小
頁面太小,可以減小頁內片段,提高利用率。但是這樣會使得頁表過長。如果頁面過大,雖然頁面可以變得很短,但是頁內片段太大。所以一般選擇大小適中,且頁面大小就是2的冪,通常是512B-8KB。
地址結構
分頁地址中的地址如下:
一共32位,0-11位是位移量(頁內地址,所以一頁為4KB), 12-31是頁號,所以最多可以有1M頁。
地址變換機構---頁表
為了能將使用者地址空間中邏輯地址,變換為記憶體空間中的物理地址,在系統中必須設定地址變換機構。該機構的基本任務是實現從邏輯地址到物理地址的轉換。由於頁面內的地址與物理塊內的地址是一一對應的。所以只要把邏輯地址的頁號轉換為記憶體中的物理塊號就可以了。
而頁面映射表(頁表)就是用於實現從頁號到物理塊號的變換。因此,地址變換的任務是藉助於頁表來完成的。
基本的地址變換機構
頁表的功能可以藉助一組專門的寄存器來實現。一個頁表項用一個寄存器來實現,但是由於頁表太長,寄存器比較小,而且貴。所以一般把頁表放在記憶體上。在系統中只設定一個頁表寄存器PTR,在其中存入頁表在記憶體中的始址和大小。當程式未執行時,這兩個值是放在PCB中的。當發送器調度到某個進程時,才將這兩個資料裝入頁表寄存器中。因此在單處理機環境下,雖然系統中可以運行多個進程,但只要一個PTR就可以。
當進程要訪問某個邏輯地址中的資料時,分頁地址變換機構會自動地將有效地址分為頁號和頁內地址兩部分。再以頁號為索引去檢索頁表。尋找操作由硬體來執行,提高效率。首先判斷是不是越界,如果不越界,則將頁表始址與頁號和頁表項長度的乘積相加,便得到該表項在頁表中的位置,於是可從中得到該頁的物理塊號,將之裝入物理地址寄存器中。與此同時,再將有效地址寄存器中的頁內地址送入物理地址寄存器的塊內地址欄位中。這樣便完成了從邏輯地址到物理地址的變換。
具有快表的地址變換機構
由於頁表是放在記憶體中的,這使得CPU在每存取一個資料時,要訪問記憶體兩次。
第一次,是找到指定頁面的物理塊號,再將物理塊號和頁內地址相加,得到物理地址。
第二次,從第一次得到的地址中,把對應的資料找到。
那現在有沒有改進的方案呢。是不是可以不用第一次訪存呢?如果不需要的話,那應該有一個地方儲存這個頁表,或頁表的一部分。
為了提高地址變換速度,可在地址變換機構中,增設一個具有並行查尋能力的特殊高速緩衝寄存器,又稱為“聯想寄存器”或快表。
此時的地址變換過程是這樣子的:
在CPU給出有效地址後,由地址變換機構自動地將頁號P送入高速緩衝寄存器,並將此頁號與快取中的所有頁號進行比較,若其中有與此相匹配的頁號,便送到物理地址寄存器中。如在快表中未找到對應的頁表項,則還須再訪問記憶體中的頁表。找到後,把從頁表項中讀出的物理塊號送到地址寄存器,同時,再將此頁表項存入快表的一個突破器單元中,即重修快表。但如果此快表已經滿了,則OS必須找到一個老的且已經被認為不再需要的頁表項,將它換出。
由於成本的考慮,快表不可能做的太大,一般只存16-512個頁表項。
現在的電腦還可以有兩級和多級頁表
基本的分段儲存管理方式
如果說推動儲存管理方式從固定分區到動態分區分配,進而又發展到分頁儲存管理方式的主要動力,是提高記憶體利用率,那麼引入分段儲存管理方式的目的,則主要是為了滿足使用者(程式員)在編程和使用上多方面的要求。
1) 方便編程
通常,使用者把自己的作業按照邏輯關係劃分為若干個段,每個段都是從0開始的。並且有自己的名字和長度。因此,希望要訪問的邏輯地址是由段名和段內地址位移量決定的。如下指令:
Load 1 ,[A]|<d> 其中,含義是將分段A中D單元內的值讀入到寄存器1.
2) 資訊共用
在實現程式和資料的共用時,是以資訊的邏輯單位為基礎的。比如共用某個函數,頁面只是存放資訊的物理塊,不具備完整的意義。而段是資訊的邏輯單位。為了實現段的共用,希望儲存管理能與使用者程式分段的組織方式相適應。
3) 資訊保護
同樣是對資訊的邏輯單位進行保護
4) 動態增長
在實際應用中,有些段,特別是資料區段,是不斷增長的,而事先無法知道大小。分段儲存管理可以很好的解決這個問題。
5) 動態連結
在作業運行之前,並不是把幾個目標程式段連結起來。要運行時,先將主程式對應的目標程式裝入記憶體啟動運行,當運行過程中又要調用某段時,才將該段調入記憶體並進行連結。可見,動態連結也要求以段作為管理的單位。
分段系統的基本原理
1 分段原理
在分段儲存管理方式中,作業的地址空間被劃分為若干個段,每個段定義了一組邏輯資訊。例如主程式段,子程式段,資料區段,棧段。為了實現簡單起見,通常可用一個段號來代替段名,每個段都從0開始編址,並採用一段連續的地址空間。
對於一個作業,由於是分成多個段,因而是一個二維的。所以說邏輯地址是由段號和段內地址組成的。
2 段表
在分段式儲存管理系統中,為每一個分段分配一個連續的分區,而進程中的各個段可以離散地移入記憶體中不同的分區中。為使程式能正常運行,亦即,能從實體記憶體中找出每個邏輯段所對應的位置,就像分頁系統那樣,在系統中為每個進程建立一張段映射表,簡稱“段表”。
每個段在表中佔有一個表項,其中記錄了該段在記憶體中的起始地址和段的長度。段表可以放在寄存器中,這樣有利於提高地址轉換速度;但更常見的是把段表放在記憶體中。在配置了段表後,執行中的進程可通過尋找段表,找到每個段所對應的記憶體區。可見,段表是用於實現從邏輯到實體記憶體區的映射。
3 地址變換機構
為了實現從進程的邏輯地址到物理地址的變換功能,在系統中設定了段表寄存器,用於存放段表始址和段表長度。在進行地址變換時,系統將邏輯地址中的段號與段表長度進行比較,如果段號太大,表示越界,於是產生越界中斷資訊。如果沒有越界,則用段表的始址+段號,得到所在段表的項。之後,就找到了此段的基址。然後,決斷位移量與此段的長度大小,如果越界,發現越界中斷資訊,否則就可以找到物理地址了。
4 分頁與分段的區別
1) 頁是資訊的物理單位,分頁是為了實現離散分配方式,以消減記憶體的外零頭,提高記憶體的利用率。分頁只是為了系統管理的需要;而分段則是為了程式員的需要。
2) 頁的大小固定且由系統決定,由系統把邏輯地址劃分為頁號和頁內地址兩部分,是由機器硬體實現的。所以說系統中只有一種長度的頁面。而段的長度不是固定的,決定它的長度的是使用者編寫的程式。通常是編譯器在對來源程式進行編譯時間,根據資訊的性質來劃分。
3) 分頁的作業地址空間是一維的,即單一的線性地址空間,而分段的作業地址是二維的。
段頁式儲存管理
我們知道了分頁可以提高記憶體的利用率,而分段則可以實現資訊保護,資訊共用,動態連結,動態增長等,那能不能合二為一呢?這就是段頁式儲存管理。
基本原理
先把使用者程式分成若干段,再把每一個段分成若干個頁面。如一個作業有三個段,頁面大小為4KB。在段頁式系統中,其地址結構由段號,段內頁號及頁內地址三部分所組成。如:
地址變換過程
為了方便實現地址變換,須配置一個段表寄存器,其中存放段表始址和段長。過程如下:
在段頁式系統中,為了得到一個資料,要進行三次訪問記憶體。
1、第一次訪問記憶體的段表,從中取得頁表的始址;
2、第二次訪問是訪問記憶體的頁表,取得物理塊號;
3、第三次訪問才是真正從第二次訪問所得的地址中,取出指令和資料;
虛擬儲存空間的基本概念
在前面所講的兩種儲存管理方式中,都要求將一個作業全部裝入記憶體後方能運行,於是出現了兩種情況:
1、有的作業很大,不可能一下子裝入記憶體
2、有大量作業要求運行時,但由於記憶體容量不足以容納所有的這些作業,只能將少數作業裝入記憶體讓它們先運行,而將其它大量的作業放在外存上等待。
解決上述問題:
1、最常見的是擴大記憶體。但這往往受到機器自身的限制,而且無疑要增加系統成本;
2、另一種方法是從邏輯上擴充記憶體容量,這下是虛擬儲存技術。
虛擬儲存空間的引入
常規儲存管理方式的特徵
1、一次性:一次裝入。
2、駐留性:作業從裝入記憶體,便一直駐留在記憶體中,直到作業運行結束。儘管在整個進程中,可能有多次IO,但是它仍然佔用著記憶體。
局部性原理
1、時間局限性:如果程式中的某條指令一旦執行,則不久以後該指令可能再次執行,如果一個資料被訪問過,則不久以後,還可能再次被訪問。
2、空間局限性:一旦程式訪問了某個儲存單元,在不久以後,其附近的儲存單元也將被訪問,即程式在一段時間內所訪問的地址,可能集中在一定的範圍之內。典型的例子是順序執行。
虛擬儲存空間的定義
是指具有請求調入功能和置換功能,能從邏輯上對記憶體容量加以擴充的一種儲存空間系統。其邏輯容量由記憶體容量和外在容量之後所決定,其運行速度接近於記憶體速度,每位的成本接近於外存。所以是一個很好的解決方案。
虛擬儲存空間的實現方法
它的實現,都是建立在離散分配的儲存管理方式的基礎上。一般有兩種方法:
1、分頁請求系統
2、請求分段系統
電腦作業系統之儲存空間管理