156.存儲器管理

存儲器管理程序員

4.1  存儲器的層次結構

  在計算機執行時,幾乎每一條指令都涉及對存儲器的訪問,所以要求對存儲器的訪問速度能跟得上處理機的運行速度。或者說,存儲器的速度必須很是快,能與處理機的速度相匹配,不然會明顯地影響處處理機的運行。此外還要求存儲器具備很是大的容量,並且存儲器的價格還應很便宜。算法

 

4.1.1  多層結構的存儲器系統

  1. 存儲器的多層結構編程

     對於通用計算機而言,存儲層次至少應具備三級:最高層爲CPU寄存器,中間爲主存,最底層是輔存。在較高檔的計算機中,還能夠根據具體的功能細分爲寄存器、高速緩存、主存儲器、磁盤緩存、固定磁盤、可移動存儲介質等6層。如圖4-1所示。緩存

 

圖4-1  計算機系統存儲層次示意數據結構

 

  2. 可執行存儲器app

  在計算機系統的存儲層次中,寄存器和主存儲器又被稱爲可執行存儲器。對於存放於其中的信息,與存放於輔存中的信息相比較而言,計算機所採用的訪問機制是不一樣的,所需耗費的時間也是不一樣的。進程能夠在不多的時鐘週期內使用一條load或store指令對可執行存儲器進行訪問。但對輔存的訪問則須要經過I/O設備實現,所以,在訪問中將涉及到中斷、設備驅動程序以及物理設備的運行,所需耗費的時間遠遠高於訪問可執行存儲器的時間,通常相差3個數量級甚至更多。函數

 

4.1.2  主存儲器與寄存器

  1. 主存儲器post

  主存儲器簡稱內存或主存,是計算機系統中的主要部件,用於保存進程運行時的程序和數據,也稱可執行存儲器。性能

 

  2. 寄存器ui

  寄存器具備與處理機相同的速度,故對寄存器的訪問速度最快,徹底能與CPU協調工做,但價格卻十分昂貴,所以容量不可能作得很大。

 

4.1.3  高速緩存和磁盤緩存

  1. 高速緩存

  高速緩存是現代計算機結構中的一個重要部件,它是介於寄存器和存儲器之間的存儲器,主要用於備份主存中較經常使用的數據,以減小處理機對主存儲器的訪問次數,這樣可大幅度地提升程序執行速度。高速緩存容量遠大於寄存器,而比內存約小兩到三個數量級左右,從幾十KB到幾MB,訪問速度快於主存儲器。

 

  2. 磁盤緩存

  因爲目前磁盤的I/O速度遠低於對主存的訪問速度,爲了緩和二者之間在速度上的不匹配,而設置了磁盤緩存,主要用於暫時存放頻繁使用的一部分磁盤數據和信息,以減小訪問磁盤的次數。但磁盤緩存與高速緩存不一樣,它自己並非一種實際存在的存儲器,而是利用主存中的部分存儲空間暫時存放從磁盤中讀出(或寫入)的信息。主存也能夠看做是輔存的高速緩存,由於,輔存中的數據必須複製到主存方能使用,反之,數據也必須先存在主存中,才能輸出到輔存。

     

4.2  程序的裝入和連接

 

  用戶程序要在系統中運行,必須先將它裝入內存,而後再將其轉變爲一個能夠執行的程序,一般都要通過如下幾個步驟:

  (1) 編譯,由編譯程序(Compiler)對用戶源程序進行編譯,造成若干個目標模塊(Object Module);

  (2) 連接,由連接程序(Linker)將編譯後造成的一組目標模塊以及它們所須要的庫函數連接在一塊兒,造成一個完整的裝入模塊(Load Module);

  (3) 裝入,由裝入程序(Loader)將裝入模塊裝入內存。

  圖4-2示出了這樣的三步過程。本節將扼要闡述程序(含數據)的連接和裝入過程。

 

圖4-2 對用戶程序的處理步驟

 

4.2.1  程序的裝入

  爲了闡述上的方便,咱們先介紹一個無需進行連接的單個目標模塊的裝入過程。該目標模塊也就是裝入模塊。在將一個裝入模塊裝入內存時,能夠有以下三種裝入方式:

  1. 絕對裝入方式(Absolute Loading Mode)

  當計算機系統很小,且僅能運行單道程序時,徹底有可能知道程序將駐留在內存的什麼位置。此時能夠採用絕對裝入方式。用戶程序經編譯後,將產生絕對地址(即物理地址)的目標代碼。

 

  2. 可重定位裝入方式(Relocation Loading Mode)

  絕對裝入方式只能將目標模塊裝入到內存中事先指定的位置,這隻適用於單道程序環境。而在多道程序環境下,編譯程序不可能預知經編譯後所獲得的目標模塊應放在內存的何處。所以,對於用戶程序編譯所造成的若干個目標模塊,它們的起始地址一般都是從0開始的,程序中的其它地址也都是相對於起始地址計算的。

圖4-3 做業裝入內存時的狀況

 

  3. 動態運行時的裝入方式(Dynamic Run-time Loading)

  可重定位裝入方式可將裝入模塊裝入到內存中任何容許的位置,故可用於多道程序環境。但該方式並不容許程序運行時在內存中移動位置。

 

4.2.2  程序的連接

  1. 靜態連接(Static Linking)方式

  在程序運行以前,先將各目標模塊及它們所需的庫函數連接成一個完整的裝配模塊,之後再也不拆開。在圖4-4(a)中示出了通過編譯後所獲得的三個目標模塊A、B、C,它們的長度分別爲L、M和N。在模塊A中有一條語句CALL B,用於調用模塊B。在模塊B中有一條語句CALL C,用於調用模塊C。B和C都屬於外部調用符號,在將這幾個目標模塊裝配成一個裝入模塊時,須解決如下兩個問題:

  (1) 對相對地址進行修改。

  (2) 變換外部調用符號。

 

圖4-4 程序連接示意圖

 

  2. 裝入時動態連接(Load-time Dynamic Linking)

  這是指將用戶源程序編譯後所獲得的一組目標模塊,在裝入內存時,採用邊裝入邊連接的連接方式。即在裝入一個目標模塊時,若發生一個外部模塊調用事件,將引發裝入程序去找出相應的外部目標模塊,並將它裝入內存,還要按照圖4-4所示的方式修改目標模塊中的相對地址。裝入時動態連接方式有如下優勢:

  (1) 便於修改和更新。

  (2) 便於實現對目標模塊的共享。

 

  3. 運行時動態連接(Run-time Dynamic Linking)

  在許多狀況下,應用程序在運行時,每次要運行的模塊多是不相同的。但因爲事先沒法知道本次要運行哪些模塊,故只能是將全部可能要運行到的模塊所有都裝入內存,並在裝入時所有連接在一塊兒。顯然這是低效的,由於每每會有部分目標模塊根本就不運行。比較典型的例子是做爲錯誤處理用的目標模塊,若是程序在整個運行過程當中都不出現錯誤,則顯然就不會用到該模塊。

 

4.3  連續分配存儲管理方式

4.3.1  單一連續分配

  在單道程序環境下,當時的存儲器管理方式是把內存分爲系統區和用戶區兩部分,系統區僅提供給OS使用,它一般是放在內存的低址部分。而在用戶區內存中,僅裝有一道用戶程序,即整個內存的用戶空間由該程序獨佔。這樣的存儲器分配方式被稱爲單一連續分配方式。

 

4.3.2  固定分區分配

  1. 劃分分區的方法

  可用下述兩種方法將內存的用戶空間劃分爲若干個固定大小的分區:

  (1) 分區大小相等(指全部的內存分區大小相等)。

  (2) 分區大小不等。

 

  2. 內存分配

  爲了便於內存分配,一般將分區按其大小進行排隊,併爲之創建一張分區使用表,其中各表項包括每一個分區的起始地址、大小及狀態(是否已分配),如圖4-5所示。

 

圖4-5  固定分區使用表

 

