一段程序的奇妙旅行
神經(jīng)質(zhì)硬盤
我這個(gè)程序一直在硬盤上睡大覺,這個(gè)傳統(tǒng)的機(jī)械硬盤容量超大,但是卻非常脆弱。
每當(dāng)他移動(dòng)磁頭,讀取數(shù)據(jù)的時(shí)候,他就在那里不斷祈禱:千萬(wàn)別有什么大的震動(dòng)啊。
時(shí)間久了,他就變得神神叨叨的,這也不能怪他,因?yàn)樗卿X合金制成的盤片在高速旋轉(zhuǎn),每分鐘要轉(zhuǎn)幾千甚至上萬(wàn)圈,磁頭懸浮在盤片上方滑來(lái)滑去,經(jīng)常需要在毫秒級(jí)的時(shí)間內(nèi)滑到指定位置,磁頭和盤片之間的距離是以納米來(lái)計(jì)算的,實(shí)在是太近了,一不小心就會(huì)出錯(cuò)。
多個(gè)盤片摞在一起(當(dāng)然對(duì)應(yīng)多個(gè)磁頭),被封裝在硬盤內(nèi),在一塵不染的環(huán)境內(nèi)高速旋轉(zhuǎn)。
在盤片上涂著薄薄的一層磁性材料, 這些磁性材料像無(wú)數(shù)個(gè)小磁鐵,都有南極和北極。讓人驚奇的是,所有的數(shù)據(jù),都是由這些“小磁鐵”來(lái)存儲(chǔ)。
硬盤最常做的事情就是用磁頭去讀寫這些“小磁鐵”,看看是南極(S)還是北極(N),由此來(lái)確定是0還是1。
所有的數(shù)據(jù)在硬盤中只能以二進(jìn)制的方式(0或者1)來(lái)存儲(chǔ),包括我這段程序。
(圖片來(lái)源:https://www.computerhope.com/jargon/h/harddriv.htm,這是一種垂直的數(shù)據(jù)記錄方式,還有一種是水平的方式)
健忘癥患者內(nèi)存
整天窩在硬盤上實(shí)在是沒什么意思,我挺期待出去走走,比如到內(nèi)存去逛逛。 另外一段程序給我說(shuō):“你要小心,到了內(nèi)存,你的存儲(chǔ)形式就要發(fā)生變化了。”
“什么變化?”
“內(nèi)存是個(gè)純電子的結(jié)構(gòu),沒有機(jī)械部分,又穩(wěn)定又快!”
“這不挺好嘛!” 我說(shuō)道。
“內(nèi)存中就不是‘小磁鐵’了,他是由一個(gè)個(gè)電容+訪問晶體管組成。每個(gè)電容可以存儲(chǔ)1bit的數(shù)據(jù),即0或者1。”
(來(lái)源: https://www.youtube.com/watch?v=PVad0c2cljo)
“太好了,我正好想去體驗(yàn)下不同的人生!” 我說(shuō)。
“你要小心,這些電容中的電荷過(guò)一段時(shí)間就會(huì)丟失,電勢(shì)不足,數(shù)據(jù)也就丟失了。因此內(nèi)存得周期性地讀出、然后重寫來(lái)刷新電容的電荷,這樣才能把數(shù)據(jù)給保持住。可悲的是這個(gè)刷新的操作一直要持續(xù)到數(shù)據(jù)改變或者斷電。這就是為什么內(nèi)存被大家稱為‘健忘者’的原因。”
我絲毫不擔(dān)心,人類既然這么設(shè)計(jì),肯定能保證數(shù)據(jù)的完整性。
(碼農(nóng)翻身注:RAM分為兩類,一類是靜態(tài)RAM,一類是動(dòng)態(tài)RAM,前者不用刷新就能保存數(shù)據(jù),但是造價(jià)高,只在高速緩存中使用。)
CPU阿甘
終于有一天,CPU阿甘又對(duì)DMA控制器發(fā)出了指令,讓他從硬盤把我這個(gè)程序搬到內(nèi)存。
他總是這樣,從來(lái)不親力親為,總是把任務(wù)交代給DMA以后,自己就忙著干別的事情去了。
硬盤和內(nèi)存剛開始還不理解,為什么要這么做呢?后來(lái)他們看到了阿甘那令人咂舌的運(yùn)算速度,比內(nèi)存快幾百倍,比硬盤快幾十萬(wàn)倍。 他們倆就明白了,CPU阿甘如果等著他們?nèi)グ徇\(yùn)數(shù)據(jù),那得等好幾個(gè)月才行。
硬盤找到了我這段程序,判斷是南極還是北極,他們是 ......SNNSSSSN......,也就是......01100001......。
DMA控制器把它們搬進(jìn)入了內(nèi)存,我搖身一變,成為了電容中的電荷。
內(nèi)存則開始辛辛苦苦,不斷地刷新這些電容,防止數(shù)據(jù)丟失。
當(dāng)然,我們這些二進(jìn)制數(shù)據(jù)不會(huì)在內(nèi)存的電容中呆著不走,我們馬上就通過(guò)總線奔向下一個(gè)目的地:顯卡。
顯卡
***次來(lái)到顯卡這里,我發(fā)現(xiàn)簡(jiǎn)直就是一個(gè)獨(dú)立的王國(guó):有自己的GPU, 顯存,甚至還有一個(gè)BIOS。
就拿GPU來(lái)說(shuō)吧,居然像阿甘一樣配備了高級(jí)裝備:風(fēng)扇! 足能顯出其高貴的地位。 這也沒辦法,人家要渲染圖形圖像,必須執(zhí)行復(fù)雜的數(shù)學(xué)和幾何運(yùn)算,發(fā)熱量大嘛。
由于圖形圖像不是一下子就能生成的,需要有個(gè)地方暫存數(shù)據(jù),于是顯卡就裝備了顯存。
如果顯卡有獨(dú)立的顯存還行,有些集成的顯卡居然和內(nèi)存來(lái)爭(zhēng)奪地盤,內(nèi)存還不得不劃出來(lái)一塊兒給他,實(shí)在是讓人無(wú)語(yǔ)。
對(duì)了,顯存中還有一塊區(qū)域叫做“幀緩沖區(qū)”,這是圖像傳輸?shù)囊粋€(gè)關(guān)鍵區(qū)域,顯卡所生成的一幀畫面會(huì)先被寫入幀緩沖區(qū)。而一臺(tái) 72Hz 的顯示器每秒能夠顯示 72 幅畫面,也就是說(shuō)每 1/72 秒(當(dāng)顯示器刷新完一幅畫面時(shí)),顯卡就需要把緩沖區(qū)的內(nèi)容通過(guò)特定接口發(fā)給顯示器。
如果接口是數(shù)字信號(hào),那就比較簡(jiǎn)單,直接把顯存的數(shù)據(jù)輸出即可。
如果接口不幸是模擬的(比如VGA),那顯卡還需要完成一個(gè)額外的步驟:數(shù)模轉(zhuǎn)換。
我比較好奇,問道:“為什么要做數(shù)模轉(zhuǎn)換?”
顯卡說(shuō):“模擬信號(hào)你懂不懂?不懂啊,舉個(gè)例子,假設(shè)顯示器所要求的電壓的變化是[100V ,200V],你不可能從100V一下子跳到200V吧,肯定是連續(xù)變化的,這就是模擬的信號(hào)。我們整天面對(duì)的都是0和1,都是數(shù)字信號(hào)。肯定需要做數(shù)字<->模擬轉(zhuǎn)換才行啊。”
顯卡一邊說(shuō),一邊把我這段程序轉(zhuǎn)化成了幀緩沖區(qū)的數(shù)據(jù),然后進(jìn)行數(shù)模轉(zhuǎn)換,向顯示器發(fā)送了出去。
***,顯示器把我展示給了程序員:

【本文為51CTO專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)作者微信公眾號(hào)coderising獲取授權(quán)】