IT技術互(hu)動交流平台(tai)

9福彩票官网

來源︰IT165收(shou)集  發布日期︰2020-02-20 06:21:37

首(shou)先,讓我們看下linux虛擬內存︰

 

第一層理解

1. 每個進程都有自己獨立(li)的4G內存空間,各個進程的內存空間具有類似的結構(gou)

 

2. 一個新(xin)進程建立(li)的時候(hou),將會建立(li)起自己的內存空間,此進程的數據,代(dai)碼(ma)等(deng)從磁盤拷貝到自己的進程空間,哪些數據在(zai)哪里,都由(you)進程控制表中的task_struct記錄,task_struct中記錄中一條(tiao)鏈表,記錄中內存空間的分配情況,哪些地址有數據,哪些地址無數據,哪些可讀,哪些可寫(xie),都可以(yi)通(tong)過(guo)這個鏈表記錄

 

3. 每個進程已經分配的內存空間,都與(yu)對應的磁盤空間映射

 

問題(ti)︰

計算機明明沒(mei)有那麼多內存(n個進程的話就需要n*4G)內存

建立(li)一個進程,就要把(ba)磁盤上(shang)的程序文件拷貝到進程對應的內存中去,對于一個程序對應的多個進程這種(zhong)情況,浪費(fei)內存!

第二層理解

1. 每個進程的4G內存空間只是qie)檳餑詿嬋佔洌 看ci)訪問內存空間的某個地址,都需要把(ba)地址翻譯(yi)為實(shi)際物理內存地址

2. 所(suo)有進程共享同一物理內存,每個進程只把(ba)自己目前需要的虛擬內存空間映射並存儲到物理內存上(shang)。

3. 進程要知道哪些內存地址上(shang)的數據在(zai)物理內存上(shang),哪些不在(zai),還有在(zai)物理內存上(shang)的哪里,需要用頁表來記錄

4. 頁表的每一個表項分兩(liang)部分,第一部分記錄ji)艘呈欠fu)在(zai)物理內存上(shang),第二部分記錄物理內存頁的地址(如果在(zai)的話)

5. 當(dang)進程訪問某個虛擬地址,去看頁表,如果發現(xian)對應的數據不在(zai)物理內存中,則缺頁異常

6. 缺頁異常的處理過(guo)程,就是把(ba)進程需要的數據從磁盤上(shang)拷貝到物理內存中,如果內存已經滿了,沒(mei)有空地方(fang)了,那就找(zhao)一個頁覆蓋,當(dang)然如果被(bei)覆蓋的頁曾經被(bei)修(xiu)改過(guo),需要將此頁寫(xie)回磁盤

總結︰

優(you)點︰

1.既然每個進程的內存空間都是qie)恢露qie)固定(ding)的,所(suo)以(yi)鏈接(jie)器在(zai)鏈接(jie)可執行(xing)文件時,可以(yi)設定(ding)內存地址,而不用去管這些數據最(zui)終實(shi)際shi)哪詿嫻?罰 饈怯卸懶li)內存空間的好處

2.當(dang)不同的進程使用同樣的代(dai)碼(ma)時,比如庫(ku)文件中的代(dai)碼(ma),物理內存中可以(yi)只存儲一份這樣的代(dai)碼(ma),不同的進程只需要把(ba)自己的虛擬內存映射過(guo)去就可以(yi)了,節省(sheng)內存

3.在(zai)程序需要分配連續的內存空間的時候(hou),只需要在(zai)虛擬內存空間分配連續空間,而不需要實(shi)際物理內存的連續空間,可以(yi)利用碎片。

 

另外,事(shi)實(shi)上(shang),在(zai)每個進程創建加載(zai)時,內核只是為進程“創建”了虛擬內存的布局(ju),具體(ti)就是初始化進程控制表中內存相關的鏈表,實(shi)際上(shang)並不立(li)即(ji)就把(ba)虛擬內存對應位置的程序數據和代(dai)碼(ma)(比如.text .data段)拷貝到物理內存中,只是建立(li)好虛擬內存和磁盤文件之間的映射就好(叫做存儲器映射),等(deng)到運(yun)行(xing)到對應的程序時,才會通(tong)過(guo)缺頁異常,來拷貝數據。還有進程運(yun)行(xing)過(guo)程中,要動態分配內存,比如malloc時,也只是分配了虛擬內存,即(ji)ci) 飪樾檳餑詿娑雜Φ囊潮硐鈄魷嚶ι柚茫 dang)進程真正訪問shi)醬聳菔保 乓?幣騁斐!/p>

 

