請想一個問題,內核本身也是程序要在內存運行,用戶程序一樣也要在內存運行,大家都在一個窩里吃飯,你憑什么就管我了.好像內核程序是主子,用戶程序是奴才似的.
哎!其實用戶進程就是內核的一個個奴才,被捏的死死的.按不住奴才那這主子就不合格,就不是一個穩定系統.請想想實際內存就這么點大,如何滿足眾多用戶進程的需求?內核空間和用戶空間如何隔離? 如何防止訪問亂串? 如何分配/釋放,防止碎片化?空間不夠了又如何置換到硬盤?想想頭都大了。內核這當家的主子真是不容易,這些都是他要解決的問題, 但欲戴其冠,必承其重.
先說如果沒有內存管理會怎樣?
那就是個奴才們能把主子給活活踩死,想想主奴不分,吃喝拉撒睡都在一起,稱兄道弟的想干啥?沒規矩不成方圓嘛,這事業肯定搞不大,單片機時代就是這種情況.裸機編程,指針可以隨便亂飛,數據可以隨意覆蓋,沒有劃定邊界,沒有明確職責,沒有特權指令,沒有地址保護,你還想像java開發一樣,只管new內存,不去釋放,應用可以隨便崩但系統跑的妥妥的?想的美!直接系統死機,甚至開機都開不了,主板直接報廢了. 所以不能運行很復雜的程序,盡量可控,而且更是不可能支持應用的動態加載運行.隊伍大了就不好帶了,方法得換,游擊隊的做法不適合規模作戰,內存就需要管理了,而且是 5A級的嚴格管理。
內存管理在管什么?
簡單說就是給主子賦能,擁有超級權利,為什么就他有? 因為他先來,掌握了先機.它定好了游戲規則,你們來玩.有哪些游戲規則?
第一: 主奴有別,主子即是裁判又是運動員,主子有主子地方,奴才們有奴才們待的地方,主子可以在你的空間走來走去,但你只能在主人劃定的區域活動.奴才把自己玩崩了也只是奴才狗屁了,但主人和其他人還會是好好的.主子有所有特權,比如某個奴才太囂張了,就直接拖到午門問斬。
第二:奴奴有分,奴才們基本都是平等的,雖有高級和低級奴才區分,但本質都是奴才。奴才之間是不能隨意勾連,登門問客的,防止一塊搞政變. 他們都有屬于自己的活動空間,而且活動空間還巨大巨大,大到奴才們覺得整個紫荊城都是他們家的,給你這么大空間你干活才有動力,奴才們是鉚足了勁一個個盡情的表演各種劇本,有玩電子商務的,有玩游戲的,有搞直播的等等。。。不愧是紫荊城的主人很有一套,明明只有一個紫禁城,硬被他整出了N個紫荊城的感覺。而且這套駕奴本領還取了個很好聽的名字叫:虛擬內存。
看圖:
這是整個紫荊城的全貌圖,里面的內核虛擬空間是主人專用的,里面放的是主人的資料,數據,奴才永遠進不去,kernel heap也是給主人專用的動態內存空間,管理奴才和日常運作開銷很多時候需要動態申請內存,這個是專門用來提供給主人使用的。而所有奴才的空間都在叫用戶空間的那一塊。你沒看錯,是所有奴才的都在那。當然實際情況是用戶空間比圖中的大的多,因為主人其實用不了多少空間,大部分是留給奴才們干活用了,因為篇幅的限制筆者把用戶空間壓縮了下。再來看看奴才空間是啥樣的。看圖
這張圖是第一張圖的局部用戶空間放大圖。里面放的是奴才的私人用品,數據,task運行棧區,動態分配內存的堆區,堆區自下而上,棧區自上而下中間由映射區(L1,L2表)隔開。這么多奴才在里面不擠嗎?答案是:真不擠 。主人手眼通天,因為用了一個好幫手解決了這個問題,這個幫手名叫MMU(李大總管)
MMU是干什么事的?
看下某度對MMU定義:它是一種負責處理中央處理器(CPU)的內存訪問請求的計算機硬件。它的功能包括虛擬地址到物理地址的轉換(即虛擬內存管理)、內存保護、中央處理器高速緩存的控制。通過它的一番操作,把物理空間成倍成倍的放大,他們之間的映射關系存放在頁面中。
好像看懂又好像沒看懂是吧,到底是干啥的?其實就是個地址映射登記中心。記住這兩個字:映射 看下圖
物理內存可以理解為真實世界的紫禁城,虛擬內存就是被MMU虛擬出來的比物理頁面大的多的空間。舉例說明大概說明下過程:
有A(廚師),B(文藝青年)兩個奴才來到紫禁城,每個人都很有抱負,主子規定要先跑去登記處登記活動范圍,領回來一張表叫L1頁表,上面說了大半個紫禁城你可以跑動,都是你的,L1頁表記錄你每個房間的編號。其實奴才們的表都一樣,能跑的范圍也都一樣。 李大總管也有一張私人表叫TLB表,具體玩的呢,看個例子就明白了.
舉例說明
TLB表(李總管的私人表)
真實房間 | 當前誰在用 |
---|---|
7 | A |
8 | C |
9 | B |
李大總管的私人表叫TLB(translation lookaside buffer)可翻譯為“地址轉換后援緩沖器”,也可簡稱為“快表”。從TLB表可以看出,有三個真實的房間, 7,8,9,目前是分配給了A,B,C使用.
奴才們的L1頁表(當然可以有無數的奴才表,每個奴才人手一張)
虛擬房間 | 真實房間 | 作用 | |
---|---|---|---|
A奴才 | 1 | 7 | 廚房拿菜 |
A奴才 | 2 | 8 | 洗手間 |
A奴才 | 3 | 9 | 臥室 |
虛擬房間 | 真實房間 | 作用 | |
---|---|---|---|
B奴才 | 3 | 8 | 音樂室 |
B奴才 | 1 | 9 | 美術室 |
B奴才 | 2 | 7 | 武術室 |
奴才 | 動作1 | 動作2 | 動作3 | 動作4 |
---|---|---|---|---|
A | 廚房拿菜 | 臥室睡覺 | 上洗手間 | 無 |
B | 武術室 | 美術室 | 無 | 音樂室 |
第一: A要去1號間廚房拿菜,提交表給李總管,李總管拿表和自己的表對照,發現1號虛擬房間對應的是7號真實房間,7號剛好分配給了A用,蓋章同意.A拿到了自己菜.
真實房間 | 當前誰在用 |
---|---|
7 | A |
8 | C |
9 | B |
此時李總管的表沒變化. 第二: B要去2號間練武術,提交表給李總管,李總管拿表和自己的表對照,發現1號虛擬房間對應的是7號真實房間,7號是A在用,不屬于B,里面放的都還是菜呢,咋辦?簡單,把菜挪出去,把B奴才的武術設備裝進來,更改自己的表變成了
真實房間 | 當前誰在用 |
---|---|
7 | B |
8 | C |
9 | B |
此時李總管的表變了,三個真實房間B用了兩個了. 第三: A要去3號間睡覺了,又提交表給李總管,李總管拿表和自己的表對照,發現3號虛擬房間對應的是9號真實房間,9號剛好分配給了B用了,此時里面放的還是美術用品呢.咋辦?簡單,挪出去,把A奴才的睡覺設備裝進來,再更改自己的表變成了
真實房間 | 當前誰在用 |
---|---|
7 | B |
8 | C |
9 | A |
此時李總管的表變了,9號給了A了,而8號一直在C手里,因為過程中沒人用到了8號房.但繼續跑下去肯定會易主.
明白了嗎? 這就是映射的核心思想!對A,B來說,它們只認 1,2,3房間,記得自己的房間是干什么用的就行,完全不必知道背后的7,8,9是誰在用, 用房間之前提交表單就行了,后面的不用管. 而且各自1,2,3可以重新映射到不一樣的房間, A,B映射是完全獨立的,看清沒有它們的123對應的可不都是789的順序.
上面的1,2,3就叫虛擬地址,也叫線性地址. 而789就是物理地址. 如此只有三個房間都可以給很多很多的奴才使用,讓他們覺得這三個房間都是自己的. 完美!!! 當然AB也可以有自己虛擬地址789,例如
虛擬房間 | 真實房間 | 作用 | |
---|---|---|---|
A奴才 | 1 | 7 | 廚房拿菜 |
A奴才 | 2 | 8 | 洗手間 |
A奴才 | 3 | 9 | 臥室 |
A奴才 | 7 | 19 | 洗澡 |
A奴才 | 8 | 88 | 去皇上寢宮偷看 |
A奴才 | 9 | 45 | 御膳房 |
編輯:hfy
-
內存管理
+關注
關注
0文章
168瀏覽量
14134 -
鴻蒙系統
+關注
關注
183文章
2634瀏覽量
66308
發布評論請先 登錄
相關推薦
評論