1. 程式人生 > >一段程式的奇妙旅行

一段程式的奇妙旅行

神經質硬碟

我這個程式一直在硬碟上睡大覺,這個傳統的機械硬碟容量超大,但是卻非常脆弱。

每當他移動磁頭,讀取資料的時候,他就在那裡不斷祈禱:千萬別有什麼大的震動啊。

時間久了,他就變得神神叨叨的,這也不能怪他,因為他那鋁合金製成的碟片在高速旋轉,每分鐘要轉幾千甚至上萬圈,磁頭懸浮在碟片上方滑來滑去,經常需要在毫秒級的時間內滑到指定位置,磁頭和碟片之間的距離是以納米來計算的,實在是太近了,一不小心就會出錯。

多個碟片摞在一起(當然對應多個磁頭),被封裝在硬碟內,在一塵不染的環境內高速旋轉。

 

在碟片上塗著薄薄的一層磁性材料, 這些磁性材料像無數個小磁鐵,都有南極和北極。讓人驚奇的是,所有的資料,都是由這些“小磁鐵”來儲存。

硬碟最常做的事情就是用磁頭去讀寫這些“小磁鐵”,看看是南極(S)還是北極(N),由此來確定是0還是1。

所有的資料在硬碟中只能以二進位制的方式(0或者1)來儲存,包括我這段程式。

 

(圖片來源:https://www.computerhope.com/jargon/h/harddriv.htm,這是一種垂直的資料記錄方式,還有一種是水平的方式)

 

健忘症患者記憶體

整天窩在硬碟上實在是沒什麼意思,我挺期待出去走走,比如到記憶體去逛逛。 另外一段程式給我說:“你要小心,到了記憶體,你的儲存形式就要發生變化了。”

“什麼變化?”

“記憶體是個純電子的結構,沒有機械部分,又穩定又快!”

“這不挺好嘛!” 我說道。

“記憶體中就不是‘小磁鐵’了,他是由一個個電容+訪問電晶體組成。每個電容可以儲存1bit的資料,即0或者1。”

 

(來源: https://www.youtube.com/watch?v=PVad0c2cljo)

“太好了,我正好想去體驗下不同的人生!” 我說。

“你要小心,這些電容中的電荷過一段時間就會丟失,電勢不足,資料也就丟失了。因此記憶體得週期性地讀出、然後重寫來重新整理電容的電荷,這樣才能把資料給保持住。可悲的是這個重新整理的操作一直要持續到資料改變或者斷電。這就是為什麼記憶體被大家稱為‘健忘者’的原因。”

我絲毫不擔心,人類既然這麼設計,肯定能保證資料的完整性。

(碼農翻身注:RAM分為兩類,一類是靜態RAM,一類是動態RAM,前者不用重新整理就能儲存資料,但是造價高,只在快取記憶體中使用。)

 

CPU阿甘

終於有一天,CPU阿甘又對DMA控制器發出了指令,讓他從硬碟把我這個程式搬到記憶體。

他總是這樣,從來不親力親為,總是把任務交代給DMA以後,自己就忙著幹別的事情去了。

硬碟和記憶體剛開始還不理解,為什麼要這麼做呢?後來他們看到了阿甘那令人咂舌的運算速度,比記憶體快幾百倍,比硬碟快幾十萬倍。 他們倆就明白了,CPU阿甘如果等著他們去搬運資料,那得等好幾個月才行。

硬碟找到了我這段程式,判斷是南極還是北極,他們是 ......SNNSSSSN......,也就是......01100001......。

DMA控制器把它們搬進入了記憶體,我搖身一變,成為了電容中的電荷。

記憶體則開始辛辛苦苦,不斷地重新整理這些電容,防止資料丟失。

當然,我們這些二進位制資料不會在記憶體的電容中呆著不走,我們馬上就通過匯流排奔向下一個目的地:顯示卡。

 

顯示卡

第一次來到顯示卡這裡,我發現簡直就是一個獨立的王國:有自己的GPU, 視訊記憶體,甚至還有一個BIOS。

就拿GPU來說吧,居然像阿甘一樣配備了高階裝備:風扇! 足能顯出其高貴的地位。 這也沒辦法,人家要渲染圖形影象,必須執行復雜的數學和幾何運算,發熱量大嘛。

由於圖形影象不是一下子就能生成的,需要有個地方暫存資料,於是顯示卡就裝備了視訊記憶體。

如果顯示卡有獨立的視訊記憶體還行,有些整合的顯示卡居然和記憶體來爭奪地盤,記憶體還不得不劃出來一塊兒給他,實在是讓人無語。

對了,視訊記憶體中還有一塊區域叫做“幀緩衝區”,這是影象傳輸的一個關鍵區域,顯示卡所生成的一幀畫面會先被寫入幀緩衝區。而一臺 72Hz 的顯示器每秒能夠顯示 72 幅畫面,也就是說每 1/72 秒(當顯示器重新整理完一幅畫面時),顯示卡就需要把緩衝區的內容通過特定介面發給顯示器。

如果介面是數字訊號,那就比較簡單,直接把視訊記憶體的資料輸出即可。

如果介面不幸是模擬的(比如VGA),那顯示卡還需要完成一個額外的步驟:數模轉換。

我比較好奇,問道:“為什麼要做數模轉換?”

顯示卡說:“模擬訊號你懂不懂?不懂啊,舉個例子,假設顯示器所要求的電壓的變化是[100V ,200V],你不可能從100V一下子跳到200V吧,肯定是連續變化的,這就是模擬的訊號。我們整天面對的都是0和1,都是數字訊號。肯定需要做數字<->模擬轉換才行啊。”

顯示卡一邊說,一邊把我這段程式轉化成了幀緩衝區的資料,然後進行數模轉換,向顯示器傳送了出去。

最後,顯示器把我展示給了程式設計師: