1. 內存為程序分配空間的四種分配方式
存儲器是個寶貴但卻有限的資源。一流的操作系統,需要能夠有效地管理及利用存儲器。
內存為程序分配空間有四種分配方式:
1、連續分配方式
2、基本分頁存儲管理方式
3、基本分段存儲管理方式
4、段頁式存儲管理方式
首先講連續分配方式。 連續分配方式 出現的時間比較早,曾廣泛應用於20世紀60~70年代的OS中,但是它至今仍然在內存管理方式中佔有一席之地,原因在於它 實現起來比較方便,所需的硬體支持最少 。連續分配方式又可細分為四種: 單一連續分配、固定分區分配、動態分區分配和動態重定位分區分配 。
其中固定分區的分配方式,因為分區固定,所以缺乏靈活性,即 當程序太小時,會造成內存空間的浪費( 內部碎片 ) ; 程序太大時,一個分區又不足以容納,致使程序無法運行( 外部碎片 ) 。但盡管如此,當一台計算機去控制多個相同對象的時候,由於這些對象內存大小相同,所以完全可以採用這種內存管理方式,而且是最高效的。這里我們可以看出存儲器管理機制的多面性:沒有那種存儲器管理機制是完全沒有用的,在適合的場合下,一種被認為最不合理的分配方案卻可能稱為最高效的分配方案。 一切都要從實際問題出發,進行設計。
為了解決固定分區分配方式的缺乏靈活性,出現了 動態分配方式 。動態分配方式採用一些 尋表(Eg: 空閑鏈表 ) 的方式,查找能符合程序需要的空閑內存分區。但代價是增加了系統運行的開銷,而且內存空閑表本身是一個文件,必然會佔用一部分寶貴的內存資源,而且有些演算法還會增加內存碎片。
可重定位分區分配通過對程序實現成定位,從而可以將內存塊進行搬移,將小塊拼成大塊,將小空閑「緊湊」成大空閑,騰出較大的內存以容納新的程序進程。
連續分配方式 會形成許多「碎片」,雖然可以通過「緊湊」方式將許多碎片拼接成可用的大塊空間,但須為之付出很大開銷。所以提出了「 離散分配方式 」的想法。如果 離散分配的基本單位是頁 ,則稱為 分頁管理方式 ;如果離散分配的基本單位是段,則稱為 分段管理方式 。
分頁存儲管理是將一個進程的邏輯地址空間分成若干個大小相等的片,稱為頁面或頁,並為各頁加以編號,從0開始,如第0頁、第1頁等。相應地,也把內存空間分成與頁面相同大小的若干個存儲塊,稱為(物理)塊或頁框(frame),也同樣為它們加以編號,如0#塊、1#塊等等。在為進程分配內存時,以塊為單位將進程中的若干個頁分別裝入到多個可以不相鄰接的物理塊中。由於進程的最後一頁經常裝不滿一塊而形成了不可利用的碎片,稱之為「 頁內碎片 」。
在分頁系統中,允許將進程的各個頁離散地存儲在內存不同的物理塊中(所以能實現離散分配方式) ,但系統應能保證進程的正確運行,即能在內存中找到每個頁面所對應的物理塊。為此,系統又為每個進程建立了一張頁面映像表,簡稱 頁表 。在進程地址空間內的所有頁,依次在頁表中有一頁表項,其中記錄了相應頁在內存中對應的物理塊號。在配置了頁表後,進程執行時,通過查找該表,即可找到每頁在內存中的物理塊號。可見, 頁表的作用是實現從頁號到物理塊號的地址映射 。
為了能夠將用戶地址空間中的 邏輯地址,變換為內存空間中的物理地址 ,在系統中必須設置 地址變換機構 。地址變換任務是藉助於頁表來完成的。
頁表 的功能可由一組專門的寄存器來實現。由於寄存器成本較高,且大多數現代計算機的頁表又很大,使頁表項總數可達幾千甚至幾十萬個,顯然這些頁表項不可能都用寄存器來實現,因此,頁表大多駐留在內存中。因為一個進程可以通過它的PCB來時時保存自己的狀態,等到CPU要處理它的時候才將PCB交給寄存器,所以,系統中雖然可以運行多個進程,但也只需要一個頁表寄存器就可以了。
由於 頁表是存放在內存中 的,這使得 CPU在每存取一個數據時,都要兩次訪問內存 。為了提高地址變換速度,在地址變化機構中增設了一個 具有並行查詢能力的高速緩沖寄存器 ,又稱為「聯想寄存器」(Associative Lookaside Buffer)。
在單級頁表的基礎上,為了適應非常大的邏輯空間,出現了兩級和多級頁表,但是,他們的原理和單級頁表是一樣的,只不過為了適應地址變換層次的增加,需要在地址變換機構中增設外層的頁表寄存器。
分段存儲管理方式 的目的,主要是為了滿足用戶(程序員)在編程和使用上多方面的要求,其中有些要求是其他幾種存儲管理方式所難以滿足的。因此,這種存儲管理方式已成為當今所有存儲管理方式的基礎。
分段管理方式和分頁管理方式在實現思路上是很相似的,只不過他們的基本單位不同。分段有 段表 ,也有 地址變換機構 ,為了提高檢索速度,同樣增設 聯想寄存器(具有並行查詢能力的高速緩沖寄存器) 。所以有些具體細節在這個不再贅述。
分頁和分段的主要區別:
1、兩者相似之處:兩者 都採用離散分配方式,且都要通過地址映射機構來實現地址變換 。
2、兩者的不同之處:
(1)頁是信息的 物理單位 ,分頁是為實現離散分配方式,以消減內存的外零頭,提高內存的利用率。或者說,分頁僅僅是由於 系統管理的需要 而不是用戶的需要。段則是信息的 邏輯單位 ,它含有一組其意義相對完整的信息。 分段的目的是為了能更好地滿足用戶的需要 。
(2) 頁的大小固定 且由系統決定,而 段的長度卻不固定 。
(3)分頁的作業地址空間是 一維 的,即單一的線性地址空間;而分段的作業地址空間則是 二維 的。
前面所介紹的分頁和分段存儲管理方式都各有優缺點。 分頁系統能有效地 提高內存利用率 ,而分段系統則能很好地 滿足用戶需求 。 我們希望能夠把兩者的優點結合,於是出現了段頁式存儲管理方式。
段頁式系統的基本原理,是分段和分頁原理的結合,即 先將用戶程序分成若干個段,再把每個段分成若干個頁 ,並為每一個段賦予一個段名。在段頁式系統中,地址結構由段號、段內頁號和頁內地址三部分組成。
和前兩種存儲管理方式相同,段頁式存儲管理方式同樣需要增設聯想寄存器。
離散分配方式 基於將一個進程直接分散地分配到許多不相鄰的分區中的思想,分為分頁式存儲管理,分段式存儲管理和段頁式存儲管理. 分頁式存儲管理旨在提高內存利用率,滿足系統管理的需要,分段式存儲管理則旨在滿足用戶(程序員)的需要,在實現共享和保護方面優於分頁式存儲管理,而段頁式存儲管理則是將兩者結合起來,取長補短,即具有分段系統便於實現,可共享,易於保護,可動態鏈接等優點,又能像分頁系統那樣很好的解決外部碎片的問題,以及為各個分段可離散分配內存等問題,顯然是一種比較有效的存儲管理方式。
更多Linux內核視頻教程文檔資料免費領取【 內核 】自行獲取。
內核學習網站:
Linux內核源碼/內存調優/文件系統/進程管理/設備驅動/網路協議棧-學習視頻教程-騰訊課堂
2. os的內存管理機制分析
相輔相成的!缺一不可!
3. 採用什麼存儲管理方式不會產生內部碎片
在分段存儲管理方式中,作業的地址空間被劃分為若干個段,每禪衡枝個段定義了一組邏輯信息。分段系統的一個突出優點,是易於實現段的共享,即允許若干個進程共享一個或多個分段,且對段的保護也十分簡單易行。
內部碎片就是為每個進程分布的內存空間之中所沒有被使用到的內存碎片。通常出現在分頁式存儲管理之中。分段式存儲管理不會產生內部碎片歸根結底是由分段本身的定義出發的。如果說分頁式是系統對內存的分割,那麼分段式就是用戶對程序數據的分割。將一個程序分段是有邏輯意義的獨立單位的,故不會產生內部碎片。
引入分段攔姿式存儲管理本就在一定程度上賀敏解決了內部碎片,並且滿足了用戶的需求。但是分段式存儲管理也有不足之處,內存利用率變低了。
4. 分段存儲管理需提供二維地址
一. 分頁存儲管理
1.基本思想
用戶程序的地址空間被劃分成若干固定大小的區域,稱為「頁」,相應地,內存空間分成若干個物理塊,頁和塊的大小相等。可將用戶程序的任一頁放在內存的任一塊中,實現了離散分配。
2. 分頁存儲管理的地址機構
15 12 11 0
頁號P 頁內位移量W
頁號4位,每個作業最多2的4次方=16頁,表示頁號從0000~1111(24-1),頁內位移量的位數表示頁的大小,若頁內位移量12位,則2的12次方=4k,頁的大小為4k,頁內地址從000000000000~111111111111
若給定一個邏輯地址為A,頁面大小為L,則
頁號P=INT[A/L],頁內地址W=A MOD L
3. 頁表
分頁系統中,允許將進程的每一頁離散地存儲在內存的任一物理塊中,為了能在內存中找到每個頁面對應的物理塊,系統為每個進程建立一張頁面映射表,簡稱頁表。頁表的作用是實現從頁號到物理塊號的地址映射。
頁表:
頁號 物理塊號 存取控制
0 2
1 15(F)
2 14(E)
3 1
4. 地址變換
(1) 程序執行時,從PCB中取出頁表始址和頁表長度(4),裝入頁表寄存器PTR。
(2) 由分頁地址變換機構將邏輯地址自動分成頁號和頁內地址。
例:11406D=0010|110010001110B=2C8EH
頁號為2,位移量為C8EH=3214D
或11406 DIV 4096=2
11406 MOD 4096=3214
(3) 將頁號與頁表長度進行比較(2<4),若頁號大於或等於頁表長度,則表示本次訪問的地址已超越進程的地址空間,產生越界中斷。
(4) 將頁表始址與頁號和頁表項長度的乘積相加,便得到該頁表項在頁表中的位置。
(5) 取出頁描述子得到該頁的物理塊號。 2 14(E)
(6) 對該頁的存取控制進行檢查。
(7) 將物理塊號送入物理地址寄存器中,再將有效地址寄存器中的頁內地址直接送入物理地址寄存器的塊內地址欄位中,拼接得到實際的物理地址。
例:0010|110010001101B
1110|110010001101B=EC8EH=60558D
或 14*4096+3214=60558D
5. 具有快表的地址變換機構
分頁系統中,CPU每次要存取一個數據,都要兩次訪問內存(訪問頁表、訪問實際物理地址)。為提高地址變換速度,增設一個具有並行查詢能力的特殊高速緩沖存儲器,稱為「聯想存儲器」或「快表」,存放當前訪問的頁表項。
二.分段存儲管理
1.基本思想
將用戶程序地址空間分成若干個大小不等的段,每段可以定義一組相對完整的邏輯信息。存儲分配時,以段為單位,段與段在內存中可以不相鄰接,也實現了離散分配。
2. 分段存儲方式的引入
方便編程
分段共享
分段保護
動態鏈接
動態增長
3. 分段地址結構
作業的地址空間被劃分為若干個段,每個段定義了一組邏輯信息。常式序段、數據段等。每個段都從0開始編址,並採用一段連續的地址空間。
段的長度由相應的邏輯信息組的長度決定,因而各段長度不等。整個作業的地址空間是二維的。
15 12 11 0
段號 段內位移量
段號4位,每個作業最多24=16段,表示段號從0000~1111(24-1);段內位移量12位,212=4k,表示每段的段內地址最大為4K(各段長度不同),從000000000000~111111111111
4. 段表
段號 段長 起始地址 存取控制
0 1K 4096
1 4K 17500
2 2K 8192
5. 地址變換
(1). 程序執行時,從PCB中取出段表始址和段表長度(3),裝入段表寄存器。
(2). 由分段地址變換機構將邏輯地址自動分成段號和段內地址。
例:7310D=0001|110010001110B=1C8EH
段號為1,位移量為C8EH=3214D
(3). 將段號與段表長度進行比較(1<3),若段號大於或等於段表長度,則表示本次訪問的地址已超越進程的地址空間,產生越界中斷。
(4). 將段表始址與段號和段表項長度的乘積相加,便得到該段表項在段表中的位置。
(5). 取出段描述子得到該段的起始物理地址。1 4K 17500
(6). 檢查段內位移量是否超出該段的段長(3214<4K),若超過,產生越界中斷。
(7). 對該段的存取控制進行檢查。
(8). 將該段基址和段內地址相加,得到實際的物理地址。
例:0001|110010001101B
起始地址17500D+段內地址3214D=20714D
三.分頁與分段的主要區別
分頁和分段有許多相似之處,比如兩者都不要求作業連續存放.但在概念上兩者完全不同,主要表現在以下幾個方面:
(1)頁是信息的物理單位,分頁是為了實現非連續分配,以便解決內存碎片問題,或者說分頁是由於系統管理的需要.段是信息的邏輯單位,它含有一組意義相對完整的信息,分段的目的是為了更好地實現共享,滿足用戶的需要.
(2)頁的大小固定,由系統確定,將邏輯地址劃分為頁號和頁內地址是由機器硬體實現的.而段的長度卻不固定,決定於用戶所編寫的程序,通常由編譯程序在對源程序進行編譯時根據信息的性質來劃分.
(3)分頁的作業地址空間是一維的.分段的地址空間是二維的.
四.段頁式存儲管理
1.基本思想:
分頁系統能有效地提高內存的利用率,而分段系統能反映程序的邏輯結構,便於段的共享與保護,將分頁與分段兩種存儲方式結合起來,就形成了段頁式存儲管理方式。
在段頁式存儲管理系統中,作業的地址空間首先被分成若干個邏輯分段,每段都有自己的段號,然後再將每段分成若干個大小相等的頁。對於主存空間也分成大小相等的頁,主存的分配以頁為單位。
段頁式系統中,作業的地址結構包含三部分的內容:段號 頁號 頁內位移量
程序員按照分段系統的地址結構將地址分為段號與段內位移量,地址變換機構將段內位移量分解為頁號和頁內位移量。
為實現段頁式存儲管理,系統應為每個進程設置一個段表,包括每段的段號,該段的頁表始址和頁表長度。每個段有自己的頁表,記錄段中的每一頁的頁號和存放在主存中的物理塊號。
2.地址變換的過程:
(1)程序執行時,從PCB中取出段表始址和段表長度,裝入段表寄存器。
(2)由地址變換機構將邏輯地址自動分成段號、頁號和頁內地址。
(3)將段號與段表長度進行比較,若段號大於或等於段表長度,則表示本次訪問的地址已超越進程的地址空間,產生越界中斷。
(4)將段表始址與段號和段表項長度的乘積相加,便得到該段表項在段表中的位置。
(5)取出段描述子得到該段的頁表始址和頁表長度。
(6)將頁號與頁表長度進行比較,若頁號大於或等於頁表長度,則表示本次訪問的地址已超越進程的地址空間,產生越界中斷。
(7)將頁表始址與頁號和頁表項長度的乘積相加,便得到該頁表項在頁表中的位置。
(8)取出頁描述子得到該頁的物理塊號。
(9)對該頁的存取控制進行檢查。
(10)將物理塊號送入物理地址寄存器中,再將有效地址寄存器中的頁內地址直接送入物理地址寄存器的塊內地址欄位中,拼接得到實際的物理地址。
5. 段頁式存儲管理地址轉換需要什麼支持
映射速度,硬體需要提供如下 2 個寄存器: 段表始址寄存器;② 段表長度寄存器; (5)地址映射過程 在段頁式存儲猜族管理 ...
網路知道
總結段氏存儲管理的地址轉換 - 網路文庫
2頁發布時間: 2022年08月17日
(4)硬體支持 為加快地址映射速度,硬體需要提供如下野兆鉛 2 個寄存器: 段表始址寄存器;② 段表長度寄存器; (5)地址映射過程 在段頁式存儲管理中,...
網路文庫
操作系統——段式存儲管理 - Linux加油站的博客 - CSDN博客
1. 基本原理 前面介紹的各種存儲管理中,供用戶使頌好用的邏輯地址都是連續的,用戶在編制大型程序時就會感到不方便。一個實際的程序往往是由若干段組成的,例如
2. 轉換和地址保護 為使作業正確執行 ,首先須記下各段位置 ,為此系統設立一個「段表」記錄作業每個段在內存中首地址和長度,如圖3.22所示。在作業
3. 段頁式存儲管理 用戶作業採用分段結構後,不僅方便了編製程序(各模塊可以獨 立編程),而且具有邏輯上清晰的優點。段式存儲管理支持了用戶的分段觀點,但它的
CSDN編程社區
3.1.11 OS之段頁式存儲管理(段表、頁表、地址轉換、)
1. 分頁、分段的優缺點分析
6. 《網路操作系統》下
26.D27.B28.A29.B30.C31.D32.A33.B34.B35.C36.C37.A38.B39.D40.A41.C42.A43.A44.C45.C46.C47.D48.B49.D50.A
不一悄冊伏姿改定全對啟攜
7. 分頁和分段存儲管理相同點是什麼
基本分段存儲管理方式和基本分頁存儲管理方式二者的理論基礎都是相對差不多的,二者都是建立在內存分區管理思想和程序局缺逗部性原理的基礎之上。
基本分頁存儲管理方式在存儲器管理中,連續分配方式會形成許多「碎片」,雖然可通過「緊湊」方法將許多碎租扮此片拼接成可用的大塊空間,但須為之付出很大開銷。
在分段存儲管理方式中,作業的地址空間被劃分為若干個段,每個段定義了一組邏輯信息。例如,有主程序段MAIN、子程序段X、數據段D及棧段S等。
(7)若os採用分段存儲管理方式擴展閱讀:
基本分段存儲管理方式和基本分頁存儲管弊迅理方式原理的結合就是段頁式系統的基本原理,即先將用戶程序分成若干個段,再把每個段分成若干個頁,並為每一個段賦予一個段名。
在段頁式系統中,為了便於實現地址變換,須配置一個段表寄存器,其中存放段表始址和段表長TL。進行地址變換時,首先利用段號S,將它與段表長TL進行比較。
8. 基本分段存儲管理方式的分段系統的基本原理
在分段存儲管理方式中,作業的地址空間被劃分為若干個段,每個段定義了一組邏輯信息。例如,有主程序段MAIN、子程序段X、數據段D及棧段S等,如圖4-17所示。每個段都有自己的名字。為了實現簡單起見,通常可用一個段號來代替段名,每個段都從0開始編址,並採用一段連續的地址空間。段的長度由相應的邏輯信息組的長度決定,因而各段長度不等。整個作業的地址空間由於是分成多個段,因而是二維的,亦即,其邏輯地址由段號(段名)和段內地址所組成。
分段地址中的地址具有如下結構:
在該地址結構中,允許一個作業最長有 64 K個段,每個段的最大長度為64 KB。分段方式已得到許多編譯程序的支持,編譯程序能自動地根據源程序的情況而產生若干個段。例如,Pascal編譯程序可以為全局變數、用於存儲相應參數及返回地址的過程調用棧、每個過程或函數的代碼部分、每個過程或函數的局部變數等等,分別建立各自的段。類似地,Fortran編譯程序可以為公共塊(Common block)建立單獨的段,也可以為數組分配一個單獨的段。裝入程序將裝入所有這些段,並為每個段賦予一個段號。 為了實現從進程的邏輯地址到物理地址的變換功能,在系統中設置了段表寄存器,用於存放段表始址和段表長度TL。在進行地址變換時,系統將邏輯地址中的段號與段表長度TL進行比較。若S>TL,表示段號太大,是訪問越界,於是產生越界中斷信號;若未越界,則根據段表的始址和該段的段號,計算出該段對應段表項的位置,從中讀出該段在內存的起始地址,然後,再檢查段內地址d是否超過該段的段長SL。若超過,即d>SL,同樣發出越界中斷信號;若未越界,則將該段的基址d與段內地址相加,即可得到要訪問的內存物理地址。
下圖示出了分段系統的地址變換過程。
像分頁系統一樣,當段表放在內存中時,每要訪問一個數據,都須訪問兩次內存,從而極大地降低了計算機的速率。解決的方法也和分頁系統類似,再增設一個聯想存儲器,用於保存最近常用的段表項。由於一般情況是段比頁大,因而段表項的數目比頁表項的數目少,其所需的聯想存儲器也相對較小,便可以顯著地減少存取數據的時間,比起沒有地址變換的常規存儲器的存取速度來僅慢約10%~15%。
9. 採用段式存儲管理的系統中,若地址用24位表示,其中8位表示段號,則允許每段最大長度是
2^16。
採用段式管理的系統中,其邏輯地址分為段號和頁內偏移量。本題的地址一共24位,使用了8位表示段號,那麼把剩下的 16 位全部用來表示段內偏移量就能使每段長度最大從而每段允許的最大長度為 2^16。
產生是與程序的燃老模塊化直接物段腔有關的,段式管理是通過段表進行的,包括段號或段名、段起點、裝入位、段的長度等。此外還需要主存佔用區域表、主存可用區域表。
(9)若os採用分段存儲管理方式擴展閱讀:
為了進行段式管罩衫理,每道程序在系統中都有一個段(映象)表來存放該道程序各段裝入主存的狀況信息。
段表中的每一項(對應表中的每一行)描述該道程序一個段的基本狀況,由若干個欄位提供。段名欄位用於存放段的名稱,段名一般是有其邏輯意義的,也可以轉換成用段號指明。
由於段號從0開始順序編號,正好與段表中的行號對應,如2段必是段表中的第3行,這樣,段表中就可不設段號(名)欄位。
段表中還可以根據需要設置其它的欄位。段表本身也是一個段,一般常駐在主存中,也可以存在輔存中,需要時再調入主存。假設系統在主存中最多可同時有N道程序,可設N個段表基址寄存器。
10. 有一個操作系統採用段式存儲管理方案,用戶區內存為512K,分配時截取空閑塊的前半部分(小地址部分)。初
最先適配:兩個空塊。10K,位於290~299;112K,位於400~511;
若再申請80K,會在起始為400K的位置再分配80K空間。
最佳適配:兩個空塊。60K,位於240~299;62K,位於450~511;
若再申請80K,會無法分配。
結果說明,最先適配會在存儲器前端產生一些細小的空塊,雖然適配時可能會將巨大的空塊分割得比較小,然而一些進程釋放空間後,會產生較大的可利用空塊。而最佳適配雖然名叫最佳適配,實際上由於佔有的空間太接近塊的大小,會產生很多無法利用的小空塊,性能並不好。