補充理解︰

虛擬存儲器涉及三(san)個概念︰ 虛擬存儲空間,磁盤空間,內存空間

可以(yi)認為虛擬空間都被(bei)映射到了磁盤空間中,(事(shi)實(shi)上(shang)也是按需要映射到磁盤空間上(shang),通(tong)過(guo)mmap),並且(qie)由(you)頁表記錄映射位置,當(dang)訪問shi)僥掣齙?返(fan)氖焙hou),通(tong)過(guo)頁表中的有xing) 唬 梢yi)得知此數據是否(fu)在(zai)內存中,如果不是,則通(tong)過(guo)缺頁異常,將磁盤對應的數據拷貝到內存中,如果沒(mei)有空閑內存,則選擇犧牲(sheng)頁面,替換其他頁面。

 

mmap是用來建立(li)從虛擬空間到磁盤空間的映射的,可以(yi)將一個虛擬空間地址映射到一個磁盤文件上(shang),當(dang)不設置這個地址時,則由(you)shang)低匙遠 柚茫  fan)回對應的內存地址(虛擬地址),當(dang)訪問shou)飧齙?返(fan)氖焙hou),就需要把(ba)磁盤上(shang)的內容拷貝到內存了,然後就可以(yi)讀或者(zhe)寫(xie),最(zui)後通(tong)過(guo)manmap可以(yi)將內存上(shang)的數據換回到磁盤,也就是解除虛擬空間和內存空間的映射,這也是qie)恢zhong)讀寫(xie)磁盤文件的方(fang)法,也是qie)恢zhong)進程共享數據的方(fang)法 共享內存

微笑接(jie)下來ci)頤搶刺致巰攣錮砟詿媯/strong>

 

 

在(zai)內核態申(shen)請(qing)內存比在(zai)用mei)  shen)請(qing)內存要更為直接(jie),它沒(mei)有采用用mei)  侵zhong)延遲分配內存技術。內核認為一旦有內核函數申(shen)請(qing)內存,那麼就必須立(li)刻滿足(zu)該申(shen)請(qing)內存的請(qing)求(qiu),並且(qie)這個請(qing)求(qiu)一定(ding)是正確合理的。相反,對于用mei)  shen)請(qing)內存的請(qing)求(qiu),內核總是盡量延後分配物理內存,用mei)?套蓯竅然huo)得一個虛擬內存區的使用權,最(zui)終通(tong)過(guo)缺頁異常獲(huo)得一塊真正的物理內存。

1.物理內存的內核映射


IA32架構(gou)中內核虛擬地址空間只有1GB大小(xiao)(從3GB到4GB),因(yin)此可以(yi)直接(jie)將1GB大小(xiao)的物理內存(即(ji)常規(gui)內存)映射到內核地址空間,但超出1GB大小(xiao)的物理內存(即(ji)高端內存)就不能映射到內核空間。為此,內核采取了下面的方(fang)法使得內核可以(yi)使用所(suo)有的物理內存。


1).高端內存不能全部映射到內核空間,也就是說這些物理內存沒(mei)有對應的線性地址。不過(guo),內核為每個物理頁框(kuang)都分配了對應的頁框(kuang)描述(shu)符,所(suo)有的頁框(kuang)描述(shu)符都保存在(zai)mem_map數組(zu)中,因(yin)此每個頁框(kuang)描述(shu)符的線性地址都是固定(ding)存在(zai)的。內核此時可以(yi)使用alloc_pages()和alloc_page()來分配高端內存,因(yin)為這些函數返(fan)回頁框(kuang)描述(shu)符的線性地址。


2).內核地址空間的後128MB專門(men)用于映射高端內存,否(fu)則,沒(mei)有線性地址fan)母叨四詿娌荒鼙bei)內核所(suo)訪問sheng)U廡└叨四詿嫻哪諍擻成湎勻皇竊菔庇成淶模 fu)則也只能映射128MB的高端內存。當(dang)內核需要訪問高端內存時就臨時在(zai)這個區域進行(xing)地址映射,使用完畢xian) 笤zai)用來進行(xing)其他高端內存的映射。
由(you)于要進行(xing)高端內存的內核映射,因(yin)此直接(jie)能夠映射的物理內存大小(xiao)只有896MB,該值dang)4嬖zai)high_memory中xiao)D諍說?房佔淶南 緣?非淙縵巒妓suo)示︰

 


