溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Linux內(nèi)存的分配和釋放是什么

發(fā)布時(shí)間:2022-01-07 16:20:57 來(lái)源:億速云 閱讀:445 作者:iii 欄目:系統(tǒng)運(yùn)維

本文小編為大家詳細(xì)介紹“Linux內(nèi)存的分配和釋放是什么”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Linux內(nèi)存的分配和釋放是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

了解內(nèi)存分配機(jī)制(共享映射與請(qǐng)求分頁(yè))

通過(guò) pmap 命令,可以獲取用戶(hù)進(jìn)程邏輯地址空間中映射的內(nèi)存信息:

pmap -x $pid

其中 -x 表示獲取詳細(xì)信息。

下面是一個(gè)例子:

pmap -x $(pidof emacs) |head -20

其中,“Address(地址)”指的進(jìn)程的邏輯地址空間。

“Kbytes”列表示的是對(duì)應(yīng)邏輯地址的容量,以Kb為單位

“RSS”列表示的是實(shí)際使用的物理內(nèi)存容量,由于分頁(yè)機(jī)制的存在,這個(gè)值一般要比”Kbytes”的值要少。

“Mapping”列為邏輯內(nèi)存的映射方式,其中”[annon]“表示通過(guò)malloc函數(shù)來(lái)分配的堆空間(匿名內(nèi)存),”[stack]“為進(jìn)程的??臻g,這兩種映射都是將物理內(nèi)存映射到進(jìn)程的邏輯內(nèi)存上去。 而”emacs-25.3″,”libpixbufloader-svg.so”等文件名則表示它們執(zhí)行的是文件映射,他們對(duì)應(yīng)的是磁盤(pán)上的文件。當(dāng)這些文件被讀入高速緩存后,相應(yīng)的內(nèi)存空間被映射成進(jìn)程的邏輯內(nèi)存。

當(dāng)出現(xiàn)多個(gè)程序共同使用相同的文件映射(共享庫(kù))時(shí),它們可以共享磁盤(pán)高速緩存中的同一空間,從而節(jié)省物理內(nèi)存的使用量,這種技術(shù)就是”共享映射”技術(shù)。

除了共享庫(kù)外,進(jìn)程的fork也使用了共享映射技術(shù)。 當(dāng)父進(jìn)程fork子進(jìn)程時(shí),Linux內(nèi)核并不對(duì)內(nèi)存中的內(nèi)容進(jìn)行實(shí)際上的復(fù)制,而是將映射到父進(jìn)程邏輯地址空間內(nèi)的那部分內(nèi)容原封不動(dòng)地共享映射到子進(jìn)程的邏輯地址空間內(nèi)。 但為了防止父進(jìn)程和子進(jìn)程的內(nèi)存操作相互影響,Linux內(nèi)核在進(jìn)行共享映射時(shí),相應(yīng)的內(nèi)存區(qū)域會(huì)暫時(shí)設(shè)置為寫(xiě)保護(hù)。 當(dāng)某一方進(jìn)程試圖操作內(nèi)存時(shí),會(huì)引發(fā)只讀異常。內(nèi)核檢測(cè)到這個(gè)異常后,會(huì)復(fù)制操作的這個(gè)內(nèi)存頁(yè),從而使兩個(gè)進(jìn)程都可進(jìn)行獨(dú)立寫(xiě)入。 這種在寫(xiě)入時(shí)復(fù)制的機(jī)制叫做“寫(xiě)時(shí)復(fù)制(copy-on-write)”

另一方面,進(jìn)程將可執(zhí)行文件或共享庫(kù)文件內(nèi)容讀入內(nèi)存并映射到進(jìn)程邏輯地址空間上時(shí),并不會(huì)讀入全部的文件內(nèi)容,而是先標(biāo)記”該文件的內(nèi)容已經(jīng)被映射到邏輯地址空間內(nèi)”. 當(dāng)進(jìn)程訪問(wèn)邏輯地址空間時(shí),由于不存在對(duì)應(yīng)的物理內(nèi)存,會(huì)引發(fā)換頁(yè)錯(cuò)誤的異常。內(nèi)容檢測(cè)到該異常后會(huì)將所需部分以?xún)?nèi)存頁(yè)為單位讀入內(nèi)存中。 這種只讀入所需內(nèi)容的機(jī)制,叫做請(qǐng)求分頁(yè)。

了解內(nèi)存釋放機(jī)制

當(dāng)其他進(jìn)程需要新的物理內(nèi)存時(shí),就涉及到如何將尚有數(shù)據(jù)殘余的物理內(nèi)存釋放或換出來(lái)的問(wèn)題了。

當(dāng)需要新物理內(nèi)存時(shí),會(huì)優(yōu)先釋放Inactive(file)和Active(file)中記錄的內(nèi)存頁(yè),只需要將臟數(shù)據(jù)寫(xiě)入文件中再釋放內(nèi)存頁(yè)即可。

而Inactive(anon)和Active(anon)內(nèi)存頁(yè)則需要將內(nèi)容交換到物理磁盤(pán)上的swap中后再釋放。 具體來(lái)說(shuō),Linux會(huì)在進(jìn)程頁(yè)表上做一個(gè)標(biāo)記,標(biāo)記出換出內(nèi)存所對(duì)應(yīng)的邏輯地址。 當(dāng)進(jìn)程訪問(wèn)該邏輯地址時(shí),會(huì)產(chǎn)生相應(yīng)物理內(nèi)存不存在的異常,Linux內(nèi)核檢測(cè)到這個(gè)異常后,會(huì)再次將數(shù)據(jù)從swap中加載入空閑內(nèi)存,并重新配置頁(yè)表信息。

Linux內(nèi)核使用兩種機(jī)制來(lái)加快換出處理速度:

  • 一種是預(yù)讀。

當(dāng)某一個(gè)內(nèi)存頁(yè)需要換入時(shí),Linux內(nèi)核會(huì)將其后的幾個(gè)內(nèi)存頁(yè)一起換入。因?yàn)檫M(jìn)程連續(xù)訪問(wèn)多個(gè)內(nèi)存頁(yè)的可能性很大。預(yù)讀的頁(yè)數(shù)為內(nèi)核參數(shù) vm.page-cluster 決定為 2^vm.page-cluster.

  • 另一種是交換緩存。

即在換入某個(gè)內(nèi)存頁(yè)后,物理磁盤(pán)上交換空間中仍然保留原數(shù)據(jù),這種狀態(tài)的內(nèi)存會(huì)記錄在“交換緩存”的列表上。這樣當(dāng)需要再次換出記錄在“交換緩存”上的內(nèi)存頁(yè)的數(shù)據(jù)時(shí),就無(wú)需再次換入了。

每個(gè)進(jìn)程的內(nèi)存使用情況可以通過(guò)查看 /proc/進(jìn)程ID/status 來(lái)查看

cat /proc/$(pidof emacs)/status
Name: emacs Umask:  0022 State:  S (sleeping) Tgid: 6769 Ngid: 0 Pid:  6769 PPid: 1 TracerPid:  0 Uid:  1000  1000  1000  1000 Gid:  1000  1000  1000  1000 FDSize: 64 Groups: 986 998 1000 NStgid: 6769 NSpid:  6769 NSpgid: 6769 NSsid:  6769 VmPeak:   567040 kB VmSize:   567040 kB VmLck:         0 kB VmPin:         0 kB VmHWM:    241176 kB VmRSS:    241176 kB RssAnon:    204544 kB RssFile:     36604 kB RssShmem:       28 kB VmData:   231712 kB VmStk:      1596 kB VmExe:      2332 kB VmLib:     47832 kB VmPTE:      1008 kB VmSwap:        0 kB HugetlbPages:        0 kB CoreDumping:  0 Threads:  4 SigQ: 1/15456 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000004381000 SigCgt: 00000001db816eff CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 CapBnd: 0000003fffffffff CapAmb: 0000000000000000 NoNewPrivs: 0 Seccomp:  0 Cpus_allowed: 3 Cpus_allowed_list:  0-1 Mems_allowed: 1 Mems_allowed_list:  0 voluntary_ctxt_switches:  12951 nonvoluntary_ctxt_switches: 21641

其中比較有用的項(xiàng)有:

VmData

data段的大小

VmExe

text段的大小

VmHWM

當(dāng)前物理內(nèi)存使用量的***值

WmLck

用mlock鎖定的內(nèi)存大小

VmLib

共享庫(kù)的使用量

VmPTE

頁(yè)面表的大小

VmPeak

當(dāng)前物理內(nèi)存的***值

VmRSS

物理內(nèi)存的實(shí)際使用量

VmSize

邏輯地址的大小

VmStk

堆棧的大小

VmSwap

交換空間的使用量

讀到這里,這篇“Linux內(nèi)存的分配和釋放是什么”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI