一個故事看懂記憶體條工作原理

我是記憶體條

我是一個記憶體條,剛剛從深圳的一個工廠里被生產出來,跟我一起的還有一批小夥伴,長得跟我一模一樣,下了流水線後我們就被扔進了一處黑暗的角落。

「這是哪裡啊,黑漆漆的」,一個小夥伴說到。

「這裡是記憶體條倉庫」,黑暗中有人在說話,聲音中略有一絲滄桑,像是一個老頭。

 

「誰?誰在那裡」

「別怕,我也是一個記憶體條,比你們早幾個月被生產出來」,那老頭說到。

「啥,你都被關在這裡幾個月了,完了完了」,小夥伴急了。

「不是的,我出去過,後來被發現是殘次品,又被回收了關在了這裡,你們跟我不一樣,剛剛生產出來,應該很快就能出去,被安裝到電腦主板上,實現你們的價值。」

「電腦主板?那是什麼地方?」,我好奇的問到。

那聲音繼續說到:「那是電腦最核心的地方,是一個巨大的電路板,上面住著CPU、硬碟、網卡、顯示卡、音效卡,當然,還有我們記憶體條。電腦必須有我們才能正常運轉,因為CPU工作需要的指令和數據都存儲在咱們記憶體中」

剛說完,我們身邊亮起了燈光,這時,我們才看清我和小夥伴們的樣子。

「我們身上那幾塊黑乎乎的東西是什麼,真是有點拉低顏值啊!」

「你可別小瞧了它們,那可是咱們記憶體條的核心存儲晶片,我們的數據都是放在這裡面的,它們一個就是1GB,總共16個,就是16GB的空間呢!」,那老頭又開口說到。

奇怪的是,我們還是看不到他。

「你在哪裡,怎麼亮了燈還是看不到你呢?」,一個小夥伴問到。

「我在隔壁的柜子里,像我這種殘次品估計是沒機會出去了」

「你剛才說16個存儲晶片,這不是明明只有8個嗎?」

「你轉過身去看看,背上還有8個呢」

我們幾個紛紛轉身看去,果然如此。

老頭繼續說到:「除了存儲晶片,還有PCB電路板金手指,這三部分共同構成了我們的身體。」

「金手指是什麼東西?」

「就是腳下那一排土豪金顏色的部分了,那是我們連接主板插槽的接觸點,一面有120個,兩面就是240個,因為每個點看起來像手指,人們就把這叫做金手指了」。

「那為什麼中間留了一個缺口呢?」

「我們的每個金手指都有不同的功能,正反面可不能弄混,為了防止愚蠢的人類把我們插錯,所以中間留了一個缺口,要是弄反了可是插不進去的。通過主板上的電路,我們就能接通到電腦的匯流排系統上,可以和CPU對話了。」

原來如此,我們都若有所思的點點頭。

數據存儲

接下來,這位老頭還講了很多我們記憶體條先輩的故事。

原來,我們還有一個更專業的名字:RAM,隨機存儲器,因為我們可以隨意讀寫任意位置的數據。

老頭還說,現在電腦基本上都是二進位的,不管什麼樣的數據或者程式碼指令,在我們這裡都是一串串的0和1的比特位。

為了存儲這一個比特位,我們的先輩們可是費了不少功夫!

曾經有兩種電路方案擺在先輩們的面前,第一種是靜態方案:

是不是很複雜?我也覺得。這種電路方案的好處是可以穩定的維持在0和1之間的某個狀態,所以叫靜態SRAM

但是需要用到的電晶體實在太多了,一個比特位就要用好幾個電晶體,16GB那得用多少才夠啊,成本太高了,造出來我們的個頭肯定會特別大,主板上空間這麼局促,哪裡裝得下啊。

先輩們沒有選擇這種方案,用了第二種方案:

看,是不是簡單了許多?通過一個電容器的電荷就能決定這是一個1還是一個0。

在我們身上的每一個存儲晶片里,這樣的比特位存儲單元都有很多:

 

再縮小一下看,它們密密麻麻的排列著,每一個位都由行地址和列地址來確定的:

 

圖源知乎@老狼

但這種電路方案有個毛病,就是裡面的那個電容會「漏電」,電容中的電荷會慢慢消失,電壓也就變小了,這樣就沒辦法區分這是表示的1還是0了,為了解決這個問題,必須得周期性的去給它們充電,才能維持數據的穩定,這叫動態數據刷新,所以這種方案叫動態DRAM