4.3.3  動態分區分配

  1. 動態分區分配中的數據結構  

  經常使用的數據結構有如下兩種形式:① 空閒分區表,在系統中設置一張空閒分區表,用於記錄每一個空閒分區的狀況。每一個空閒分區佔一個表目,表目中包括分區號、分區大小和分區始址等數據項,如圖4-6所示。② 空閒分區鏈。爲了實現對空閒分區的分配和連接,在每一個分區的起始部分設置一些用於控制分區分配的信息,以及用於連接各分區所用的前向指針,在分區尾部則設置一後向指針。經過前、後向連接指針,可將全部的空閒分區連接成一個雙向鏈,如圖4-7所示。

 

 圖4-6  空閒分區表

 

 圖4-7  空閒鏈結構

 

  2. 動態分區分配算法

  爲把一個新做業裝入內存,須按照必定的分配算法,從空閒分區表或空閒分區鏈中選出一分區分配給該做業。因爲內存分配算法對系統性能有很大的影響,故人們對它進行了較爲普遍而深刻的研究,因而產生了許多動態分區分配算法。

 

  3. 分區分配操做

  1) 分配內存

  系統應利用某種分配算法,從空閒分區鏈(表)中找到所需大小的分區。設請求的分區大小爲u.size,表中每一個空閒分區的大小可表示爲m.size。

 

圖4-8 內存分配流程

 

  2) 回收內存 

  當進程運行完畢釋放內存時,系統根據回收區的首址,從空閒區鏈(表)中找到相應的插入點,此時可能出現如下四種狀況之一:

  (1) 回收區與插入點的前一個空閒分區F1相鄰接,見圖4-9(a)。此時應將回收區與插入點的前一分區合併,沒必要爲回收分區分配新表項,而只需修改其前一分區F1的大小。

  (2) 回收分區與插入點的後一空閒分區F2相鄰接,見圖4-9(b)。此時也可將兩分區合併,造成新的空閒分區,但用回收區的首址做爲新空閒區的首址,大小爲二者之和。

  (3) 回收區同時與插入點的前、後兩個分區鄰接,見圖4-9(c)。此時將三個分區合併,使用F1的表項和F1的首址,取消F2的表項,大小爲三者之和。

  (4) 回收區既不與F1鄰接,又不與F2鄰接。這時應爲回收區單獨創建一個新表項,填寫回收區的首址和大小,並根據其首址插入到空閒鏈中的適當位置。圖4-10示出了內存回收時的流程。

 

圖4-9  內存回收時的狀況

 

圖4-10  內存回收流程

 

4.3.4  基於順序搜索的動態分區分配算法

  1. 首次適應(first fit,FF)算法

  咱們以空閒分區鏈爲例來講明採用FF算法時的分配狀況。FF算法要求空閒分區鏈以地址遞增的次序連接。在分配內存時,從鏈首開始順序查找,直至找到一個大小能知足要求的空閒分區爲止。而後再按照做業的大小,從該分區中劃出一塊內存空間,分配給請求者,餘下的空閒分區仍留在空閒鏈中。若從鏈首直至鏈尾都不能找到一個能知足要求的分區,則代表系統中已沒有足夠大的內存分配給該進程,內存分配失敗,返回。

 

  2. 循環首次適應(next fit,NF)算法

  爲避免低址部分留下許多很小的空閒分區,以及減小查找可用空閒分區的開銷,循環首次適應算法在爲進程分配內存空間時,再也不是每次都從鏈首開始查找,而是從上次找到的空閒分區的下一個空閒分區開始查找,直至找到一個能知足要求的空閒分區,從中劃出一塊與請求大小相等的內存空間分配給做業。

 

  3. 最佳適應(best fit,BF)算法

  所謂「最佳」是指,每次爲做業分配內存時,老是把能知足要求、又是最小的空閒分區分配給做業,避免「大材小用」。爲了加速尋找,該算法要求將全部的空閒分區按其容量以從小到大的順序造成一空閒分區鏈。

 

  4. 最壞適應(worst fit,WF)算法

  因爲最壞適應分配算法選擇空閒分區的策略正好與最佳適應算法相反:它在掃描整個空閒分區表或鏈表時,老是挑選一個最大的空閒區,從中分割一部分存儲空間給做業使用,以致於存儲器中缺少大的空閒分區,故把它稱爲是最壞適應算法。

 

