我帶著乙個要成為程式設計大牛的理想,下定決心開始看《深入理解計算機系統》這本書了。由於正在讀研究生,沒有全力去看這本書,更新速度比較慢。但是,這是乙個起點,我相信也不是乙個終點。
應該帶著目標去學習。我們就以解決問題為導向開始著手這件事。文章記錄一些我比較關心的知識點。越來越發現,書中的圖才是精華。
能解決的問題:
1.奇怪的數字錯誤;
2.學會通過一些小竅門來優化自己的c**。
3.了解編譯器是如何實現過程呼叫的,以及如何利用這些知識來避免緩衝區溢位錯誤帶來的安全漏洞。
4.學會如何編寫自己的unix shell、自己的動態記憶體分配包,甚至於自己的web伺服器。
5.認識併發帶來的希望和陷阱,這個主題隨著單晶元上整合了多個處理器核變得越來越重要。
知識點總結:
1.系統中所有的資訊——包括磁碟檔案、記憶體中的程式、記憶體中存放的使用者資料以及網路上傳送的資料,都是由一串位元bit表示的。區分不同資料物件的唯一方法是我們讀到這些資料物件時的上下文。比如,在不同的上下文中,乙個同樣的位元組序列可能表示乙個整數、浮點數、字串或者機器指令。
每個位元組表示程式中的某些文字字元。大部分的現代計算機系統都使用ascii標準來表示文字字元。用於英語類語言文字。這種方式實際上就是用乙個唯一的單位元組大小的整數值來表示每個字元。
ascii字符集適合於編碼英文文件。但是在表示一些特殊的字元方面並沒與太多辦法。基本編碼,稱為unicode的「統一字符集」 解決了這一問題,使用32位來便是字元,即每個文字串中每個字元要占用4個位元組。它支援廣泛的語言種類。
utf-8表示將每個字元編碼為乙個位元組序列。即所有的ascii位元組序列在utf-8中是一樣的。
2. 目標程式即可執行目標檔案。它的生成如下:每一條c語言都被其他程式轉化為一系列的低階及其語言指令,然後這些指令按照一種稱為可執行目標程式的格式打包好,並以二進位制磁碟檔案的形式存放起來。
預處理器、編譯器、彙編器和鏈結器一起構成了編譯系統compilation system.
3.系統的硬體組成:匯流排 + i/o裝置 + 主存 +處理器。
i/o裝置、主存和處理器是計算機的核心。
字(word),通常匯流排被設計成傳送定長的位元組塊,也就是字。字中的位元組數(字長)是乙個基本的系統引數。32位字長系統的字長是4個位元組,64位使8個位元組。
**處理器的核心是乙個大小為乙個字的儲存裝置(或暫存器),稱為程式計數器(pc)。在任何時刻,pc都指向主存中的某條機器語言指令(即含有該條指令的位址)。
cpu圍繞著主存、暫存器檔案(register file)和算術/邏輯單元(alu)進行。
暫存器檔案是乙個小的儲存裝置,由一些單個字長的暫存器組成,每個暫存器都有乙個唯一的名字。
alu計算新的資料和位址值。
4.所有應用程式對硬體的操作嘗試都必須通過作業系統。
5.程序是作業系統對乙個正在執行的程式的一種抽象。併發執行指多個程序在同一時間段內交錯執行。
無論是在單核還是多核系統中,乙個cpu看上去都想是在併發地執行多個程序,這是通過處理器在程序間切換來實現的。作業系統實現這種交錯執行的機制稱為上下文切換。
乙個程序可以由多個執行緒的執行單元組成,每個執行緒都執行在程序的上下文中,並共享同樣的**和全域性資料。乙個執行緒只屬於乙個程序。使用執行緒,我們甚至能夠在乙個程序中執行多個控制流。
超執行緒,即同時多執行緒(simultaneous multi-threading),是一項允許乙個cpu(即乙個程序)執行多個控制流的技術。即乙個程序多個執行緒。
深入理解計算機系統 計算機系統漫遊
第一章 計算機系統漫遊 計算機系統是由硬體和系統軟體組成的。所有計算機系統都是由相似的硬體和軟體組成,它們又執行著相似的功能。以hello程式為例。1.1資訊就是位 上下文 hello程式的生命是從源程式 原始檔 開始的。源程式是程式設計師編寫的,hello.c。源程式是 0和1 的位元位,8個一組...
深入理解計算機系統 計算機系統漫遊
1 程式編譯階段 以hello world 程式為例,介紹計算機系統的基本組成結構和程式的編譯過程。include int main 該程式的執行經歷這樣乙個過程 源程式首先經預處理器處理 將 include中的內容插入到源程式中,得到另乙個程式hello.i 編譯階段 hello.i程式經過編譯,...
深入理解計算機系統(2) 計算機系統漫遊
這一節的內容有些枯燥,很多內容都是文字描述。但是對於後續的學習是有幫助的,一些概念提前有個簡單的了解多少會有些幫助。這一節的學習內容都是一些概念和知識的簡要介紹,沒有過多地深入,旨在為後續學習做個鋪墊。上文最後部分提到,計算機內部執行程式時,用到了很多複製的操作,此處為鏈結。從程式設計師的角度來說,...