操作系统内存管理之 内部碎片vs外部碎片
“碎片的內(nèi)存”描述一個(gè)系統(tǒng)中所有不可用的空閑內(nèi)存。這些資源之所以仍然未被使用,是因?yàn)樨?fù)責(zé)分配內(nèi)存的分配器使這些內(nèi)存無法使用。這一問題通常都會(huì)發(fā)生,原因在于空閑內(nèi)存以小而不連續(xù)方式出現(xiàn)在不同的位置。由于分 配方法決定內(nèi)存碎片是否是一個(gè)問題,因此內(nèi)存分配器在保證空閑資源可用性方面扮演著重要的角色。
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.?
在內(nèi)存管理中,內(nèi)部碎片是已經(jīng)被分配出去的的內(nèi)存空間大于請(qǐng)求所需的內(nèi)存空間。
外部碎片是指還沒有分配出去,但是由于大小太小而無法分配給申請(qǐng)空間的新進(jìn)程的內(nèi)存空間空閑塊。
固定分區(qū)存在內(nèi)部碎片,可變式分區(qū)分配會(huì)存在外部碎片;
頁式虛擬存儲(chǔ)系統(tǒng)存在內(nèi)部碎片;段式虛擬存儲(chǔ)系統(tǒng),存在外部碎片
為了有效的利用內(nèi)存,使內(nèi)存產(chǎn)生更少的碎片,要對(duì)內(nèi)存分頁,內(nèi)存以頁為單位來使用,最后一頁往往裝不滿,于是形成了內(nèi)部碎片。
為了共享要分段,在段的換入換出時(shí)形成外部碎片,比如5K的段換出后,有一個(gè)4k的段進(jìn)來放到原來5k的地方,于是形成1k的外部碎片。
---------------------------------------------------------------------------------------------------------
存儲(chǔ)器是個(gè)寶貴但卻有限的資源。一流的操作系統(tǒng),需要能夠有效地管理及利用存儲(chǔ)器。
內(nèi)存為程序分配空間有四種分配方式:
1、連續(xù)分配方式
2、基本分頁存儲(chǔ)管理方式
3、基本分段存儲(chǔ)管理方式
4、段頁式存儲(chǔ)管理方式
連續(xù)分配方式
首先講連續(xù)分配方式。連續(xù)分配方式出現(xiàn)的時(shí)間比較早,曾廣泛應(yīng)用于20世紀(jì)60~70年代的OS中,但是它至今仍然在內(nèi)存管理方式中占有一席之地,原因在于它實(shí)現(xiàn)起來比較方便,所需的硬件支持最少。連續(xù)分配方式又可細(xì)分為四種:單一連續(xù)分配、固定分區(qū)分配、動(dòng)態(tài)分區(qū)分配和動(dòng)態(tài)重定位分區(qū)分配。
其中固定分區(qū)分配方式,因?yàn)榉謪^(qū)固定,所以缺乏靈活性,即當(dāng)程序太小時(shí),會(huì)造成內(nèi)存空間的浪費(fèi);程序太大時(shí),一個(gè)分區(qū)又不足以容納,致使程序無法運(yùn)行。但盡管如此,當(dāng)一臺(tái)計(jì)算機(jī)去控制多個(gè)相同對(duì)象的時(shí)候,由于這些對(duì)象內(nèi)存大小相同,所以完全可以采用這種內(nèi)存管理方式,而且是最高效的。這里我們可以看出存儲(chǔ)器管理機(jī)制的多面性:即沒有那種存儲(chǔ)器管理機(jī)制是完全沒有用的,在適合的場(chǎng)合下,一種被認(rèn)為最不合理的分配方案卻可能稱為最高效的分配方案。一切都要從實(shí)際問題出發(fā),進(jìn)行設(shè)計(jì)。
為了解決固定分區(qū)分配方式的缺乏靈活性,出現(xiàn)了動(dòng)態(tài)分配方式。動(dòng)態(tài)分配方式采用一些尋表的方式,查找能符合程序需要的空閑內(nèi)存分區(qū)。但代價(jià)是增加了系統(tǒng)運(yùn)行的開銷,而且內(nèi)存空閑表本身是一個(gè)文件,必然會(huì)占用一部分寶貴的內(nèi)存資源,而且有些算法還會(huì)增加內(nèi)存碎片。
可重定位分區(qū)分配通過對(duì)程序?qū)崿F(xiàn)成定位,從而可以將內(nèi)存塊進(jìn)行搬移,將小塊拼成大塊,將小空閑“緊湊”成大空閑,騰出較大的內(nèi)存以容納新的程序進(jìn)程。
基本分頁存儲(chǔ)管理方式
連續(xù)分配方式會(huì)形成許多“碎片”,雖然可以通過“緊湊”方式將許多碎片拼接成可用的大塊空間,但須為之付出很大開銷。所以提出了“離散分配方式”的想法。如果離散分配的基本單位是頁,則稱為分頁管理方式;如果離散分配的基本單位是段,則稱為分段管理方式。
分頁存儲(chǔ)管理是將一個(gè)進(jìn)程的邏輯地址空間分成若干個(gè)大小相等的片,稱為頁面或頁,并為各頁加以編號(hào),從0開始,如第0頁、第1頁等。相應(yīng)地,也把內(nèi)存空間分成與頁面相同大小的若干個(gè)存儲(chǔ)塊,稱為(物理)塊或頁框(frame),也同樣為它們加以編號(hào),如0#塊、1#塊等等。在為進(jìn)程分配內(nèi)存時(shí),以塊為單位將進(jìn)程中的若干個(gè)頁分別裝入到多個(gè)可以不相鄰接的物理塊中。由于進(jìn)程的最后一頁經(jīng)常裝不滿一塊而形成了不可利用的碎片,稱之為“頁內(nèi)碎片”。
在分頁系統(tǒng)中,允許將進(jìn)程的各個(gè)頁離散地存儲(chǔ)在內(nèi)存不同的物理塊中,但系統(tǒng)應(yīng)能保證進(jìn)程的正確運(yùn)行,即能在內(nèi)存中找到每個(gè)頁面所對(duì)應(yīng)的物理塊。為此,系統(tǒng)又為每個(gè)進(jìn)程建立了一張頁面映像表,簡(jiǎn)稱頁表。在進(jìn)程地址空間內(nèi)的所有頁,依次在頁表中有一頁表項(xiàng),其中記錄了相應(yīng)頁在內(nèi)存中對(duì)應(yīng)的物理塊號(hào)。在配置了頁表后,進(jìn)程執(zhí)行時(shí),通過查找該表,即可找到每頁在內(nèi)存中的物理塊號(hào)。可見,頁表的作用是實(shí)現(xiàn)從頁號(hào)到物理塊號(hào)的地址映射。
為了能夠?qū)⒂脩舻刂房臻g中的邏輯地址,變換為內(nèi)存空間中的物理地址,在系統(tǒng)中必須設(shè)置地址變換機(jī)構(gòu)。地址變換任務(wù)是借助于頁表來完成的。
頁表的功能可由一組專門的寄存器來實(shí)現(xiàn)。由于寄存器成本較高,且大多數(shù)現(xiàn)代計(jì)算機(jī)的頁表又很大,使頁表項(xiàng)總數(shù)可達(dá)幾千甚至幾十萬個(gè),顯然這些頁表項(xiàng)不可能都用寄存器來實(shí)現(xiàn),因此,頁表大多駐留在內(nèi)存中。因?yàn)?span style="color:#006600">一個(gè)進(jìn)程可以通過它的PCB來時(shí)時(shí)保存自己的狀態(tài),等到CPU要處理它的時(shí)候才將PCB交給寄存器,所以,系統(tǒng)中雖然可以運(yùn)行多個(gè)進(jìn)程,但也只需要一個(gè)頁表寄存器就可以了。
由于頁表是存放在內(nèi)存中的,這使得CPU在每存取一個(gè)數(shù)據(jù)時(shí),都要兩次訪問內(nèi)存。為了提高地址變換速度,在地址變化機(jī)構(gòu)中增設(shè)了一個(gè)具有并行查詢能力的告訴緩沖寄存器,又稱為“聯(lián)想寄存器”(Associative Lookaside Buffer)。
在單級(jí)頁表的基礎(chǔ)上,為了適應(yīng)非常大的邏輯地址空間,出現(xiàn)了兩級(jí)和多級(jí)頁表,但是,他們的原理和單級(jí)頁表是一樣的,只不過為了適應(yīng)地址變換層次的增加,需要在地址變換機(jī)構(gòu)中增設(shè)外層的頁表寄存器。
基本分段存儲(chǔ)管理方式
分段存儲(chǔ)管理方式的目的,主要是為了滿足用戶(程序員)在編程和使用上多方面的要求,其中有些要求是其他幾種存儲(chǔ)管理方式所難以滿足的。因此,這種存儲(chǔ)管理方式已成為當(dāng)今所有存儲(chǔ)管理方式的基礎(chǔ)。
(1)方便編程;
(2)信息共享:分頁系統(tǒng)中的“頁”只是存放信息的物理單位(塊),并無完整的意義,不便于實(shí)現(xiàn)共享;然而段卻是信息的邏輯單位。由此可知,為了實(shí)現(xiàn)段的共享,希望存儲(chǔ)器管理能與用戶程序分段的組織方式相適應(yīng)。
(3)信息保護(hù);
(4)動(dòng)態(tài)增長(zhǎng);
(5)動(dòng)態(tài)鏈接。
分段管理方式和分頁管理方式在實(shí)現(xiàn)思路上是很相似的,只不過他們的基本單位不同。分段有段表,也有地址變換機(jī)構(gòu),為了提高檢索速度,同樣增設(shè)聯(lián)想寄存器。所以有些具體細(xì)節(jié)在這個(gè)不再贅述。
分頁和分段的主要區(qū)別:
1、兩者相似之處:兩者都采用離散分配方式,且都要通過地址映射機(jī)構(gòu)來實(shí)現(xiàn)地址變換。
2、兩者不同之處:
(1)頁是信息的物理單位,分頁是為實(shí)現(xiàn)離散分配方式,以消減內(nèi)存的外零頭,提高內(nèi)存的利用率。或者說,分頁僅僅是由于系統(tǒng)管理的需要而不是 ? ? ?用戶的需要。段則是信息的邏輯單位,它含有一組其意義相對(duì)完整的信息。分段的目的是為了能更好地滿足用戶的需要。
(2)頁的大小固定且由系統(tǒng)決定,而段的長(zhǎng)度卻不固定。
(3)分頁的作業(yè)地址空間是一維的,即單一的線性地址空間;而分段的作業(yè)地址空間則是二維的。
段頁式存儲(chǔ)管理方式
前面所介紹的分頁和分段存儲(chǔ)管理方式都各有優(yōu)缺點(diǎn)。分頁系統(tǒng)能有效地提高內(nèi)存利用率,而分段系統(tǒng)則能很好地滿足用戶需求。我們希望能夠把兩者的優(yōu)點(diǎn)結(jié)合,于是出現(xiàn)了段頁式存儲(chǔ)管理方式。
段頁式系統(tǒng)的基本原理,是分段和分頁原理的結(jié)合,即先將用戶程序分成若干個(gè)段,再把每個(gè)段分成若干個(gè)頁,并為每一個(gè)段賦予一個(gè)段名。在段頁式系統(tǒng)中,地址結(jié)構(gòu)由段號(hào)、段內(nèi)頁號(hào)和頁內(nèi)地址三部分所組成。
和前兩種存儲(chǔ)管理方式相同,段頁式存儲(chǔ)管理方式同樣需要增設(shè)聯(lián)想寄存器。
總結(jié)
以上是生活随笔為你收集整理的操作系统内存管理之 内部碎片vs外部碎片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++内存碎片
- 下一篇: malloc原理和内存碎片