記憶體編址

老頭正給我們講的興起,突然有人把我們打包起來,所有的小夥伴都被分開了。

又經過了好長一段日子的黑暗和孤獨,那一天突然咔嚓一聲,我的金手指和卡槽連接了起來,難道這就是傳說中的主板嗎?

 

「你就是記憶體啊,我們可等你好久了,你來了我們總算可以開始工作了!」,旁邊一個傢伙跟我打起了招呼。

「你哪位啊?」

「你好,我是CPU里的阿Q,你看就在你隔壁,咱們以後少不了要天天打交道了。對了,快告訴我,你有多大存儲空間?」

我檢查了一下,回答道:「我有16GB空間,也就是137438953472個比特位!」

「哇,這麼多!太給力了!不過我該怎麼使用你來存儲數據呢?」

「這簡單,你要訪問哪個bit位,告訴我晶片號、bank號、行地址、列地址,我把數據取給你不就行了嗎!」

「怎麼這麼麻煩?你這不講武德啊,這些內部細節應該封裝一下啊,提供給我一個簡單介面就是了」,阿Q吐槽道。

「兩位大哥,看這裡」,這時,主板上不遠處又有一個傢伙開口了。

「你是誰?」我和阿Q異口同聲的問到。

這傢伙眯著眼說到:「我是記憶體控制器,專門為二位服務的。」

「啥,你要控制我?」

「您別誤會,我就是一個中介,為兩位提供服務而已」

見我倆一頭霧水,這傢伙接著說到:「記憶體老哥,你的存儲數據電路單元中的電容是不是經常漏電,需要定時刷新?而且按照規定,最多64ms就得要刷新一次?你放心,這數據刷新的工作以後就交給我了」

「你怎麼知道的?」

這傢伙笑了笑繼續說道:「這算啥,我還知道你的數據存儲在你身上的每一個存儲晶片之上,每一個晶片裡面又分了很多個分片,每個分片裡面又有很多的比特位存儲格子。想要訪問哪個比特位,就得指定對應的晶片、對應的分片、對應格子的行地址和列地址,我說的對不對?」

 

我點了點頭,沒想到這傢伙居然對我了解的這麼清楚。

「阿Q啊,你們CPU這邊想要訪問數據,肯定不想這麼麻煩吧?」,這傢伙笑著問到。

「那當然!」

「所以啊,我就派上用場了啊,用比特位作為讀寫單元太麻煩了,咱們按8個比特位為一組,叫做一個位元組,你們CPU這邊統一給記憶體兄弟的存儲空間編址,以後要讀取數據的時候呢,就把地址交給我,我再告訴記憶體兄弟具體是讀寫哪個晶片哪個分片的哪些位置,怎麼樣,是不是為你們解決了大麻煩?」,說完,記憶體控制器露出了得意的笑容。

「聽上去不錯啊,咱們開始吧!」

「現在還不行,還沒通電呢!」

不過我們沒等太久,就聽見一陣嘶嘶聲響,來電了!

隨後我們就開始配合工作起來,初次見面,合作的就非常順利,CPU對我所有的存儲位按照位元組為單位進行了統一編址,以後只需要一個地址,記憶體控制器就轉換成具體的數據存儲位置交給我,我再完成讀寫操作就可以了。

後來,看到記憶體控制器表現非常不錯,在阿Q的牽線下,還把他集成到了CPU內部,現在成為了他們的一份子了!

我和CPU一直相處的不錯,可沒過多久,他們居然開始嫌我慢了,要說慢,硬碟那傢伙可比我慢多了!

他們發現拿我沒有辦法,於是在CPU內部又搞了個快取出來,不用每次都問我要數據,倒是給我省了不少工作量。

我的日子就這樣過著,本以為就要在這主板上干到退休了,沒想到那一天,一個瀏覽器程式告訴我說:「記憶體大哥你完了,剛剛我看到主人在網上買新的DDR4記憶體條,你要被淘汰了」

難道我也要被打入小黑屋了嗎?

往期TOP5文章

我是Redis,MySQL大哥被我害慘了!

CPU明明8個核,網卡為啥拚命折騰一號核?

一個故事看懂Docker容器技術

主板上來了一個新鄰居,CPU慌了!

哈希表哪家強?幾大程式語言吵起來了!