1. 程式人生 > >內部碎片與外部碎片

內部碎片與外部碎片

“碎片的記憶體”描述一個系統中所有不可用的空閒記憶體。這些資源之所以仍然未被使用,是因為負責分配記憶體的分配器使這些記憶體無法使用。這一問題通常都會發生,原因在於空閒記憶體以小而不連續方式出現在不同的位置。由於分 配方法決定記憶體碎片是否是一個問題,因此記憶體分配器在保證空閒資源可用性方面扮演著重要的角色。

internal fragmentation:when memory allocated to a process is larger than requested memory,

the difference between these two numbers is internal fragmentation.

external fragmentation:External fragments exists when total memory space exists to satisfy a request,

but it is not continous. storage is broken into little pieces.

在記憶體管理中,內部碎片是已經被分配出去的的記憶體空間大於請求所需的記憶體空間。

外部碎片是指還沒有分配出去,但是由於大小太小而無法分配給申請空間的新程序的記憶體空間空閒塊。

固定分割槽存在內部碎片,可變式分割槽分配會存在外部碎片;

頁式虛擬儲存系統存在內部碎片;段式虛擬儲存系統,存在外部碎片

為了有效的利用記憶體,使記憶體產生更少的碎片,要對記憶體分頁,記憶體以頁為單位來使用,最後一頁往往裝不滿,於是形成了內部碎片。

為了共享要分段,在段的換入換出時形成外部碎片,比如5K的段換出後,有一個4k的段進來放到原來5k的地方,於是形成1k的外部碎片。

---------------------------------------------------------------------------------------------------------

儲存器是個寶貴但卻有限的資源。一流的作業系統,需要能夠有效地管理及利用儲存器。

記憶體為程式分配空間有四種分配方式:

1、連續分配方式

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

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

4、段頁式儲存管理方式

連續分配方式

首先講連續分配方式。連續分配方式出現的時間比較早,曾廣泛應用於20世紀60~70年代的OS中,但是它至今仍然在記憶體管理方式中佔有一席之地,原因在於它實現起來比較方便,所需的硬體支援最少。連續分配方式又可細分為四種:單一連續分配、固定分割槽分配、動態分割槽分配和動態重定位分割槽分配。

其中固定分割槽分配方式,因為分割槽固定,所以缺乏靈活性,即當程式太小時,會造成記憶體空間的浪費;程式太大時,一個分割槽又不足以容納,致使程式無法執行。但儘管如此,當一臺計算機去控制多個相同物件的時候,由於這些物件記憶體大小相同,所以完全可以採用這種記憶體管理方式,而且是最高效的。這裡我們可以看出儲存器管理機制的多面性:即沒有那種儲存器管理機制是完全沒有用的,在適合的場合下,一種被認為最不合理的分配方案卻可能稱為最高效的分配方案。一切都要從實際問題出發,進行設計。

為了解決固定分割槽分配方式的缺乏靈活性,出現了動態分配方式。動態分配方式採用一些尋表的方式,查詢能符合程式需要的空閒記憶體分割槽。但代價是增加了系統執行的開銷,而且記憶體空閒表本身是一個檔案,必然會佔用一部分寶貴的記憶體資源,而且有些演算法還會增加記憶體碎片。

可重定位分割槽分配通過對程式實現成定位,從而可以將記憶體塊進行搬移,將小塊拼成大塊,將小空閒“緊湊”成大空閒,騰出較大的記憶體以容納新的程式程序。

基本分頁儲存管理方式

連續分配方式會形成許多“碎片”,雖然可以通過“緊湊”方式將許多碎片拼接成可用的大塊空間,但須為之付出很大開銷。所以提出了“離散分配方式”的想法。如果離散分配的基本單位是頁,則稱為分頁管理方式;如果離散分配的基本單位是段,則稱為分段管理方式。

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

在分頁系統中,允許將程序的各個頁離散地儲存在記憶體不同的物理塊中,但系統應能保證程序的正確執行,即能在記憶體中找到每個頁面所對應的物理塊。為此,系統又為每個程序建立了一張頁面映像表,簡稱頁表。在程序地址空間內的所有頁,依次在頁表中有一頁表項,其中記錄了相應頁在記憶體中對應的物理塊號。在配置了頁表後,程序執行時,通過查詢該表,即可找到每頁在記憶體中的物理塊號。可見,頁表的作用是實現從頁號到物理塊號的地址對映。

為了能夠將使用者地址空間中的邏輯地址,變換為記憶體空間中的實體地址,在系統中必須設定地址變換機構。地址變換任務是藉助於頁表來完成的。

頁表的功能可由一組專門的暫存器來實現。由於暫存器成本較高,且大多數現代計算機的頁表又很大,使頁表項總數可達幾千甚至幾十萬個,顯然這些頁表項不可能都用暫存器來實現,因此,頁表大多駐留在記憶體中。因為一個程序可以通過它的PCB來時時儲存自己的狀態,等到CPU要處理它的時候才將PCB交給暫存器,所以,系統中雖然可以執行多個程序,但也只需要一個頁表暫存器就可以了

