《深刻理解計算機系統(原書第 3 版)》緩存
英文版簡稱CS: APP網絡
2017 年 12 月第 1 版第 6 次印刷多線程
ISBN 978-7-111-54493-7架構
CSAPP 開篇就提到一個概念:信息 = 位 + 上下文併發
在計算機內部,「一切皆比特」,全部信息都以二進制序列的形式存儲、傳輸、處理和表示,但一樣是二進制序列,在不一樣的情境下就有不一樣的解釋方法。好比一樣是四字節二進制序列,能夠解釋爲一個整數,也能夠解釋爲四個ASCII碼錶示的字符;既能夠是某個具體的32位機器指令,又能夠是待處理的浮點數……dom
所謂「讀到這些數據對象時的上下文」,實際上就是指的這些二進制序列被呈現時的具體情境,是被處理的數值,仍是待執行的指令,抑或是要傳輸的字符,「信息」的意義並不取決於二進制序列自己長什麼樣,而更多地依賴於它在什麼狀況下被解釋。性能
在 CSAPP 第 2 頁有一個論斷是「只由 ASCII 字符構成的文件稱爲文本文件,全部其餘文件都稱爲二進制文件」。這樣的說法其實頗有意思,理論上來說,計算機內部全部文件都應該是「二進制文件」,卻單單拉出來一個「文本文件」離羣索居。學習
以前在編程的時候有時會感到奇怪,讀取/寫入文件時有一個模式是「以二進制格式讀取/寫入」,爲何就偏是「二進制格式」呢?看到 CSAPP 相關論述的時候忽然福至心靈,實際上計算機內部存儲的信息大致上被分爲兩種類型:一種是給人看的,即文本信息;一種是給機器看的,即二進制信息。優化
信息要表示給人看,就確定要以一個個字符的形式呈現,不限於 ASCII 碼的字符,GBK、Unicode這些都行,但必定要是字符編碼,由於對人而言一串串的二進制序列並無任何直觀的意義,只有這些序列可以被依次解讀爲一個個連續的字符時才能被人獲取到其中的信息。而機器之間的通訊則否則,二進制就是機器的語言,就是機器的文字,既沒必要呈現給人類,也沒必要再進一步地轉換浪費更多時間和空間,高效而且準確。
與其說計算機內部的文件分爲「文本文件」和「二進制文件」,倒不如說是計算機內部文件分爲「給人看的」和「給機器看的」來得貼切。
不出意外的話,這部分中提到的上下文對應的英文應該是 context,但這裏存在一個疑問:「上下文」這個術語在當前的計算機領域內有種被濫用的嫌疑。只要出現了 context 這個單詞,無論三七二十一你們都把它譯爲「上下文」。但實際上做爲使用漢語的中國人應該意識到,在不少出現單詞 context 的地方,將其譯爲」情境「、」背景「甚至是」語境「,都比譯做」上下文「更好也更準確。
舉例來講,下面這句話:
In the context of AI, the brain is essentially an advanced piece of technology that we must study, reverse engineer, and learn to emulate.
譯做:
而在人工智能的學科背景下,大腦本質上就是一種深奧繁複的技術,咱們有必要對它進行研究,經過逆向工程來解析它的工做原理和機制,從而模仿它的功能。
顯然要比譯爲:
而在人工智能的上下文中,大腦本質上就是一種深奧繁複的技術,咱們有必要對它進行研究,經過逆向工程來解析它的工做原理和機制,從而模仿它的功能。
更加貼切和通順。
固然,也有可能此處的「上下文」是後文所稱「進程運行所需的全部狀態信息」的特指,這固然也能解釋得通;但私覺得在計算機領域中將 context 譯做」上下文「的濫用狀況也須要獲得重視並及時糾正。
這個部分只是想嘗試一下 mermaid 畫圖功能強行加的
graph LR
A[預處理器]
B[編譯器]
C[彙編器]
D[連接器]
a{hello.c}
d{hello}
a-->A
A--"hello.i"-->B
B--"hello.s"-->C
C--"hello.o"-->D
D-->d
複製代碼
注意區分」字(word)「和」字節(byte)「。
一個「字」可能包含多個字節,「字長」即一個字中的字節數。字的具體大小應該是與處理器位數相關。
硬盤也是 I/O 設備的一種,但主存(即內存)不是。(存疑)
網絡也能夠被抽象爲 I/O 設備
I/O 設備又能夠被抽象爲「文件」
區別「控制器」和「適配器」
I/O 設備經過控制器或適配器與 I/O 總線相連
臨時存儲設備
由動態隨機存取存儲器芯片(DRAM,Dynamic Random Access Memory)組成
指令集架構:描述每條機器代碼指令的效果
微體系結構:處理器實際的實現
按個人理解,微體系結構指的應該就是處理器具體的半導體結果,也不知對不對。此處存疑。
高速緩存存儲器(cache memory)
利用局部性原理,經過局部加載下一級低速存儲器的內容來優化上一級高速存儲器的操做速度,最終達到優化計算機總體運行速度的效果。
學會利用高速緩存存儲器,能夠大大提高程序性能
存儲器層次結構逐層抽象,對低速設備而言,與之直接通訊的高速設備至關於其對應的高速緩存
此外,還有一個稱爲「虛擬機」的抽象,針對的是整個系統
進程是計算機科學中最重要、最成功的概念之一;
抽象也是。
要想顯著加速整個系統,必須提高全系統中至關大的部分的速度。
在本書中雖然給出了併發(concurrency)和並行(parallelism)的概念,但兩者的區別仍是不明顯,甚至看完以後比不看更加混亂。
按以前的理解,從英文單詞來看,併發(concurrency)前綴「con-」用以強調,整個單詞是「同時發生」的意思,但並不強調同一時刻,而更在於存續狀態。好比同時看《深刻理解計算機系統》和《計算機網絡:自頂向下方法》兩本書,能夠今天看前者20頁,明天看後者20頁;也能夠今天上午看前者20頁,今天下午看後者20頁,不管如何,在我看完兩本書以前,我對兩本書的狀態都是「閱讀中」,「看這兩本書」的狀態是一直存在的,雖然我並無一直看同一本書,但我一直「在看」這兩本書。幾種狀態同時存在,容許交替,但同一時刻只有一種狀態活躍,這就是所謂「併發」。
而並行(parallelism)的前綴「para-」則是「在旁邊」之意,也就是說行爲是同時發生的,強調的是同一時刻。以看書爲例,就不能是我本身一我的同時看兩本書了,而應當有另外一我的在我旁邊跟我一塊兒看書,我看《深刻理解計算機系統》,而他看《計算機網絡:自頂向下方法》。在這期間任意時刻進行觀察,兩我的都是在看本身那本書,互不干擾,並行不悖。實際上,「並行不悖」正是「並行」概念的題眼,也是其精髓所在。幾種狀態同時存在,同一時刻保持活躍,這就是所謂「並行」。
固然,看了 CSAPP 以後感受本身以前的理解彷佛有一些偏頗之處,所以暫時存疑。
前兩天在讀書羣中看見有人討論超線程的問題,但當時尚未開始看書,所以不是很清楚相關概念,也就沒有參與討論;看完以後對於超線程也有必定的想法,所以寫下來以供參考。
超線程和多線程是不同的。多核處理的狀況下無需贅言,多個處理器相互之間是並行的。在單核的狀況下,多線程實際上就是一種併發,經過 CPU 的時間調度來分配各個線程的執行時間,多時間片輪轉以此塑造出「多線程並行」的假象。而超線程則是充分利用 CPU 在執行某個線程時多餘的資源,在不影響當前線程的狀況下再開一個線程,用到的則是空閒的資源;而一旦發生資源競爭,超線程就會終止。也就是說「超線程」在其出現的時候,是真正意義上的「並行」。
仍是舉例來講。
多線程就像是《火影忍者》中學習影分身術的忍者,忍者須要經過在各個事務間高速移動,而且不停接續每項事務的上一個狀態,來達到一種「出現分身」的假象。但實際上忍者仍是隻有一個,由於作每件事都須要忍者投入所有資源,也就沒法將資源共享出去。
而超線程則像是一我的一邊看書一邊泡腳,確實一我的在看一本書的狀況下沒法在同一時刻再看另外一本書,由於大腦、眼睛都處理不過來;但這並不妨礙他在看書的同時泡腳,由於泡腳並不須要佔用大腦和眼睛的資源,而腳這個資源在看書的時候正好是處於空閒狀態的。也就是說在進行一項無需投入所有資源的任務的時候,必要資源分配出去後剩餘的資源還可以支撐其餘任務,而且其餘任務也不會對當前任務產生干擾,那麼這兩項或者是幾項任務就能夠同時執行,並行不悖。也所以,超線程帶來的性能提高遠不如多核處理帶來的性能提高,由於在超線程中,多個任務的規模並非對等的,也就不會出現「性能提高兩倍」的現象。