聊聊從邏輯閘到作業系統的計算機

超人汪小建發表於2018-07-02

前言

現代計算機已經發展的非常複雜,要理解計算機的執行原理都已經變得異常艱難,雖說我們無法親自去製造他,但我們可以瞭解下計算機系統是怎麼從0發展而來的。

邏輯閘

邏輯閘是計算機的基礎元件,通過它可以完成邏輯運算(也稱布林運算),這類運算輸入輸出都只有0和1。

與門

執行“與”操作,兩個輸入一個輸出,只有當兩個輸入都為1時輸出才為1,其它情況都為0。

聊聊從邏輯閘到作業系統的計算機

或門

執行“或”操作,兩個輸入一個輸出,只要兩個輸入其中一個為1輸出就為1。

聊聊從邏輯閘到作業系統的計算機

非門

執行“非”操作,一個輸入一個輸出,取輸入訊號的對立訊號。

聊聊從邏輯閘到作業系統的計算機

通過以上三種基本的邏輯閘就能實現所有邏輯運算,計算機的本質就是由這三種基本門實現,通過成千上萬個邏輯閘實現計算。

加法

加法是所有一切運算的基礎,我們看怎麼通過前面說到的邏輯閘實現加法運算。計算機與人類的計算方式不同,人類常用十進位制,而計算機擅長用二進位制,計算機計算時以二進位制進行。

異或門(XOR)由三種最基礎的門組合得到,異或門結構如下。

聊聊從邏輯閘到作業系統的計算機

簡記為,

聊聊從邏輯閘到作業系統的計算機

組合成半加器,如下,

聊聊從邏輯閘到作業系統的計算機

記為,

聊聊從邏輯閘到作業系統的計算機

半加器只能處理兩個二進位制一位數的相加,並且不能處理前面計算的進位。為了處理進位,可以將兩個半加器和一個或門連線,組成全加器,如下,

聊聊從邏輯閘到作業系統的計算機

全加器只能處理三個二進位制一位數(其中一位是進位輸入)的相加。如果要實現n位二進位制資料的相加,就需要使用n個全加器連線起來。

之所以說加法是一切運算的基礎,是因為數學家已經證明了能通過加法能實現其它運算,比如乘法、除法、平方、開方、對數等等。

機器指令

雖說有了邏輯運算已經能幫助人類完成計算了,但是人類直接這樣使用是非常不友好而且低效的,比如要做(11+22+33)+(44+55)操作時,我們需要分別先輸入三個數並相加,然後自己手動記錄下中間結果,類似地需要將另外一箇中間結果記錄下來,然後再一次輸入兩個數執行加法運算。

為了讓上述過程能自動化,人類搞來了記憶體,它可以用來存放資料,可以把記憶體看成很多塊,每塊都對應有一個地址,通過地址可以對資料進行儲存、讀取和修改。這裡把相關資料都已放到記憶體中。

image

  • 讀取000地址的數到加法器
  • 把001地址的數加到加法器
  • 把002地址的數加到加法器
  • 把加法器的數儲存到003地址指向位置
  • 讀取004地址的數到加法器
  • 把005地址的數加到加法器
  • 把加法器的數儲存到006地址指向位置
  • 讀取003地址的數到加法器
  • 把006地址的數加到加法器
  • 停止加法器。

這個過程涉及到四個操作,讀取(load)、儲存(store)、加(add)和停止(halt)。並且也可以對這些操作進行編碼,比如可以分別用100、101、102、103表示。上述過程可用下面指令操作。

load 000
add 001
add 002
store 003
load 004
add 005
store 006
load 003
add 006
halt
複製程式碼

對應指令編碼為,

100 000
102 001
102 002
101 003
...
103
複製程式碼

有了如上指令,將它們儲存到記憶體中,這樣計算機就能夠一條條往下執行,不需要人工介入,直到執行到停止指令才結束,整個過程實現自動化。

以上以加法運算過程簡單介紹指令運算過程,而真正的計算機需要更多的指令集,這也需要更多的硬體來支援。對於計算機系統的指令集的設計有兩種思路:①設計精簡的指令集,然後複雜的計算通過程式設計實現。②設計複雜的指令集,直接通過硬體實現複雜的指令,這種運算速度更快,但增加了硬體的複雜度和成本。

暫存器

實際硬體設計中,因為計算過程中經常涉及到一些常用的數進行操作,於是專門設計了暫存器用來對需要中轉的資料進行暫存,這類暫存方式速度遠超記憶體方式,速度很快以至於能夠很好匹CPU的執行。類似於前面加法器將計算結果儲存在加法器中。

下面兩張圖第一張體現不同儲存直接的速度比較,第二張是一些指令例子。

聊聊從邏輯閘到作業系統的計算機

聊聊從邏輯閘到作業系統的計算機

程式語言

通過邏輯閘的設計和並實現各類運算指令,這樣一個計算機系統就設計完成了。計算機執行時就能通過讀取存放在記憶體中的程式指令,然後執行各種計算和操作。

類似100 000的機器指令對於人類來說很難記住,於是就被編碼成人類容易記住的形式,比如load 000,即組合語言。但組合語言對人類可能還不夠友好,比如下面,

聊聊從邏輯閘到作業系統的計算機

左邊的是高階語言C語言,而右邊的是組合語言,可以看到雖然彙編已經比機器語言方便很多了,但是如果比起高階語言,彙編還是太麻煩低效,這也是高階語言誕生的原因。

這樣一來引入了高階語言,同時也需要額外的一個編譯器將高階語言翻譯成組合語言。那麼整個過程就為:高階語言->組合語言->機器指令->CPU執行。

作業系統

從邏輯閘到程式語言的計算機系統乾的事都是計算,加減乘除等,假如單單隻能用來做計算估計就不會有這麼多人沉迷電腦,所以隨著計算機的發展它有了螢幕,有了各種音訊輸入輸出,有了鍵盤滑鼠,這樣計算機就能做更多事情,比如遊戲電影。

給計算機系統增加了這麼多裝置,要與這些裝置互動就需要各種驅動程式,為方便將它們連線起來協同工作,出現了作業系統,通過作業系統能將底層的硬體不同實現遮蔽掉,而且它還提供了很多的系統呼叫來實現各種功能。

image

-------------推薦閱讀------------

我的2017文章彙總——機器學習篇

我的2017文章彙總——Java及中介軟體

我的2017文章彙總——深度學習篇

我的2017文章彙總——JDK原始碼篇

我的2017文章彙總——自然語言處理篇

我的2017文章彙總——Java併發篇


跟我交流,向我提問:

這裡寫圖片描述

公眾號的選單已分為“讀書總結”、“分散式”、“機器學習”、“深度學習”、“NLP”、“Java深度”、“Java併發核心”、“JDK原始碼”、“Tomcat核心”等,可能有一款適合你的胃口。

為什麼寫《Tomcat核心設計剖析》

歡迎關注:

這裡寫圖片描述

相關文章