自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux內(nèi)存的分配和釋放是怎么回事兒?

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

了解內(nèi)存分配機制(共享映射與請求分頁)

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

  1. pmap -x $pid 

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

下面是一個例子:

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

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

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

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

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

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

[[228529]]

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

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

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

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

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

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

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

  • 一種是預(yù)讀。

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

  • 另一種是交換緩存。

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

每個進程的內(nèi)存使用情況可以通過查看 /proc/進程ID/status 來查看

  1. cat /proc/$(pidof emacs)/status 
  1. Name: emacs 
  2. Umask:  0022 
  3. State:  S (sleeping) 
  4. Tgid: 6769 
  5. Ngid: 0 
  6. Pid:  6769 
  7. PPid: 1 
  8. TracerPid:  0 
  9. Uid:  1000  1000  1000  1000 
  10. Gid:  1000  1000  1000  1000 
  11. FDSize: 64 
  12. Groups: 986 998 1000 
  13. NStgid: 6769 
  14. NSpid:  6769 
  15. NSpgid: 6769 
  16. NSsid:  6769 
  17. VmPeak:   567040 kB 
  18. VmSize:   567040 kB 
  19. VmLck:         0 kB 
  20. VmPin:         0 kB 
  21. VmHWM:    241176 kB 
  22. VmRSS:    241176 kB 
  23. RssAnon:    204544 kB 
  24. RssFile:     36604 kB 
  25. RssShmem:       28 kB 
  26. VmData:   231712 kB 
  27. VmStk:      1596 kB 
  28. VmExe:      2332 kB 
  29. VmLib:     47832 kB 
  30. VmPTE:      1008 kB 
  31. VmSwap:        0 kB 
  32. HugetlbPages:        0 kB 
  33. CoreDumping:  0 
  34. Threads:  4 
  35. SigQ: 1/15456 
  36. SigPnd: 0000000000000000 
  37. ShdPnd: 0000000000000000 
  38. SigBlk: 0000000000000000 
  39. SigIgn: 0000000004381000 
  40. SigCgt: 00000001db816eff 
  41. CapInh: 0000000000000000 
  42. CapPrm: 0000000000000000 
  43. CapEff: 0000000000000000 
  44. CapBnd: 0000003fffffffff 
  45. CapAmb: 0000000000000000 
  46. NoNewPrivs: 0 
  47. Seccomp:  0 
  48. Cpus_allowed: 3 
  49. Cpus_allowed_list:  0-1 
  50. Mems_allowed: 1 
  51. Mems_allowed_list:  0 
  52. voluntary_ctxt_switches:  12951 
  53. nonvoluntary_ctxt_switches: 21641 

其中比較有用的項有:

VmData

data段的大小

VmExe

text段的大小

VmHWM

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

WmLck

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

VmLib

共享庫的使用量

VmPTE

頁面表的大小

VmPeak

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

VmRSS

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

VmSize

邏輯地址的大小

VmStk

堆棧的大小

VmSwap

交換空間的使用量

責任編輯:武曉燕 來源: CU技術(shù)社區(qū)
相關(guān)推薦

2021-07-30 07:28:16

偽類偽元素CSS

2017-11-24 11:10:38

區(qū)塊鏈礦工分叉

2011-05-23 14:10:00

2021-07-07 05:37:57

郵件安全網(wǎng)絡(luò)攻擊數(shù)據(jù)泄露

2020-06-30 08:12:32

VMwareKVMDocker

2023-03-29 08:24:30

2023-10-18 13:31:00

Linux內(nèi)存

2018-01-25 16:07:41

匿名函數(shù)自執(zhí)行

2021-06-04 11:10:04

JavaScript開發(fā)代碼

2011-01-14 17:00:11

Linux內(nèi)存泄露

2020-02-18 11:19:36

物聯(lián)網(wǎng)病毒物聯(lián)網(wǎng)IOT

2023-05-31 16:40:01

2024-01-08 08:35:28

閉包陷阱ReactHooks

2021-05-11 11:51:15

飛機Wi-Fi通信

2013-04-18 09:56:05

2023-03-05 15:41:58

MySQL日志暴漲

2016-11-22 19:54:56

點擊率預(yù)估推薦算法廣告

2023-10-12 08:54:20

Spring事務(wù)設(shè)置

2017-10-11 13:20:36

2021-07-31 19:21:34

Python下劃線數(shù)值
點贊
收藏

51CTO技術(shù)棧公眾號