<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一個故事看懂 CPU 內(nèi)存管理技術(shù)

          共 2817字,需瀏覽 6分鐘

           ·

          2020-12-21 14:44

          來自:掘金,作者:Ruheng

          鏈接:https://juejin.im/post/6844903490595061767

          還記得我嗎,我是阿Q,CPU一號車間的那個阿Q。

          今天忙里偷閑,來到廠里地址翻譯部門轉(zhuǎn)轉(zhuǎn),負(fù)責(zé)這項工作的小黑正忙得滿頭大汗。

          看到我的到來,小黑指著旁邊的座椅示意讓我坐下。



          坐了好一會兒,小黑才從工位上忙完轉(zhuǎn)過身來,“實在不好意思阿Q,今天活太多,沒來得及招待你”

          “剛忙什么呢,看你滿頭大汗的”,我問道。

          “嗨,別提了,老是發(fā)現(xiàn)內(nèi)存頁面錯誤,不停地要通知操作系統(tǒng)那邊去處理,真是懷念以前啊,沒有這么多破事兒要管”,小黑嘆了口氣。





          我一聽來了興趣,“小黑你給我說說你們的工作唄,地址翻譯是怎么一回事兒,為什么懷念以前呢?”

          小黑調(diào)整了下坐姿,咕嚕咕嚕喝了幾口水說道,“這話說來可就話長了”

          接下來小黑開始給我講起了歷史故事······

          8086

          原來咱們的祖先叫8086,小黑還給我看了他的照片

          那是一個純真質(zhì)樸的年代,雖然工作性能不高,不過那個年代的程序都很簡單,我們的祖先一問世就成為了明星,稱得上那個時代的頂流了。

          看到照片中的那些金屬針腳了嗎?那是我們CPU和外界打交道的觸角,每一根都有不同的作用。


          通過這些觸角,CPU就可以跟內(nèi)存打交道,獲取指令和數(shù)據(jù),辛勤的干活啦。

          那個年代,條件比較差,能湊合的就湊合,能共用的就共用。這不,你看祖先CPU的地址總線針腳和數(shù)據(jù)總線針腳就共用了。

          祖先是一個16位的CPU,數(shù)據(jù)(Data)總線就有16位,一次性可以傳輸16個比特位。和地址(Address)總線湊合著一起共用,于是就取名AD0-AD15。

          不過祖先的地址總線卻不止16個,還多出了A16-A19整整4個呢!這樣有20個地址線,可以尋址1MB的內(nèi)存了!

          但是祖先的寄存器都是16位的啊,只能存放16位的地址。不過他們很聰明,發(fā)明了一個叫分段式存儲管理的方法,把內(nèi)存劃分為最大64KB的小塊,為什么是64KB呢,因為16位地址最多只能尋址這么大了。然后又加了幾個叫做段寄存器的東西,指向這些塊的開頭,這樣,通過段地址+段內(nèi)偏移地址的方式,就能訪問更多的內(nèi)存了。



          32位時代

          后來啊,祖先的那點計算能力越來越捉襟見肘,實在是跟不上時代了。家族中的年輕一代開始挑大梁,80286和80386CPU相繼問世,尤其是80386,成為了劃時代的存在。





          到了80386時代,我們與外界通信的引腳就更多了,并且變成了32位的CPU,那個時候,生活條件就變好了,地址線和數(shù)據(jù)線再也不用共享引腳了。





          后來,人類變得越來越貪心,想要一邊聽音樂,一邊還要上網(wǎng),同時還要編輯文檔,這就同時需要運行多個程序。

          這個時候,有人發(fā)現(xiàn)了商機,開發(fā)了一個叫操作系統(tǒng)的東西,原來那些程序不再直接和我們CPU打交道了,而是和操作系統(tǒng)打交道,操作系統(tǒng)再和我們打交道,中間商賺差價說的就是他們!

          操作系統(tǒng)這玩意兒很聰明啊,通過時間片劃分讓我們CPU來輪流執(zhí)行多個程序,一會兒讓我們執(zhí)行音樂播放,一會兒讓我們執(zhí)行瀏覽器程序,一會兒又讓我們執(zhí)行文檔編輯程序。我們是無所謂啊,給什么代碼不是代碼啊,我們不挑,埋頭苦干就是了。人類的反應(yīng)速度跟我們就差得遠(yuǎn)了,他們還以為這些程序真的是同時執(zhí)行的呢。

          虛擬內(nèi)存

          不過隨之而來出現(xiàn)了一個大問題,這么多程序都要運行,大家擠在一個內(nèi)存里,經(jīng)常發(fā)生摩擦,沖突不斷。





          先祖?zhèn)優(yōu)榱舜耸職椌邞],終于想出了一個好辦法,一直沿用至今。

          他們提出了一個虛擬地址的東西,所有程序使用的地址都是一個虛擬的地址,在真正和內(nèi)存打交道的時候,咱們CPU內(nèi)部工作人員再給翻譯成真實的內(nèi)存地址,關(guān)于這事兒,內(nèi)存那家伙一直被我們蒙在鼓里。



          這樣一來,每個程序都可以用的是0x00000000到0xffffffff總共4GB這么大范圍的地址空間,當(dāng)然不會真的給他們那么多空間,內(nèi)存那家伙總共才4GB呢,而是要按需申請分配。分配的單元是按照來進(jìn)行的,32位的CPU一個頁是4KB。這些分配管理的累活就讓操作系統(tǒng)來干了,中間商不能光拿好處不干正事,至于我們CPU,做好地址翻譯的工作就好了。


          為此,在我們寄存器內(nèi)部專門添置了一個新的寄存器CR3,用來指向一個地址翻譯查詢字典,字典劃分了兩級目錄。我們把一個32位的地址劃分了3部分,前面兩部分分別指向兩級目錄中的條目,用來定位這個地址在物理內(nèi)存的哪個頁面,最后一部分就是指向物理內(nèi)存頁面的偏移,這樣就完成了地址的翻譯工作。

          每個進(jìn)程有不同的地址空間,切換進(jìn)程的時候,把CR3的內(nèi)容換一下就使用新進(jìn)程的翻譯字典,特別的方便。

          我們把這種內(nèi)存管理方式叫做分頁式內(nèi)存管理

          真佩服先祖?zhèn)兊闹腔?,這樣巧妙的把各個程序隔離開來,后來我們把這種工作模式叫做保護(hù)模式,把之前那種直接使用真實內(nèi)存地址的工作模式叫做實地址模式。

          分頁交換

          人類變得越來越貪婪,程序變得越來越多,對內(nèi)存的需求也越來越大。隨著這些程序都不斷申請內(nèi)存頁面,內(nèi)存空間很快就要耗盡了。

          我們看在眼里,急在心里,后來找操作系統(tǒng)協(xié)商,看看這問題該怎么辦。





          操作系統(tǒng)那家伙也不賴,想出了一個好辦法。內(nèi)存的大小有限,但是硬盤給力啊,硬盤空間大的多,去硬盤上劃一塊區(qū)域來,把內(nèi)存里長時間沒有用到的頁面給換到這塊區(qū)域里去,然后做個標(biāo)記。如果后面誰要訪問那個頁面,咱們CPU就檢查如果有這個標(biāo)記,就發(fā)送一個頁錯誤的中斷信號告訴操作系統(tǒng)去把這個頁面換回來。

          通過我們之間的配合,解決了內(nèi)存緊張的危機。后來我們把這個技術(shù)叫做內(nèi)存分頁交換。

          現(xiàn)在

          時間過得很快,到了我們這一輩,內(nèi)存變得更大了,16GB都是小case,32GB也很常見。

          除了內(nèi)存,我們CPU本身也更先進(jìn)了,別的不說,你光看看咱們現(xiàn)在的引腳數(shù)那比先祖?zhèn)兡菐纵吘筒豢赏斩Z。





          我們不僅從32位變成了64位,還從單核變成了多核,像我所在的CPU就有8個車間,8核并行執(zhí)行,比起先祖那個年代簡直有云泥之別。

          彩蛋

          和小黑閑談間,我們車間的老K突然出現(xiàn)在了門口。
          “阿Q原來你在這里,讓我好找,趕快回去吧,隔壁二號車間的虎子說我們改了他們的數(shù)據(jù),上門來鬧事了······”

          良許個人微信


          添加良許個人微信即送3套程序員必讀資料


          → 精選技術(shù)資料共享

          → 高手如云交流社群





          本公眾號全部博文已整理成一個目錄,請在公眾號里回復(fù)「m」獲?。?/span>

          推薦閱讀:

          curl 的用法指南

          M1 Mac 能安裝 Ubuntu 和 Linux 了 ??

          漫畫 | 一臺Linux服務(wù)器最多能支撐多少個TCP連接?


          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機,樹莓派,等等。在公眾號內(nèi)回復(fù)「1024」,即可免費獲取??!


          瀏覽 47
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  夜夜操美女 | 久久久久久久成人无码 | 日本黄色片在线观看 | 娱乐青红色AV | 日韩人妻无码专区 |