從圖中可以(yi)看出,內核采用了三(san)種(zhong)機制將高端內存映射到內核空間︰永久內核映射,固定(ding)映射和vmalloc機制。

2.物理內存管理機制
基于物理內存在(zai)內核空間中的映射原理,物理內存的管理方(fang)式也有所(suo)不同。內核中物理內存的管理機制主要有伙伴算法,slab高速(su)緩存和vmalloc機制。其中伙伴算法和slab高速(su)緩存都在(zai)物理內存映射區分配物理內存,而vmalloc機制則在(zai)高端內存映射區分配物理內存。
伙伴算法
伙伴算法負責大塊連續物理內存的分配和釋放,以(yi)頁框(kuang)為基本單位。該mei)瓶梢yi)避免外部碎片。
per-CPU頁框(kuang)高速(su)緩存
內核經常請(qing)求(qiu)和釋放單個頁框(kuang),該mei)捍姘bao)含預先分配的頁框(kuang),用于滿足(zu)本地CPU發出的單一頁框(kuang)請(qing)求(qiu)。
slab緩存
slab緩存負責小(xiao)塊物理內存的分配,並且(qie)它也作為高速(su)緩存,主要針對內核中經常分配並釋放的對象(xiang)。
vmalloc機制
vmalloc機制使得內核通(tong)過(guo)連續的線性地址來訪問非連續的物理頁框(kuang),這樣可以(yi)最(zui)大限度的使用高端物理內存。

3.物理內存的分配
內核發出內存申(shen)請(qing)的請(qing)求(qiu)時,根據內核函數調用接(jie)口將啟(qi)用不同的內存分配器。
3.1 分區頁框(kuang)分配器
分區頁框(kuang)分配器 (zoned page frame allocator) ,處理對連續頁框(kuang)的內存分配請(qing)求(qiu)。分區頁框(kuang)管理器分為兩(liang)大部分:前端的管理區分配器和伙伴系統,如下圖︰


管理區分配器負責搜索一個能滿足(zu)請(qing)求(qiu)頁框(kuang)塊大小(xiao)的管理區。在(zai)每個管理區中,具體(ti)的頁框(kuang)分配工作由(you)伙伴系統負責。為了達到更好的系統性能,單個頁框(kuang)的申(shen)請(qing)工作直接(jie)通(tong)過(guo)per-CPU頁框(kuang)高速(su)緩存完成。
該分配器通(tong)過(guo)幾(ji)個函數和宏來請(qing)求(qiu)頁框(kuang),它們之間的封裝關系deng)縵巒妓suo)示。


這些函數和宏將核心的分配函數__alloc_pages_nodemask()封裝,形成滿足(zu)不同分配需求(qiu)的分配函數。其中,alloc_pages()系列函數返(fan)回物理內存首(shou)頁框(kuang)描述(shu)符,__get_free_pages()系列函數返(fan)回內存的線性地址。
3.2 slab分配器
slab 分配器最(zui)初是為了解決物理內存的內部碎片而提出的,它將內核中常用的數據結構(gou)看做對象(xiang)。slab分配器為每一種(zhong)對象(xiang)建立(li)高速(su)緩存。內核對該對象(xiang)的分配和釋放均是在(zai)這塊高速(su)緩存中操(cao)作。一種(zhong)對象(xiang)的slab分配器結構(gou)圖如下︰