4.3.5  基於索引搜索的動態分區分配算法

  1. 快速適應(quick fit)算法

  該算法又稱爲分類搜索法,是將空閒分區根據其容量大小進行分類,對於每一類具備相同容量的全部空閒分區,單獨設立一個空閒分區鏈表,這樣系統中存在多個空閒分區鏈表。同時,在內存中設立一張管理索引表,其中的每個索引表項對應了一種空閒分區類型,並記錄了該類型空閒分區鏈表表頭的指針。

 

  2. 夥伴系統(buddy system)

  該算法規定,不管已分配分區或空閒分區,其大小均爲2的k次冪(k爲整數,l≤k≤m)。一般2m是整個可分配內存的大小(也就是最大分區的大小)。假設系統的可利用空間容量爲2m 個字,則系統開始運行時,整個內存區是一個大小爲2m的空閒分區。在系統運行過程當中,因爲不斷地劃分,將會造成若干個不連續的空閒分區,將這些空閒分區按分區的大小進行分類。對於具備相同大小的全部空閒分區,單獨設立一個空閒分區雙向鏈表,這樣,不一樣大小的空閒分區造成了k個空閒分區鏈表。

  在夥伴系統中,對於一個大小爲2k,地址爲x的內存塊,其夥伴塊的地址則用buddyk(x)表示,其通式爲:

 

  3. 哈希算法

  在上述的分類搜索算法和夥伴系統算法中,都是將空閒分區根據分區大小進行分類,對於每一類具備相同大小的空閒分區,單獨設立一個空閒分區鏈表。在爲進程分配空間時,須要在一張管理索引表中查找到所需空間大小所對應的表項,從中獲得對應的空閒分區鏈表表頭指針,從而經過查找獲得一個空閒分區。若是對空閒分區分類較細,則相應索引表的表項也就較多,所以會顯著地增長搜索索引表的表項的時間開銷。

 

4.3.6  動態可重定位分區分配

  1. 緊湊

  連續分配方式的一個重要特色是,一個系統或用戶程序必須被裝入一片連續的內存空間中。當一臺計算機運行了一段時間後,它的內存空間將會被分割成許多小的分區,而缺少大的空閒空間。即便這些分散的許多小分區的容量總和大於要裝入的程序,但因爲這些分區不相鄰接,也沒法把該程序裝入內存。

 

圖4-11  緊湊的示意

 

  2. 動態重定位

  在4.2.1節中所介紹的動態運行時裝入的方式中,做業裝入內存後的全部地址仍然都是相對(邏輯)地址。而將相對地址轉換爲絕對(物理)地址的工做被推遲到程序指令要真正執行時進行。爲使地址的轉換不會影響到指令的執行速度,必須有硬件地址變換機構的支持,即須在系統中增設一個重定位寄存器,用它來存放程序(數據)在內存中的起始地址。程序在執行時,真正訪問的內存地址是相對地址與重定位寄存器中的地址相加而造成的。

 

圖4-12 動態重定位示意圖

 

  3. 動態重定位分區分配算法

  動態重定位分區分配算法與動態分區分配算法基本上相同,差異僅在於:在這種分配算法中,增長了緊湊的功能。一般,當該算法不能找到一個足夠大的空閒分區以知足用戶需求時,若是全部的小的空閒分區的容量總和大於用戶的要求,這時便須對內存進行「緊湊」,將經「緊湊」後所獲得的大空閒分區分配給用戶。若是全部的小的空閒分區的容量總和仍小於用戶的要求,則返回分配失敗信息。

 

圖4-13  動態分區分配算法流程圖

 

4.4  對換(Swapping)

 

  對換技術也稱爲交換技術,最先用於麻省理工學院的單用戶分時系統CTSS中。因爲當時計算機的內存都很是小,爲了使該系統能分時運行多個用戶程序而引入了對換技術。系統把全部的用戶做業存放在磁盤上,每次只能調入一個做業進入內存,當該做業的一個時間片用完時,將它調至外存的後備隊列上等待,再從後備隊列上將另外一個做業調入內存。這就是最先出現的分時系統中所用的對換技術。如今已經不多使用。

