您好,登錄后才能下訂單哦!
本文小編為大家詳細(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è)資訊頻道。
免責(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)容。