對於程式設計師,那些既陌生又熟悉的計算機硬體

架構師修行之路發表於2020-05-17

程式設計師一步入中年,不知不覺便會被鋪天蓋地的“危機感”上身,曾經的那個少年已經不在,時間就是這樣公平。就算你能發明c語言,隨著時間的推移,你註定還是要成為慢慢變蔫的茄子,緩緩變黑的葡萄。

看著樂視退市的訊息,週末我趕緊拉著兒子的小手,複習起了大學那曾經考試”滿分“的計算機基礎,你別說,只讀了一小部分我就發現一個事實,記憶力果然指數級下降,兒子一遍就可以熟記,我卻衰退的就像沒上過大學。

原來程式設計師寫的程式實際上就是一個由0和1組成的位序列,或者說是位元序列,8個位元(bit)被分為一組,稱為位元組。系統中所有的資訊,包括網路傳送的資料,記憶體中的資料以及磁碟檔案,程式等,都是由一串位元(bit)表示的。如果你要問為什麼非要8個位元組呢?難道不會百度嗎?我又不是計算機發明者_。可能有一點非常重要,你可以拿去和麵試官吹水:一個同樣的位元組可能代表一個整數,浮點數,甚至字串,區分他們的唯一方法是這些資料的上下文資訊。

順便提一下,在計算機中數字的表示方式其實是對實際值的有限近似值,只不過一些高階語言對這些值處理的很好而已,不得不吐槽,JavaScript在處理這個問題上做的不是太好,不信你可以瀏覽器的F12 執行一下

0.1+0.2
0.30000000000000004
0.01 + 0.05
0.060000000000000005

言歸正傳,作為一個有著”程式碼改變世界“夢想的程式設計師,對自己手藝要精益求精,就必須瞭解你的真愛的物力構成。無論多diao的軟體都執行在硬體基礎之上,雖然近幾年硬體的發展速度比你衰老的速度還要快,但是核心內容幾乎沒變,這才是你真愛的裸妝。

CPU

先擼一下這個不成熟的百度百科

中央處理器(CPU,central processing unit)作為計算機系統的運算和控制核心,是資訊處理、程式執行的最終執行單元

說的直白一點,這個傢伙幾乎是軟體執行的核心,是解釋和執行指令的引擎。目前主流的cpu的核心是一個32位或者64位(未來還可能更大)長度的儲存裝置或者暫存器,被稱為程式計數器(PC,一個蛋疼的簡稱)。在任何時刻,程式計數器都指向記憶體中某條指令的地址。

CPU表面上是按照一個特定的模型去執行指令,這個模型由指令集的架構來決定的(每個架構型別都不一樣,所以才會有AMD,Intel)。自系統通電開始,直到系統斷電,CPU一直都在不斷的執行指令。如果沒有實際的軟體執行指令呢?拿windows來說,軟體層虛擬出來了一個“System Idle Process”程式,被稱為系統空閒程式,這個程式會告訴cpu掛起(停止工作),所以這個程式的cpu使用率和其他程式是相反的意思,它的使用率越高說明CPU的壓力越小。

CPU從程式計數器指向的記憶體地址讀取指令內容,並解釋該指令執行指令的操作,然後更新程式計數器,使他指向下一條指令,而這條指令很有可能和上條指令並非相鄰。簡單來說,cpu可能會頻繁的執行以下操作

  1. 資料載入:從主存複製一段資料到暫存器,以覆蓋暫存器中原來的內容。
  2. 資料儲存:把暫存器中的一段資料複製到主存的一個位置,以覆蓋主存原來位置上的內容。
  3. 指令操作:把兩個暫存器的內容複製到邏輯計算單元,邏輯計算單元會對這兩段資料做指令運算,並將結果儲存在一個暫存器中。
  4. 指令跳轉:從指令本身抽取一段內容並複製到程式計數器中,以覆蓋程式計數器中原來的值。
主存

老規矩,沒有百度不到的知識,一個沒有百度百科的名詞,說明不是很有名

主儲存器(Main memory),簡稱主存。是計算機硬體的一個重要部件,其作用是存放指令和資料,並能由中央處理器(CPU)直接隨機存取。現代計算機是為了提高效能,又能兼顧合理的造價,往往採用多級儲存體系。即由儲存容量小,存取速度高的高速緩衝儲存器,儲存容量和存取速度適中的主儲存器是必不可少的。主儲存器是按地址存放資訊的,存取速度一般與地址無關。

主存是一個臨時的儲存裝置,在程式被執行過程中用來臨時存放程式內容和處理結果。從物理來講,主存是由一組動態隨機存取儲存器晶片組成(你可以想象成一大排二極體),從邏輯上來講,主存是一個線性的位元組陣列,每個位元組都有一個唯一的地址,這些地址是從0開始的,現在主流的主存在個人計算機上已經是16G的大小,讓我這個還在用4G主存的老人無言以對呀。

輸入輸出裝置

當年計算機第一堂課,那個地中海的老師就講過這個概念,雖然具體內容現在已經和我的秀髮一併褪去,但是每天的工作中還是能偶爾看到IO這個詞。

IO(輸入輸出)是系統與外部世界的連線通道,像我們每天擼王者農藥的滑鼠鍵盤,釋放壓力看小電影的高清顯示器,儲存蒼老師的磁碟等等,這些都隸屬於輸入輸出裝置。

每個IO裝置都有一個控制器或者介面卡,它是和系統互動的途徑,一般都和IO匯流排連線。說直白一點,每個IO裝置都有它的驅動程式,要不然系統不可能無緣無故就能使用鍵盤滑鼠這些裝置的,即使現在的外設都是免驅的。

系統匯流排

匯流排是連線整個系統的橋樑,物理上是一組電子管道。他負責攜帶資訊位元組並在各個元件之間進行傳遞,就像我們軟體系統設計SOA中的匯流排。匯流排根據系統定義的位數來傳輸定長的資料,每個系統都不一樣,不過現在主流的長度要麼是四個位元組(32位),要麼是8個位元組(64位)。從這裡就可以聯想到,64位的系統在資料傳輸速度上要比32位的系統快一倍,也許將來很快會邁入128,256時代呢

如果非要加一張圖的話,此圖最有代表性
image

相關文章