4.4.1  多道程序環境下的對換技術

  1. 對換的引入

  在多道程序環境下,一方面,在內存中的某些進程因爲某事件還沒有發生而被阻塞運行,但它卻佔用了大量的內存空間,甚至有時可能出如今內存中全部進程都被阻塞,而無可運行之進程,迫使CPU中止下來等待的狀況;另外一方面,卻又有着許多做業,因內存空間不足,一直駐留在外存上,而不能進入內存運行。顯然這對系統資源是一種嚴重的浪費,且使系統吞吐量降低。

 

  2. 對換的類型

  在每次對換時,都是將必定數量的程序或數據換入或換出內存。根據每次對換時所對換的數量,可將對換分爲以下兩類:

  (1) 總體對換。

  (2) 頁面(分段)對換。

 

4.4.2  對換空間的管理

  1. 對換空間管理的主要目標

  在具備對換功能的OS中,一般把磁盤空間分爲文件區和對換區兩部分。

  1) 對文件區管理的主要目標

  2) 對對換空間管理的主要目標

 

  2. 對換區空閒盤塊管理中的數據結構

  爲了實現對對換區中的空閒盤塊的管理,在系統中應配置相應的數據結構,用於記錄外存對換區中的空閒盤塊的使用狀況。其數據結構的形式與內存在動態分區分配方式中所用數據結構類似,即一樣能夠用空閒分區表或空閒分區鏈。在空閒分區表的每一個表目中,應包含兩項:對換區的首址及其大小,分別用盤塊號和盤塊數表示。

 

  3. 對換空間的分配與回收

  因爲對換分區的分配採用的是連續分配方式,於是對換空間的分配與回收與動態分區方式時的內存分配與回收方法雷同。其分配算法能夠是首次適應算法、循環首次適應算法或最佳適應算法等。具體的分配操做也與圖4-8中內存的分配過程相同。

 

4.4.3  進程的換出與換入

  1. 進程的換出

  對換進程在實現進程換出時,是將內存中的某些進程調出至對換區,以便騰出內存空間。換出過程可分爲如下兩步:

  (1) 選擇被換出的進程。

  (2) 進程換出過程。

 

  2. 進程的換入

  對換進程將定時執行換入操做,它首先查看PCB集合中全部進程的狀態,從中找出「就緒」狀態但已換出的進程。當有許多這樣的進程時,它將選擇其中已換出到磁盤上時間最久(必須大於規定時間,如2 )的進程做爲換入進程,爲它申請內存。若是申請成功,可直接將進程從外存調入內存;若是失敗,則需先將內存中的某些進程換出,騰出足夠的內存空間後,再將進程調入。

 

4.5  分頁存儲管理方式

  (1) 分頁存儲管理方式。

  (2) 分段存儲管理方式。

  (3) 段頁式存儲管理方式。

 

4.5.1  分頁存儲管理的基本方法

  1. 頁面和物理塊

  (1) 頁面。

  (2) 頁面大小。

 

  2. 地址結構

  分頁地址中的地址結構以下:

 

  對某特定機器,其地址結構是必定的。若給定一個邏輯地址空間中的地址爲A,頁面的大小爲L,則頁號P和頁內地址d可按下式求得:

 

 

  3. 頁表

  在分頁系統中,容許將進程的各個頁離散地存儲在內存的任一物理塊中,爲保證進程仍然可以正確地運行,即能在內存中找到每一個頁面所對應的物理塊,系統又爲每一個進程創建了一張頁面映像表,簡稱頁表。

 

圖4-14  頁表的做用

 

4.5.2  地址變換機構

  1. 基本的地址變換機構

  進程在運行期間,須要對程序和數據的地址進行變換,即將用戶地址空間中的邏輯地址變換爲內存空間中的物理地址,因爲它執行的頻率很是高,每條指令的地址都須要進行變換,所以須要採用硬件來實現。頁表功能是由一組專門的寄存器來實現的。一個頁表項用一個寄存器。

 