由於頁表是存放在記憶體中的,這使得CPU在每存取一個數據時,都要兩次訪問記憶體。為了提高地址變換速度,在地址變化機構中增設了一個具有並行查詢能力的告訴緩衝暫存器,又稱為“聯想暫存器”(Associative Lookaside Buffer)。

在單級頁表的基礎上,為了適應非常大的邏輯地址空間,出現了兩級和多級頁表,但是,他們的原理和單級頁表是一樣的,只不過為了適應地址變換層次的增加,需要在地址變換機構中增設外層的頁表暫存器。

基本分段儲存管理方式

分段儲存管理方式的目的,主要是為了滿足使用者(程式設計師)在程式設計和使用上多方面的要求,其中有些要求是其他幾種儲存管理方式所難以滿足的。因此,這種儲存管理方式已成為當今所有儲存管理方式的基礎。

(1)方便程式設計;

(2)資訊共享:分頁系統中的“頁”只是存放資訊的物理單位(塊),並無完整的意義,不便於實現共享;然而段卻是資訊的邏輯單位。由此可知,為了實現段的共享,希望儲存器管理能與使用者程式分段的組織方式相適應。

(3)資訊保護;

(4)動態增長;

(5)動態連結。

分段管理方式和分頁管理方式在實現思路上是很相似的,只不過他們的基本單位不同。分段有段表,也有地址變換機構,為了提高檢索速度,同樣增設聯想暫存器。所以有些具體細節在這個不再贅述。

分頁和分段的主要區別:

1、兩者相似之處:兩者都採用離散分配方式,且都要通過地址對映機構來實現地址變換。

2、兩者不同之處:

(1)頁是資訊的物理單位,分頁是為實現離散分配方式,以消減記憶體的外零頭,提高記憶體的利用率。或者說,分頁僅僅是由於系統管理的需要而不是 使用者的需要。段則是資訊的邏輯單位,它含有一組其意義相對完整的資訊。分段的目的是為了能更好地滿足使用者的需要。

(2)頁的大小固定且由系統決定,而段的長度卻不固定。

(3)分頁的作業地址空間是一維的,即單一的線性地址空間;而分段的作業地址空間則是二維的。

段頁式儲存管理方式

前面所介紹的分頁和分段儲存管理方式都各有優缺點。分頁系統能有效地提高記憶體利用率,而分段系統則能很好地滿足使用者需求。我們希望能夠把兩者的優點結合,於是出現了段頁式儲存管理方式。

段頁式系統的基本原理,是分段和分頁原理的結合,即先將使用者程式分成若干個段,再把每個段分成若干個頁,併為每一個段賦予一個段名。在段頁式系統中,地址結構由段號、段內頁號和頁內地址三部分所組成。

和前兩種儲存管理方式相同,段頁式儲存管理方式同樣需要增設聯想暫存器。

離散分配方式基於將一個程序直接分散地分配到許多不相鄰的分割槽中的思想,分為分頁式儲存管理,分段儲存管理和段頁式儲存管理. 分頁式儲存管理旨在提高記憶體利用率,滿足系統管理的需要,分段式儲存管理則旨在滿足使用者(程式設計師)的需要,在實現共享和保護方面優於分頁式儲存管理,而段頁式儲存管理則是將兩者結合起來,取長補短,即具有分段系統便於實現,可共享,易於保護,可動態連結等優點,又能像分頁系統那樣很好的解決外部碎片的問題,以及為各個分段可離散分配記憶體等問題,顯然是一種比較有效的儲存管理方式。

相關推薦

內部碎片外部碎片

“碎片的記憶體”描述一個系統中所有不可用的空閒記憶體。這些資源之所以仍然未被使用,是因為負責分配記憶體的分配器使這些記憶體無法使用。這一問題通常都會發生,原因在於空閒記憶體以小而不連續方式出現

作業系統記憶體管理之 內部碎片vs外部碎片

“碎片的記憶體”描述一個系統中所有不可用的空閒記憶體。這些資源之所以仍然未被使用,是因為負責分配記憶體的分配器使這些記憶體無法使用。這一問題通常都會發生,原因在於空閒記憶體以小而不連續方式出現在不同的位置。由於分 配方法決定記憶體碎片是否是一個問題,因此記憶體分配器在保證

html-內部樣式外部樣式表

div2 charset shee body lin pin html ref title <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8"> <t

Hive 內部 外部

Hive中的表又分為內部表和外部表 ,Hive 中的每張表對應於HDFS上的一個資料夾,HDFS目錄為:/user/hadoop/hive/warehouse/[databasename.db]/table 內部表 建立語句 這裡我們採用從之前表中複製表結構和資料 creat

Hive 中內部外部表的區別建立方法

先來說下Hive中內部表與外部表的區別:1)建立表時:建立內部表時,會將資料移動到資料倉庫指向的路徑;若建立外部表,僅記錄資料所在的路徑,不對資料的位置做任何改變。 2)刪除表時:在刪除表的時候,內部表的元資料和資料會被一起刪除,而外部表只刪除元資料,不刪除資料。這樣外部表