可以(yi)看到每種(zhong)對象(xiang)的高速(su)緩存是由(you)若(ruo)干個slab組(zu)成,每個slab是由(you)若(ruo)干個頁框(kuang)組(zu)成的。雖(sui)然slab分配器可以(yi)分配比單個頁框(kuang)更小(xiao)的內存塊,但它所(suo)需的所(suo)有內存都是通(tong)過(guo)伙伴算法分配的。
slab高速(su)緩存分專用mei)捍婧屯tong)用mei)捍妗Wㄓ沒(mei)捍媸嵌蘊囟ding)的對象(xiang),比如為內存描述(shu)符創建高速(su)緩存。通(tong)用mei)捍嬖蚴欽?砸話ban)情況,適合分配任意大小(xiao)的物理內存,其接(jie)口即(ji)ci)malloc()。
3.3 非連續內存區內存的分配
內核通(tong)過(guo)vmalloc()來申(shen)請(qing)非連續的物理內存,若(ruo)申(shen)請(qing)成功,該函數返(fan)回連續內存區的起始地址,否(fu)則,返(fan)回NULL。vmalloc()和kmalloc()申(shen)請(qing)的內存有所(suo)不同,kmalloc()所(suo)申(shen)請(qing)內存的線性地址與(yu)物理地址都是連續的,而vmalloc()所(suo)申(shen)請(qing)的內存線性地址連續而物理地址則是離散的,兩(liang)個地址之間通(tong)過(guo)內核頁表進行(xing)映射。
vmalloc()的工作方(fang)式理解起來很簡(jian)單︰
1).尋(xun)找(zhao)一個新(xin)的連續線性地址空間;
2).依次(ci)分配一組(zu)非連續的頁框(kuang);
3).為線性地址空間和非連續頁框(kuang)建立(li)映射關系,即(ji)修(xiu)改內核頁表;
vmalloc()的內存分配原理與(yu)用mei)  哪詿娣峙湎嗨疲 際峭tong)過(guo)連續的虛擬內存來訪問離散的物理內存,並且(qie)虛擬地址和物理地址之間是通(tong)過(guo)頁表進行(xing)連接(jie)的,通(tong)過(guo)這種(zhong)方(fang)式可以(yi)有xing)?氖褂夢錮砟詿妗5 怯Ω米 獾氖牽malloc()申(shen)請(qing)物理內存時是立(li)即(ji)分配的,因(yin)為內核認為這種(zhong)內存分配請(qing)求(qiu)是正當(dang)而且(qie)緊急的;相反,用mei)  心詿媲qing)求(qiu)時,內核總是盡可能的延後,畢竟用mei)  諍頌 輝zai)一個特權級。

【簡(jian)單命(ming)令演示】Linux下怎樣增加虛擬內存?

1、打(da)開終端,切(qie)換到root用mei)? 淙耄ree -m查看內存狀態
[root@lxt lxt]# free -m
total used free shared buffers cached
Mem: 498 357 141 0 27 162
-/+ buffers/cache: 167 331
Swap: 1023 0 1023


2、輸入df -B M(或df -m)查看各分區當(dang)前使用情況
[root@lxt lxt]# df -B M
文件系統 1M-塊 已用 可用 已用% 掛yi)zai)點
/dev/mapper/vg_lxt-lv_root
12875M 4059M 8162M 34% /
/dev/sda7 194M 14M 170M 8% /boot
tmpfs 250M 1M 249M 1% /dev/shm
(fdisk -l可查看磁盤分區情況)

3、選擇一個較大的分區,建立(li)分區文件︰
[root@lxt lxt]# dd if=/dev/zero of=/swapadd bs=1024 count=524288
524288+0 records in
524288+0 records out
536870912 bytes (537 MB) copied,13.0709 秒,41.1 MB/秒
以(yi)上(shang)命(ming)令在(zai)根目錄新(xin)建一個名為swapadd,大小(xiao)為512M的虛擬內存文件

4、移動該文件到空間較大的其他分區︰
[root@lxt lxt]# mkdir /mnt/swap
[root@lxt /]# mv swapadd /mnt/swap

5、執行(xing)以(yi)下命(ming)令啟(qi)用虛擬內存並重啟(qi)電腦
[root@lxt /]# mkswap /mnt/swap/swapadd
Setting up swapspace version 1, size = 524284 KiB
no label, UUID=a5c8b651-6f64-4414-bb5f-580b742acfce
[root@lxt /]# swapon /mnt/swap/swapadd
查看內存︰
[root@lxt /]# free -m
total used free shared buffers cached
Mem: 498 492 6 0 15 302
-/+ buffers/cache: 174 323
Swap: 1535 0 1535

6、如果不需要使用新(xin)增的虛擬內存,則輸入︰
swapoff -v /mnt/swap/swapadd

 

【作者(zhe)推薦(jian)】野狗 - 國內領先的實(shi)時後端雲 ︰ https://www.wilddog.com/

Tag標簽︰內存  物理  
  • 9福彩票官网

About IT165 - 廣(guang)告服務 - 隱私聲(sheng)明 - 版權申(shen)明 - 5分PK10官网免責條(tiao)款 - 網站地圖 - 網友(you)投稿 - 聯(lian)系方(fang)式
本站內容來自于互(hu)聯(lian)網,僅供用于網絡(luo)技術學(xue)習,學(xue)習中請(qing)遵循(xun)相關法律法規(gui)
9福彩票官网 | 下一页