- 計算機系統解密:從理解計算機到編寫高效代碼
- (美)喬納森·E.斯坦哈特
- 4610字
- 2021-09-27 16:57:00
2.1 數字計算機的案例
我們先來看看現代之前的一些基于齒輪的機械計算裝置。當兩個齒輪嚙合在一起時,兩個齒輪的齒數比決定了它們的相對速度,這使得它們在乘法、除法等計算中非常有用。安提凱希拉機械裝置就是一個基于齒輪的機械裝置,它是已知的最古老的計算機實例,發現于希臘安提凱希拉島,可追溯到公元前100年。它可以進行天文計算,使用者通過轉動表盤輸入一個日期,然后轉動曲柄,得到太陽和月亮在該日期的位置。另一個例子是二戰時期的火炮火力控制計算機,它使用許多形狀奇特的齒輪實現三角和微積分運算,復雜的設計使它幾乎成為藝術品。
還有一個不使用齒輪的機械計算機的例子,計算尺,由英國數學家威廉·奧特雷德(William Oughtred)(1574—1660)發明。蘇格蘭物理學家、天文學家、數學家約翰·納皮爾(1550—1617)發現了對數。計算尺是對對數的巧妙應用。計算尺的基本功能是利用公式log(x×y)=log(x)+log(y)實現乘法運算。
計算尺有用對數標記的固定刻度和移動刻度。它通過將移動的刻度y與固定的刻度x對齊,計算出兩個數字的乘積,如圖2-1所示。

圖2-1 計算尺加法
許多人認為計算尺是第一種大規模生產的計算設備,是說明過去的人們如何利用當時的技術來解決問題的好例子。如今,飛機上的飛行員仍在使用稱為飛行計算機的圓形計算尺,作為備份設備來執行導航相關的計算。
計數是歷史上計算設備的一個重要應用,由于手指能計的數有限,而且手指常常用來做其他事情,所以早在公元前18 000年,有缺口的骨頭和被稱為“計數棍”的棍子就被用作計算輔助工具。甚至有一種理論認為,埃及的荷魯斯之眼是用來表示二進制分數的。
博學多才的英國人Charles Babbage(1791—1871)說服英國政府資助建造了一種復雜的十進制機械差分機,它最初是由德國陸軍工程師Johann Helfrich von Müller(1746—1830)構想出來的。William Gibson和Bruce Sterling以差分機命名的小說把差分機推廣開,當時的金屬加工技術還不能制造出精度滿足要求的零件,所以差分機的出現是超前的。
然而,簡單的十進制機械計算器可以制造出來,因為制造它們不像制造其他零件那樣要求金屬加工技術精密復雜。例如,可以進行十進制加法運算的加法機出現在17世紀中期,主要用于記賬和會計。許多不同型號的加法機被大量生產,后來的新版加法機用電動馬達取代了手動操作的杠桿,操作更容易。事實上,標志性的老式收銀機就是帶有放錢抽屜的加法機。
所有這些歷史上出現的例子都屬于兩個不同的類別,將在下文中介紹。
2.1.1 模擬和數字之間的區別
計算尺等設備與計數棒或加法機相比,有一個重要的區別。圖2-2展示了圖2-1中的一個計算尺刻度與一組編了號的手指的對比。

圖2-2 連續和離散測量
計算尺刻度和手指可以記的數都是從1到10。我們可以很方便地用刻度表示1.1這樣的數值,但如果不做一些花哨的表示(例如手舞足蹈),就不能用手指來表示1.1。因為數學家認為刻度是連續的,也就是說刻度可以表示實數。而手指可表示的則被數學家認為是離散的,只能表示整數。整數和整數之間沒有任何值存在,數值從一個整數值跳到另一個整數值,就像我們的手指一樣。
在談論電子學時,我們用模擬(analog)這個詞表示連續的意思,用數字(digital)表示離散的意思(很容易記住,手指是數字的,因為手指的拉丁語是digitus)。你可能聽過模擬和數字這兩個術語。即使一直在學習使用數字計算機編程,但你很可能沒有意識到也存在類似計算尺這樣的模擬計算機。
一方面,模擬計算似乎是更好的選擇,因為它可以表示實數。但是它的精度存在問題。例如,我們可以在圖2-2中的計算尺刻度上挑出數字1.1,因為這部分的刻度間距大,而且還有標記。但要找到9.1就難多了,因為這部分刻度比較擁擠,而且這個數字在9.0和9.2的刻度線之間。9.1和9.105之間的差別,即使用顯微鏡也很難分辨。
當然,我們可以把刻度做得更大。例如,如果將刻度尺做大到一個足球場那么大,就會更準確。但要制造一臺120碼[1]長的便攜式計算機就很難了,更不用說操作這么大的物體要耗費的巨大能量。我們要的是體積小、速度快、功耗低的計算機。下一節將提到尺寸如此重要的另一個原因。
2.1.2 為什么尺寸對硬件很重要
想象一下,你需要開車接送孩子們上學放學,到學校的路程有10英里[2],汽車平均時速為40英里。這樣的距離和速度下每小時只能往返兩次。如果你不開快一點,或者離學校更近點,沒辦法更快地走完這段路程。
現代計算機驅動著電子來回穿梭。電流以光速行進,大約是每秒3億米。我們還沒有發現一種突破速度這個物理限制的方法,所以唯一能在計算機中最大限度地減少電流行進時間的方法就是把部件集中使它們靠近。
當今的計算機時鐘頻率可以達到4GHz,這意味著計算機每秒可以處理40億件事情。電流在40億分之一秒的時間里只能傳播75毫米左右。
圖2-3展示了一個典型的CPU,邊長約18毫米。在40億分之一秒的時間里,電流能在這個CPU里往返兩次。由此可見把物件尺寸做小點會讓CPU性能更好。

圖2-3 CPU光學顯微照片(英特爾公司提供)
另外,就像接送孩子上學放學一樣,出行也是需要能量的。把硬件做得小一點,就能減少來回的路途,從而減少所需的能量。這意味著設備的功耗更低、發熱更少,咱們放在褲兜里的手機才不會燙到腿。這也是為什么在計算機設備發展史上,人們一直在致力于讓硬件更小。不過,把硬件做得非常小會帶來其他的問題。
2.1.3 數字使設備更加穩定
雖然把硬件做小可以提高速度和效率,但當它們非常小時,很容易受到其他事物的干擾。德國物理學家Werner Heisenberg(1901—1976)對此表示絕對肯定。
想象一個玻璃量杯,上面標有1~10盎司[3]的刻度。如果在杯子里放一些水,然后舉起來再觀察,可能很難判斷杯子里有多少盎司水,因為你的手會抖動。現在想象一下量杯小十億倍的樣子。沒有人能讓它保持不動,因此也無法得到準確的讀數。事實上,即使你把那個小杯子放在桌子上,仍然無法讀出體積,因為在那個大小下原子運動會使量杯無法保持不動。在非常小的尺度上,宇宙是一個嘈雜熱鬧的地方。
量杯和計算尺都是模擬(連續)設備,一點點抖動就會產生錯誤的讀數。像雜散的宇宙輻射這樣的干擾足以在微觀的量杯中掀起波瀾,但它們不太可能影響到像手指、計數棒或機械計算器這樣的離散設備。這是因為離散設備采用的是決策衡量準則。當你用手指計數時,沒有“兩個數之間”的值。我們可以通過在整數位置上增加阻尼點(某種機械性的黏性點)來修改計算尺使它包含決策衡量準則。但這么做就把模擬設備變成了一個離散的設備,消除了它表示實數的能力。實際上,決策衡量準則使得某些數值范圍無法被表示。在數學上,這類似于將數字四舍五入到最接近的整數。
我們說過干擾好像是來自外部的,所以你沒準會認為可以通過使用某種屏蔽來減少干擾,就像鉛保護超人免受氪石的傷害一樣。但還有另一種更隱蔽的干擾源:電流。它會影響遠處的東西,就像重力一樣。這點有好的應用方面,否則我們就不會有無線電。但這也意味著,信號沿著芯片上的導線傳播時,會影響其他導線上的信號,特別是當芯片上的導線離得很近的時候。現代計算機芯片上的導線只相距幾納米(10–9米)。相比之下,一根頭發的直徑大約是10萬納米。這種干擾有點像反向行駛的兩輛車在馬路上駛過時你感受到的風。因為沒有簡單的方法來使芯片免受這種串擾效應,所以使用決策衡量準則下抗噪能力更強的數字電路是必需的。當然,我們可以把東西做得更大,使電線相距更遠以減少干擾的影響,但這與我們效率更高的目標背道而馳。跳過決策衡量準則的障礙所需要的額外能量,使我們獲得了一定程度的抗噪能力,這是使用連續設備所得不到的。
事實上,使用決策衡量準則帶來的穩定性是我們構建數字(離散)計算機的主要原因。但是,你可能已經注意到了,只要不提那些小到存在于量子物理學的事物,這個世界就是一個模擬(連續)世界。下一節將介紹如何操縱模擬世界獲得構建穩定計算設備所需的數字行為。
2.1.4 模擬世界中的數字
很多工程都巧妙地應用了自然界中存在的傳遞函數。這些函數就像你在數學課上學到的函數一樣,只不過它們代表的是現實世界中的現象。例如,圖2-4展示了一個數碼相機傳感器(或老式模擬相機的膠片)的傳遞函數圖。

圖2-4 數碼相機傳感器或膠片傳遞函數
x軸表示進入的光量(輸入),y軸表示記錄的亮度或傳感器記錄的光量(輸出)。曲線表示它們之間的關系。
我們通過將一個輸入球彈離曲線來獲得輸出,進而探究傳遞函數。可以看到,對于不同的光量值,傳遞函數會產生不同的記錄亮度值。注意,傳遞函數是曲線,不是直線。如果光量達到曲線肩部對應的光量,圖像就會過度曝光,因為記錄亮度值會比實際場景里的光值更緊密。同樣,如果光量達到曲線的底部,那么拍攝的畫面就會曝光不足。我們的目標(除非是為了特殊的效果)是調整曝光,使之達到線性區域,這將產生最忠于現實的表現。
工程師們已經開發出各種方法來利用傳遞函數,例如調整相機上的快門速度和光圈,使光線達到線性區域。放大器電路,如驅動音樂播放器中揚聲器或耳塞的電路,是另一個例子。
圖2-5展示了改變音量對放大器傳遞函數的影響。

圖2-5 增益對放大器傳遞函數的影響
音量控制可以調整增益或曲線的陡峭度。可以看到,增益越高,曲線越陡峭,輸出音量越大。但對于1984年電影《搖滾萬歲》中的那種增益可以調到11的特殊聲音放大器會怎樣?那樣信號就不再局限于線性區域了。這將導致失真,因為輸出的聲音不再是輸入的忠實再現。從圖2-6中可以看到,輸出與輸入不相似,因為輸入延伸到了傳遞函數的線性區域之外。

圖2-6 放大器削波
輸入的微小變化會導致曲線陡峭處的輸出發生跳躍。這就像從一個手指跳到另一個手指——追求的決策衡量準則,稱為閾值。這種失真是一種有用的現象,因為輸出值只會落在閾值的一側,很難落在那些值的中間。落在兩側的輸出值把連續的空間分割成了離散的區域,這就是我們追求穩定性和抗噪能力(在受干擾的情況下依然發揮作用的能力)所需要的。你可以認為模擬對應的是一個大的線性區域,而數字對應的是一個小的線性區域。
小時玩蹺蹺板的時候會發現這一現象(如果你有幸成長在教育游樂場設備不被認為是危險的時代):處于低端時(一直向下)或高端時(一直向上)比試圖在兩者之間的某個地方保持平衡要穩定得多。
2.1.5 為什么使用位而不是數字
我們已經討論過為什么數字技術相比模擬技術更適合計算機。但為什么計算機要用位而不是數字?畢竟人們使用數字,而且因為我們有10個手指,所以很擅長10以內的運算。
最明顯的原因是計算機沒有手指。一方面,用手指數數雖然很直觀,但不是一種非常有效的方法,因為每數一個數字都要用一個手指。另一方面,如果你像用位那樣用每個手指來表示一個值,手指是不夠用的。使用位而不是數字并不是一個新的想法,事實上,早在公元前9年,中國人就用6位數字來引用《易經》中的八卦。使用位代替手指,效率至少提高了100倍。即使是以四根手指為一組,來表示由十進制(BCD法)表示的十進制數,在效率方面也比普通計數方法要高。
對于硬件來說,使用位比數字好的另一個原因是,使用數字無法簡單地調整傳遞函數以獲得10個不同的閾值。我們可以構建實現圖2-7左側的硬件,但它會比實現10個圖2-7右側的硬件都要復雜和昂貴。

圖2-7 十進制與二進制閾值對比
當然,如果能在一個空間里建立10個閾值,我們肯定會這樣做。但是,用10個位都比用1個數字更好。這就是現代硬件的工作原理。它利用了傳遞函數的底部區域和肩部區域(在電氣工程中,分別被稱為截斷和飽和)。這有很大的回旋余地,需要很大的干擾才會得出錯誤的輸出。傳遞函數的曲線非常陡峭,以至于輸出值從一個值突然切換到另一個值。
[1]1碼=0.914 4米。——編輯注
[2]1英里=1 609.344米。——編輯注
[3]英制容量單位,1盎司=0.028 4升(在美國,1盎司=0.029 57升)。
- Apache Oozie Essentials
- Learning Apex Programming
- 跟小海龜學Python
- BeagleBone Media Center
- GitLab Repository Management
- Rust Cookbook
- Python漫游數學王國:高等數學、線性代數、數理統計及運籌學
- Oracle從入門到精通(第5版)
- Android驅動開發權威指南
- HTML+CSS+JavaScript網頁設計從入門到精通 (清華社"視頻大講堂"大系·網絡開發視頻大講堂)
- 寫給程序員的Python教程
- Learning Grunt
- 零基礎學C++(升級版)
- 美麗洞察力:從化妝品行業看顧客需求洞察
- Zend Framework 2 Cookbook