Hive內部外部表(外部表使用場景)

官網解釋 Managed and External Tables By default Hive creates managed tables, where files, metadata and statistics are managed by inter

C++編譯連結-淺談內部連結外部連結

為什麼有時會出現aaa已在bbb中重定義的錯誤? 為什麼有時會出現無法解析的外部符號? 為什麼有的行內函數的定義需要寫在標頭檔案中? 為什麼對於模板,宣告和定義都在寫在一起? 讀完這篇部落格,相信你會有一個初步的認識 注,我們現在談的

hive的內部外部表建立

最近才接觸Hive。學到了一些東西,就先記下來,免得以後忘了。 1.建立表的語句:Create [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], .

內部排序外部排序

排序=內部排序+外部排序 內部排序主要消耗時間複雜度,而外部排序消耗的是空間複雜度;如何權衡時間和空間複雜度? 內部排序一般包括:冒泡,選擇,快速排序等; 外部排序則是通過開闢空間,讓特定空間有雙重含義。利用這個含義來解決內部排序的問題。 舉一個外部排序

Hive內部外部

一、在Hive中建立表時,無external修飾的是內部表(managed table),有external修飾的是外部表(external table): 1、內部表的資料是Hive自身管理,外部表資

Hive內部外部表區別,資料匯入資料讀取方式小結

建立一個外部表: 使用'|'作為分隔符,‘\n’回車作為換行符,指定資料倉庫地址 hive> CREATE EXTERNAL TABLE rdcuser ( > id int, > name string, > passwo

C語言內部函式外部函式

內部函式與外部函式的區分標準是,該函式能否被其他原始檔呼叫。 內部函式 如果一個函式只能被本檔案中的其他函式呼叫,稱為內部函式。在定義內部函式的時候,在函式名和函式型別的前面加static,即:

C語言中的內部函式外部函式

內部函式:   如果一個函式只能被本檔案中其它函式所呼叫,它稱為內部函式。在定義內部函式時,在函式名和函式型別的前面加static。即   static 型別識別符號 函式名 (形參表) 如: static int fun (int a, int b) 內部函式又稱靜態函

CPU卡內部認證外部認證

使用者卡和機具進行雙向認證 問題的提出: 1、傳統的“對暗號” 經典片斷: 問:天王蓋地虎 答:寶塔鎮河妖 互相握手,擁抱,同志呀同志!可終於找到你了 相信大家一定看過間諜電影中地對暗號片斷,但是暗號容易被敵人竊取,於是有了革命者驚險或悲壯的故事,當然了其中不乏

內部儲存外部儲存的區別

內部儲存: 內部儲存不是記憶體,而是一個位於系統中很特殊的一個位置。放入內部儲存中的資料一般都只能被你的應用訪問到,且一個應用所建立的所有檔案都在應用包名相同的目錄下,即/data/data/pack

C++內部連結外部連結

你曾經碰到的問題:  1.為什麼有時會出現aaa已在bbb中重定義的錯誤? 2.為什麼有時會出現無法解析的外部符號? 3.為什麼有的行內函數的定義需要寫在標頭檔案中? 4.為什麼對於模板,宣告和定義都要寫在一起? 編譯單元  什麼是編譯單元呢?簡單來說一個

徹底理解android中的內部儲存外部儲存

我們先來考慮這樣一個問題: 開啟手機設定,選擇應用管理,選擇任意一個App,然後你會看到兩個按鈕,一個是清除快取,另一個是清除資料,那麼當我們點選清除快取的時候清除的是哪裡的資料?當我們點選清除資料的時候又是清除的哪裡的資料?讀完本文相信你會有答案。 在android開發中

內部排序外部排序簡單比較

前言本篇文章主要介紹內部排序與外部排序的知識,如果你和我一樣還不知道內部排序和外部排序為何物的話,不妨看看我的理解正文由於待排序的記錄數量不同,使得排序過程中涉及的儲存器不同,可將排序方法分為兩大類:內部排序與外部排序。概念內部排序:待排序記錄存放在計算機隨機儲存器中(說簡單

外部碎片內部碎片

 外部碎片,是由於大量資訊由於先後寫入、置換、刪除而形成的空間碎片。  內部碎片,是由於存量資訊容量與最小儲存空間單位不完全相符而造成的空間碎片。還是沿用上面的例子,這次我們的6間倉庫目前都是空置的,但是假設我們管理倉庫的最小空間單位是間,今天運來了容量為2.5間倉庫的貨物,

外部碎片內部碎片的區別

一、在記憶體上(使用連續分配演算法來管理分配記憶體時會產生)的外部碎片和內部碎片兩個概念 這幾天一直看作業系統,看到記憶體的連續分配時,對於外部碎片和內部碎片時甚是不解: 記憶體碎片分為:內部碎片和外部碎片 【內部碎片】 內部碎片就是已經被分配出去(能明確指出屬於哪個