Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 久久成人国产,91精品网站,欧美性精品不卡在线观看

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Linux中內(nèi)存管理詳解

          來源:

          https://blog.csdn.net/qq_40276626/article/details/120477263

          Linux中內(nèi)存管理

          內(nèi)存管理的主要工作就是對物理內(nèi)存進(jìn)行組織,然后對物理內(nèi)存的分配和回收。但是Linux引入了虛擬地址的概念。

          虛擬地址的作用

          如果用戶進(jìn)程直接操作物理地址會(huì)有以下的壞處:

          1、 用戶進(jìn)程可以直接操作內(nèi)核對應(yīng)的內(nèi)存,破壞內(nèi)核運(yùn)行。

          2、 用戶進(jìn)程也會(huì)破壞其他進(jìn)程的運(yùn)行

          CPU 中寄存器中存儲(chǔ)的是邏輯地址,需要進(jìn)行映射才能轉(zhuǎn)化為對應(yīng)的物理地址,然后獲取對應(yīng)的內(nèi)存。

          通過引入邏輯地址,每個(gè)進(jìn)程都擁有單獨(dú)的邏輯地址范圍。

          當(dāng)進(jìn)程申請內(nèi)存的時(shí)候,會(huì)為其分配邏輯地址和物理地址,并將邏輯地址和物理地址做一個(gè)映射。

          所以,Linux內(nèi)存管理涉及到了以下三個(gè)部分:

          1、物理內(nèi)存物理內(nèi)存的組織

          Linux 中內(nèi)存分為 3 個(gè)級別,從下到上依次為:

          1>、Page: 一個(gè) page 的大小為 4k, Page 是內(nèi)存的一個(gè)最基本的單位。

          2>、Zone: Zone 中提供了多個(gè)隊(duì)列來管理 page。

          Zone分為 3 種

          2.1、 :用來存放 DMA 讀取 IO 設(shè)備的數(shù)據(jù),內(nèi)核專用

          2.2、 :用來存放內(nèi)核的相關(guān)數(shù)據(jù),內(nèi)核專用

          2.3、 :高端內(nèi)存,用來存放用戶進(jìn)程數(shù)據(jù)

          3>、Node 節(jié)點(diǎn),一個(gè) CPU 對應(yīng)著一個(gè) Node,一個(gè) Node 包括一個(gè) 、 、。

          同時(shí)當(dāng)一個(gè) CPU 對應(yīng)的內(nèi)存用光后,可以申請其他 CPU 對應(yīng)的內(nèi)存。

          管理加載項(xiàng)不可用_管理加載項(xiàng)未顯示加載控件_管理和加載項(xiàng)沒有

          物理內(nèi)存的分配

          Linux將內(nèi)存分配分為兩種:

          1>、大內(nèi)存

          大內(nèi)存 利用伙伴系統(tǒng) 分配。

          管理加載項(xiàng)不可用_管理和加載項(xiàng)沒有_管理加載項(xiàng)未顯示加載控件

          伙伴系統(tǒng)的做法是將 ZONE 中的 Page 分組,然后組裝為多個(gè)鏈表。鏈表中存放的是 頁塊 的集合。頁塊對應(yīng)著有不同的大小,分別為 1、2、4、8 … 1024個(gè)頁。

          當(dāng)請求 (2i-1 ,2i] 大小的 page 的時(shí)候,會(huì)直接請求 2i 個(gè)頁, 如果對應(yīng)的鏈表中有對應(yīng)的頁塊,就直接分配。如果對應(yīng)的鏈表沒有,就往上找 2i+1,如果 2i+1 存在,就將其分為 2 個(gè) 2i 頁塊,將其中 1 個(gè) 2i 加入到對應(yīng)的鏈表中,將另外一個(gè)分配出去。

          例如,要請求一個(gè) 128 個(gè)頁的頁塊時(shí),先檢查 128 個(gè)頁的頁塊鏈表是否有空閑塊。如果沒有,則查 256 個(gè)

          的頁塊鏈表;如果有空閑塊的話,則將 256 個(gè)頁的頁塊分成兩份,一份使用,一份插入 128 個(gè)頁的頁塊鏈表中。如果還是沒有,就查 512 個(gè)頁的頁塊鏈表;如果有的話,就分裂為 128、128、256 三個(gè)頁塊,一個(gè) 128 的使用,剩余兩個(gè)插入對應(yīng)頁塊鏈表。

          2>、小內(nèi)存分配

          小內(nèi)存分配利用 slub 分配,比如對象等數(shù)據(jù) slub 就是 將幾個(gè)頁單獨(dú)拎出來作為緩存,里面維護(hù)了鏈表。每次直接從鏈表中獲取對應(yīng)的內(nèi)存,用完之后也不用清空,就直接掛到鏈表上,然后等待下次利用。

          管理和加載項(xiàng)沒有_管理加載項(xiàng)未顯示加載控件_管理加載項(xiàng)不可用

          2、如何組織虛擬地址

          虛擬地址對應(yīng)的是虛擬空間,虛擬空間只不過是一個(gè)虛擬地址的集合,用來映射物理內(nèi)存。

          管理加載項(xiàng)不可用_管理加載項(xiàng)未顯示加載控件_管理和加載項(xiàng)沒有

          管理和加載項(xiàng)沒有_管理加載項(xiàng)不可用_管理加載項(xiàng)未顯示加載控件

          虛擬空間分為 用戶態(tài) 和 內(nèi)核態(tài) 。

          32位系統(tǒng)中 將虛擬空間按照 1:3 的比例分配給 內(nèi)核態(tài) 和 用戶態(tài)。

          64位系統(tǒng)中 分別給 內(nèi)核態(tài) 和 用戶態(tài) 分配了 128T。

          用戶態(tài)結(jié)構(gòu)

          管理和加載項(xiàng)沒有_管理加載項(xiàng)未顯示加載控件_管理加載項(xiàng)不可用

          每個(gè)進(jìn)程 都會(huì) 對應(yīng)一個(gè) 用戶態(tài)虛擬空間, 里面存放了 Text(代碼)的內(nèi)存虛擬地址范圍、 Data(數(shù)據(jù))的內(nèi)存虛擬地址范圍、BSS(全局變量)的內(nèi)存虛擬地址范圍、堆的虛擬地址范圍、棧的虛擬地址范圍,以及mmap 內(nèi)存映射區(qū)。

          其中 mmap 用于申請動(dòng)態(tài)內(nèi)存的時(shí)候的映射,堆和棧都是動(dòng)態(tài)變化的。

          一個(gè)進(jìn)程對應(yīng)的用戶態(tài)中的 各個(gè)方面的虛擬地址信息都通過一個(gè) struct 來存儲(chǔ)在內(nèi)存中,當(dāng)創(chuàng)建進(jìn)程的時(shí)候會(huì)為其分配內(nèi)存存儲(chǔ)對應(yīng)的虛擬地址信息。

          內(nèi)核態(tài)結(jié)構(gòu)

          管理加載項(xiàng)未顯示加載控件_管理加載項(xiàng)不可用_管理和加載項(xiàng)沒有

          Linux 的內(nèi)核程序共用一個(gè)內(nèi)核態(tài)虛擬空間。其中分為了以下幾部分:

          1、直接映射區(qū)

          896M,內(nèi)核空間直接映射到對應(yīng)的和中。為什么叫做直接映射呢?邏輯地址 直接 減去對應(yīng)的差值就可以得到對應(yīng)的物理地址。固定死了。

          2、動(dòng)態(tài)映射

          為什么要引入動(dòng)態(tài)映射呢?因?yàn)樗形锢韮?nèi)存的分配都需要內(nèi)核程序進(jìn)行申請,用戶進(jìn)程沒有這個(gè)權(quán)限。所以內(nèi)核空間一定要能映射到所有的物理內(nèi)存地址。

          那么如果都采用直接映射的話,1G大小邏輯地址的內(nèi)核空間只能映射1G大小的物理內(nèi)存。

          所以引入了動(dòng)態(tài)映射,動(dòng)態(tài)映射就是 內(nèi)核空間的邏輯地址可以映射到 物理內(nèi)存中的(高端內(nèi)存)中的任何一個(gè)地址,并且在對應(yīng)的物理內(nèi)存使用完之后,可以再映射其他物理內(nèi)存地址。

          動(dòng)態(tài)映射分為三種:

          1>、動(dòng)態(tài)內(nèi)存映射: 使用完對應(yīng)的物理內(nèi)存后,就可以映射其他物理內(nèi)存了。

          2>、永久內(nèi)存映射: 一個(gè)虛擬地址只能映射一個(gè)物理地址。如果需要映射其他物理地址,需要解綁。

          3>、固定內(nèi)存映射: 只能被某些特定的函數(shù)來調(diào)用引用物理地址。

          動(dòng)態(tài)內(nèi)存映射和直接映射的區(qū)別

          動(dòng)態(tài)映射和直接映射的區(qū)別就是邏輯地址到物理地址的轉(zhuǎn)化規(guī)則。

          直接映射

          直接映射的規(guī)則是死的,一個(gè)邏輯地址對應(yīng)的物理地址是固定的。通過邏輯地址加或者減去一個(gè)數(shù),就可以得到對應(yīng)的物理地址。

          動(dòng)態(tài)映射

          動(dòng)態(tài)映射是動(dòng)態(tài)的綁定,每個(gè)邏輯地址對應(yīng)的物理地址是動(dòng)態(tài)的,通過頁表進(jìn)行查詢。

          用戶空間映射:

          用戶空間采用動(dòng)態(tài)映射,每個(gè)虛擬地址可以被映射到一個(gè)物理地址,映射到。

          為什么用戶空間不采用直接映射呢?

          因?yàn)槲锢韮?nèi)存是多個(gè)進(jìn)程所有的,每個(gè)進(jìn)程都有一個(gè)用戶空間。如果采用直接映射的話,對應(yīng)的物理地址是會(huì)沖突的。其用戶空間的邏輯地址大小都為 3G,所以存在邏輯地址相同,但是對應(yīng)的物理地址不同。需要通過頁表來轉(zhuǎn)化,一個(gè)進(jìn)程會(huì)對應(yīng)一個(gè)頁表。

          3、如何將虛擬地址映射到物理內(nèi)存

          虛擬地址通過 頁表 將 虛擬地址 轉(zhuǎn)化為 物理地址,每個(gè)進(jìn)程都對應(yīng)著一個(gè)頁表,內(nèi)核只有一個(gè)頁表。

          虛擬空間 和 物理內(nèi)存 都按照 4k 來分頁,一個(gè)虛擬空間中的頁 和 物理內(nèi)存中頁 是 一一對應(yīng)的。

          管理加載項(xiàng)不可用_管理加載項(xiàng)未顯示加載控件_管理和加載項(xiàng)沒有

          頁表映射

          管理和加載項(xiàng)沒有_管理加載項(xiàng)不可用_管理加載項(xiàng)未顯示加載控件

          如上圖所示,將虛擬地址中的頁號 通過頁表轉(zhuǎn)化為 對應(yīng)的物理頁號,然后通過頁內(nèi)偏移量 就可以得到對應(yīng)的 物理地址了。

          管理和加載項(xiàng)沒有_管理加載項(xiàng)未顯示加載控件_管理加載項(xiàng)不可用

          但是 1 個(gè)進(jìn)程就需要一個(gè)頁表,一個(gè) 4G 的內(nèi)存條,就需要 1M 個(gè)頁表記錄來描述,假如 1 個(gè) 頁表記錄需要 4個(gè)字節(jié),那么就需要 4MB。而且頁表記錄是通過下標(biāo)來對應(yīng)的,通過虛擬頁號來乘以對應(yīng)的頁表項(xiàng)大小來計(jì)算得到對應(yīng)的地址的。

          所以 Linux 將 4M 分為 1K 個(gè) 4K, 一個(gè) 4K 對應(yīng)著一個(gè) page,用來存儲(chǔ)對應(yīng)的真正的頁表記錄。將 1K 個(gè) page 分開存放,就不要求連續(xù)的 4M 了。

          如果將 4M 分成 1K 個(gè)離散的 page 的話,怎么虛擬地址對應(yīng)的頁表號呢?

          利用指針,存儲(chǔ) 1K 個(gè)地址,分別指向這 1K 個(gè) page, 地址的大小為 4 個(gè)字節(jié),也就是32位,完全可以表示整個(gè)內(nèi)存的地址范圍。

          1K * 4個(gè)字節(jié),正好是一個(gè) page 4k,所以 也就是利用 1 個(gè) page來存儲(chǔ)對應(yīng)的頁表記錄索引。

          所以 我們的虛擬地址尋找過程如下:

          1>、找到對應(yīng)的頁表記錄索引位置,因?yàn)橛?1K 個(gè)索引,所以用 10 位就可以表示了

          2>、通過索引可以找到對應(yīng)的真正的頁表地址,對應(yīng)的有 1K 個(gè)頁表記錄,所以用 10 位就可以表示了

          3>、1個(gè)頁有 4K,通過 12 位就可以表示其頁內(nèi)偏移量了。

          所以虛擬地址被分為了三部分:

          1>、10位 表示索引偏移

          2>、10位 表示頁表記錄偏移

          3>、 12位 表示頁內(nèi)偏移

          雖然這種方式增加了索引項(xiàng),進(jìn)一步增加了內(nèi)存,但是減少了連續(xù)內(nèi)存的使用,通過離散的內(nèi)存就可以存儲(chǔ)頁表。

          這是對于32位系統(tǒng),而 64 位系統(tǒng)采用了5級頁表。

          管理和加載項(xiàng)沒有_管理加載項(xiàng)不可用_管理加載項(xiàng)未顯示加載控件

          映射流程圖

          管理加載項(xiàng)不可用_管理加載項(xiàng)未顯示加載控件_管理和加載項(xiàng)沒有

          用戶態(tài)申請內(nèi)存時(shí),只會(huì)申請對應(yīng)的虛擬地址,不會(huì)直接為其分配物理內(nèi)存,而是等到真正訪問內(nèi)存的時(shí)候,產(chǎn)生缺頁中斷,然后內(nèi)核才會(huì)為其分配,然后為其建立映射,也就是建立對應(yīng)的頁表項(xiàng)。

          TLB

          TLB 就是一個(gè)緩存,放在 CPU 中。用來將虛擬地址和對應(yīng)的物理地址進(jìn)行緩存。當(dāng)查詢對應(yīng)的物理地址的時(shí)候,首先查詢 TLB,如果TLB中存在對應(yīng)的記錄,就直接返回。如果不存在,就再去查詢頁表。

          虛擬內(nèi)存

          虛擬內(nèi)存 指的是 將硬盤中劃出一段 swap 分區(qū) 當(dāng)作 虛擬的內(nèi)存,用來存放內(nèi)存中暫時(shí)用不到的內(nèi)存頁,等到需要的時(shí)候再從 swap 分區(qū)中 將對應(yīng)的內(nèi)存頁調(diào)入到 內(nèi)存中。硬盤此時(shí)相當(dāng)于一個(gè)虛擬的內(nèi)存。

          從邏輯上能夠運(yùn)行更大內(nèi)存的程序,因?yàn)槌绦蜻\(yùn)行的時(shí)候并不需要把所有數(shù)據(jù)都加載到內(nèi)存中,只需要將當(dāng)前運(yùn)行必要的相關(guān)程序和數(shù)據(jù)加載到內(nèi)存中就可以了,當(dāng)需要其他數(shù)據(jù)和程序的時(shí)候,再將其調(diào)入。

          相較于真正的內(nèi)存加載,虛擬內(nèi)存需要將數(shù)據(jù)在內(nèi)存和磁盤中不斷切換,這是一個(gè)耗時(shí)的操作,所以速度比不上真正的內(nèi)存加載。

          總結(jié)

          虛擬空間 和 物理內(nèi)存 都分為 內(nèi)核空間 和 用戶空間。

          虛擬地址需要通過頁表轉(zhuǎn)化為物理地址,然后才能訪問。

          用戶虛擬空間 只能映射 物理內(nèi)存中的用戶內(nèi)存,無法映射到物理內(nèi)存中的內(nèi)核內(nèi)存,也就是說,用戶進(jìn)程只能操作用戶內(nèi)存。

          內(nèi)核空間 只能被 內(nèi)核 申請使用,用戶進(jìn)程只能操作用戶空間的物理內(nèi)存和虛擬空間。

          當(dāng)用戶進(jìn)程 調(diào)用系統(tǒng)調(diào)用的時(shí)候,會(huì)將其對應(yīng)的代碼和數(shù)據(jù)運(yùn)行在內(nèi)核空間中。

          所以當(dāng)調(diào)用 內(nèi)核空間 讀取文件或者網(wǎng)絡(luò)數(shù)據(jù)的時(shí)候,首先會(huì)將數(shù)據(jù)拷貝到內(nèi)存空間,然后在將數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間。因?yàn)?用戶進(jìn)程不能訪問內(nèi)核空間。


          主站蜘蛛池模板: 免费观看一区二区三区| 精品无码国产一区二区三区AV| 亚洲国产欧美日韩精品一区二区三区| 天美传媒一区二区三区| 日韩精品一区二区三区大桥未久 | 蜜臀AV免费一区二区三区| 色屁屁一区二区三区视频国产| 无码aⅴ精品一区二区三区浪潮| 国产精品一区二区三区高清在线| 精品无码国产一区二区三区AV| 日韩精品无码一区二区视频| 国产三级一区二区三区| 国产香蕉一区二区精品视频| 无码人妻精品一区二区三区在线 | 天堂va视频一区二区| 日韩内射美女人妻一区二区三区 | 精品国产福利第一区二区三区| 国产成人一区二区动漫精品| 精品国产鲁一鲁一区二区| 国产在线无码一区二区三区视频| 一区二区高清在线| 国产成人无码aa精品一区| 欧美日韩国产免费一区二区三区 | 亚洲精品无码一区二区| 亚洲一区二区电影| 国产精品丝袜一区二区三区| 久久精品一区二区三区中文字幕 | 欧美日韩国产免费一区二区三区| 色婷婷综合久久久久中文一区二区 | 麻豆一区二区免费播放网站| 人妻无码一区二区三区免费| 久久久久无码国产精品一区 | 日本不卡一区二区三区| 国产在线精品一区二区中文| 伦理一区二区三区| 激情综合一区二区三区| 亚洲日本一区二区三区在线| 又硬又粗又大一区二区三区视频| 成人精品视频一区二区三区不卡| 国产在线精品一区二区高清不卡 | 亚洲AⅤ无码一区二区三区在线|