圖4-15  分頁系統的地址變換機構

 

  2. 具備快表的地址變換機構

  因爲頁表是存放在內存中的,這使CPU在每存取一個數據時,都要兩次訪問內存。第一次是訪問內存中的頁表,從中找到指定頁的物理塊號,再將塊號與頁內偏移量W拼接,以造成物理地址。第二次訪問內存時,纔是從第一次所得地址中得到所需數據(或向此地址中寫入數據)。所以,採用這種方式將使計算機的處理速度下降近1/2。可見,以此高昂代價來換取存儲器空間利用率的提升,是得不償失的。

 

圖4-16  具備快表的地址變換機構

 

4.5.3  訪問內存的有效時間

  從進程發出指定邏輯地址的訪問請求,通過地址變換,到在內存中找到對應的實際物理地址單元並取出數據,所須要花費的總時間,稱爲內存的有效訪問時間(Effective Access Time,EAT)。假設訪問一次內存的時間爲t,在基本分頁存儲管理方式中,有效訪問時間分爲第一次訪問內存時間(即查找頁表對應的頁表項所耗費的時間t)與第二次訪問內存時間(即將頁表項中的物理塊號與頁內地址拼接成實際物理地址所耗費的時間t)之和:

   

  在引入快表的分頁存儲管理方式中,經過快表查詢,能夠直接獲得邏輯頁所對應的物理塊號,由此拼接造成實際物理地址,減小了一次內存訪問,縮短了進程訪問內存的有效時間。可是,因爲快表的容量限制,不可能將一個進程的整個頁表所有裝入快表,因此在快表中查找到所需表項存在着命中率的問題。所謂命中率,是指使用快表並在其中成功查找到所需頁面的表項的比率。這樣,在引入快表的分頁存儲管理方式中,有效訪問時間的計算公式即爲:

             

上式中,λ表示查找快表所須要的時間,ΰ表示命中率,t表示訪問一次內存所須要的時間。

  可見,引入快表後的內存有效訪問時間分爲查找到邏輯頁對應的頁表項的平均時間,以及對應實際物理地址的內存訪問時間t。假設對快表的訪問時間λ爲20 s(納秒),對內存的訪問時間t爲100 s,則下表中列出了不一樣的命中率ΰ與有效訪問時間的關係:

 

4.5.4  兩級和多級頁表

  1. 兩級頁表(Two-Level Page Table)

  針對難於找到大的連續的內存空間來存放頁表的問題,可利用將頁表進行分頁的方法,使每一個頁面的大小與內存物理塊的大小相同,併爲它們進行編號,即依次爲0# 頁、1# 頁,…,n# 頁,而後離散地將各個頁面分別存放在不一樣的物理塊中。一樣,也要爲離散分配的頁表再創建一張頁表,稱爲外層頁表(Outer Page Table),在每一個頁表項中記錄了頁表頁面的物理塊號。

 

圖4-17 兩級頁表結構

  爲了方便實現地址變換,在地址變換機構中,一樣須要增設一個外層頁表寄存器,用於存放外層頁表的始址,並利用邏輯地址中的外層頁號做爲外層頁表的索引,從中找到指定頁表分頁的始址,再利用P2做爲指定頁表分頁的索引,找到指定的頁表項,其中即含有該頁在內存的物理塊號,用該塊號P和頁內地址d便可構成訪問的內存物理地址。圖4-18示出了兩級頁表時的地址變換機構。

 

圖4-18 具備兩級頁表的地址變換機構

 

  2. 多級頁表

  對於32位的機器,採用兩級頁表結構是合適的,但對於64位的機器,採用兩級頁表是否仍然合適,須作如下簡單分析。若是頁面大小仍採用4 KB即212 B,那麼還剩下52位,假定仍按物理塊的大小(212位)來劃分頁表,則將餘下的42位用於外層頁號。此時在外層頁表中可能有4096 個頁表項,要佔用16384 GB的連續內存空間。

 

4.5.5  反置頁表(Inverted Page Table)

  1. 反置頁表的引入

  在分頁系統中,爲每一個進程配置了一張頁表,進程邏輯地址空間中的每一頁,在頁表中都對應有一個頁表項。在現代計算機系統中,一般容許一個進程的邏輯地址空間很是大,所以就須要有許多的頁表項,而所以也會佔用大量的內存空間。

 

  2. 地址變換

  在利用反置頁表進行地址變換時,是根據進程標識符和頁號,去檢索反置頁表。若是檢索到與之匹配的頁表項,則該頁表項(中)的序號i即是該頁所在的物理塊號,可用該塊號與頁內地址一塊兒構成物理地址送內存地址寄存器。若檢索了整個反置頁表仍未找到匹配的頁表項,則代表此頁還沒有裝入內存。對於不具備請求調頁功能的存儲器管理系統,此時則表示地址出錯。對於具備請求調頁功能的存儲器管理系統,此時應產生請求調頁中斷,系統將把此頁調入內存。

 

4.6  分段存儲管理方式

  存儲管理方式隨着OS的發展也在不斷地發展。當OS由單道向多道發展時,存儲管理方式便由單一連續分配發展爲固定分區分配。

4.6.1  分段存儲管理方式的引入

  1. 方便編程

  一般,用戶把本身的做業按照邏輯關係劃分爲若干個段,每一個段都從0開始編址,並有本身的名字和長度。所以,程序員們都迫切地須要訪問的邏輯地址是由段名(段號)和段內偏移量(段內地址)決定的,這不只能夠方便程序員編程,也可以使程序很是直觀,更具可讀性。例如,下述的兩條指令便使用段名和段內地址:

     LOAD 1,[A] |〈D〉;

     STORE 1,[B] |〈C〉;

 

  2. 信息共享

  在實現對程序和數據的共享時,是以信息的邏輯單位爲基礎的。好比,爲了共享某個過程、函數或文件。分頁系統中的「頁」只是存放信息的物理單位(塊),並沒有完整的邏輯意義,這樣,一個可被共享的過程每每可能須要佔用數十個頁面,這爲實現共享增長了困難。

 

  3. 信息保護

  信息保護一樣是以信息的邏輯單位爲基礎的,並且常常是以一個過程、函數或文件爲基本單位進行保護的。

 

  4. 動態增加

  在實際應用中,每每存在着一些段,尤爲是數據段,在它們的使用過程當中,因爲數據量的不斷增長,而使數據段動態增加,相應地它所須要的存儲空間也會動態增長。然而,對於數據段究竟會增加到多大,事先又很難確切地知道。對此,很難採起預先多分配的方法進行解決。

 

  5. 動態連接

  在4.2.2節中咱們已對運行時動態連接作了介紹。爲了提升內存的利用率,系統只將真正要運行的目標程序裝入內存,也就是說,動態連接在做業運行以前,並非把全部的目標程序段都連接起來。當程序要運行時,首先將主程序和它當即須要用到的目標程序裝入內存,即啓動運行。而在程序運行過程當中,當須要調用某個目標程序時,纔將該段(目標程序)調入內存並進行連接。

 

4.6.2  分段系統的基本原理 

  1. 分段

  在分段存儲管理方式中,做業的地址空間被劃分爲若干個段,每一個段定義了一組邏輯信息。例如,有主程序段MAIN、子程序段X、數據段D及棧段S等,如圖4-19所示。

  分段地址中的地址具備以下結構:

 

  2. 段表

  在前面所介紹的動態分區分配方式中,系統爲整個進程分配一個連續的內存空間。而在分段式存儲管理系統中,則是爲每一個分段分配一個連續的分區。進程中的各個段,能夠離散地裝入內存中不一樣的分區中。爲保證程序能正常運行,就必須能從物理內存中找出每一個邏輯段所對應的位置。

 

圖4-19  利用段表實現地址映射

 

  3. 地址變換機構

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

 

圖4-20  分段系統的地址變換過程

 

  4. 分頁和分段的主要區別

  (1) 頁是信息的物理單位。

  (2) 頁的大小固定且由系統決定。

  (3) 分頁的用戶程序地址空間是一維的。

 

4.6.3  信息共享

  1. 分頁系統中對程序和數據的共享

  在分頁系統中,雖然也能實現對程序和數據的共享,但遠不如分段系統來得方便。咱們經過一個例子來講明這個問題。

 

圖4-21  分頁系統中共享editor的示意圖

 

  2. 分段系統中程序和數據的共享

  在分段系統中,因爲是以段爲基本單位的,無論該段有多大,咱們都只需爲該段設置一個段表項,所以使實現共享變得很是容易。咱們仍以共享editor爲例,此時只需在(每一個)進程1和進程2的段表中,爲文本編輯程序設置一個段表項,讓段表項中的基址(80)指向editor程序在內存的起始地址。圖4-22是分段系統中共享editor的示意圖。

 

圖4-22  分段系統中共享editor的示意圖

 

4.6.4  段頁式存儲管理方式

  1. 基本原理

  段頁式系統的基本原理是分段和分頁原理的結合,即先將用戶程序分紅若干個段,再把每一個段分紅若干個頁,併爲每個段賦予一個段名。圖4-23(a)示出了一個做業地址空間的結構。該做業有三個段:主程序段、子程序段和數據段;頁面大小爲 4 KB。在段頁式系統中,其地址結構由段號、段內頁號及頁內地址三部分所組成,如圖4-23(b)所示。

 

圖4-23  做業地址空間和地址結構

  在段頁式系統中,爲了實現從邏輯地址到物理地址的變換,系統中須要同時配置段表和頁表。段表的內容與分段系統略有不一樣,它再也不是內存始址和段長,而是頁表始址和頁表長度。圖4-24示出了利用段表和頁表進行從用戶地址空間到物理(內存)空間的映射。

 

圖4-24  利用段表和頁表實現地址映射

 

  2. 地址變換過程

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

 

圖4-25  段頁式系統中的地址變換機構

 

 

習    題 8:

  1. 爲何要配置層次式存儲器?

  2. 可採用哪幾種方式將程序裝入內存? 它們分別適用於何種場合?

  3. 何謂靜態連接? 靜態連接時須要解決兩個什麼問題?

  4. 何謂裝入時動態連接? 裝入時動態連接方式有何優勢?

  5. 何謂運行時動態連接? 運行時動態連接方式有何優勢?

  6. 在動態分區分配方式中,應如何將各空閒分區連接成空閒分區鏈?

  7. 爲何要引入動態重定位? 如何實現?

  8. 什麼是基於順序搜索的動態分區分配算法? 它可分爲哪幾種?

  9. 在採用首次適應算法回收內存時,可能出現哪幾種狀況? 應怎樣處理這些狀況?

  10. 什麼是基於索引搜索的動態分區分配算法? 它可分爲哪幾種?

  11. 令buddyk(x)爲大小爲2k、地址爲x的塊的夥伴系統地址,試寫出buddyk(x)的通用表達式。

  12. 分區存儲管理中經常使用哪些分配策略? 比較它們的優缺點。

  13. 爲何要引入對換? 對換可分爲哪幾種類型?

  14. 對文件區管理的目標和對對換空間管理的目標有何不一樣?

  15. 爲實現對換,系統應具有哪幾方面的功能?

  16. 在以進程爲單位進行對換時,每次是否都將整個進程換出? 爲何?

  17. 基於離散分配時所用的基本單位不一樣,可將離散分配分爲哪幾種?

  18. 什麼是頁面? 什麼是物理塊? 頁面的大小應如何肯定?

  19. 什麼是頁表? 頁表的做用是什麼?

  20. 爲實現分頁存儲管理,須要哪些硬件支持?

  21. 在分頁系統中是如何實現地址變換的?

  22. 具備快表時是如何實現地址變換的?

  23. 較詳細地說明引入分段存儲管理是爲了知足用戶哪幾方面的須要。

  24. 在具備快表的段頁式存儲管理方式中,如何實現地址變換?

  25. 爲何說分段系統比分頁系統更易於實現信息的共享和保護?

  26. 分頁和分段存儲管理有何區別?

  27. 試全面比較連續分配和離散分配方式。

 

 

 

相關文章
相關標籤/搜索