標籤:
1.1資訊就是位+上下文
系統中所有的資訊都是由一串位組成的, 所謂的位就是bit, 每八位是一個位元組也就是byte, 理論上講所有的檔案可以分為兩種, 一種是由ascii字元組成,這種我們也稱作文字檔(其實其他字元編碼也算, 這裡不考慮), 剩下的都叫做二進位檔案。所以其實一個檔案到底會被如何翻譯其實完全取決於上下文。
1.2程式被其他程式翻譯成不同的格式
文中舉了C語言的例子:
源檔案(src.c)經過前置處理器(cpp)產生被修改的源檔案(src.i)然後經過編譯器(ccl)產生彙編代碼(src.s)然後是彙編器(as)產生可重定位的目標程式(src.o,從這裡開始就是二進位檔案了),最後經過連結器(ld)產生可執行檔。
這裡我解釋一下可重定位, 所謂的重定位定位的是地址, 因為只有經過了前面的編譯處理才能得出最終資料區段(.data)以及程式碼片段(.text)的最終大小, 重定位在於為指令和全域變數等分配實際的系統空間。
1.3瞭解編譯系統如何工作是大有益處的
如果能夠弄懂編譯系統工作原理, 可以在效能最佳化, 解決連結錯誤以及避免安全性漏洞等方面有更加全面的瞭解。
1.4處理器讀並解釋儲存在儲存空間中的裝置
- 首先對於系統硬體組成的一個基本的認識 :
- 匯流排用來攜帶資訊位元組貫穿整個系統,其傳送的位元組塊被稱之為字, 字中的位元組數是一個基本的系統參數也叫做字長, 一般為32位或者是64位。
- IO裝置是系統與外界的聯絡, 比較常見的比如輸入裝置鍵盤滑鼠,輸入裝置顯示器磁碟等。
- 主存也(DRAM)就是我們平時說的記憶體, 從物理角度看, 可以看出是線性數組。
- 處理器是解釋或者執行儲存在主存中指令的引擎。
- 那麼一個程式的運行主要是以下過程: 當我們用./src(這裡預設指linux的shell中)調用src可執行檔時, 外殼執行一系列指令來載入src檔案, 將src檔案中的資料從磁碟複製到記憶體中, 然後處理器開始執行資料中包含的機器指令, 這些指令將helloworld複製到寄存器(這裡指的是helloworld.c)然後再從寄存器中複製到顯示裝置(顯示屏)從而顯示在案頭上。
1.5快取至關重要
1.4中簡單的執行個體揭示了一個重要的問題, 系統花費了大量時間把資料資訊從一個地方挪到了另外一個地方,但實際的機器指令的執行卻只是一小部分, 所以如果能讓資料的複製儘可能快的完成的話, 就能夠加快電腦的執行效率。針對這一情況,人們發明了快取儲存空間, 他的記憶體空間遠小於主儲存空間,但是資料的訪問速度幾乎和寄存器一樣快,這樣我們可以把經常訪問的資料放在緩衝中, 以這樣的方式來加快存取速度。
1.6存放裝置形成的階層
隨著電腦的發展, 在處理器與大的記憶體裝置(主存)之間插入更小更快的存放裝置的想法已經成為了普遍的觀念。這逐漸使得電腦領域的存放裝置被組織成了儲存空間階層,這些裝置都遵循這如下特點:空間越大, 速度越慢。
1.7作業系統管理硬體
其實上面說shell載入和執行src檔案時, 我們都忽略了一個很關鍵的概念那就是作業系統,也就是說shell和執行的src程式並沒有直接存取磁碟記憶體等等, 他們都是通過作業系統來完成這些步驟。作業系統有兩個基本的功能:
- 嚮應用程式提供簡單一致的機制來控制複雜而又大相徑庭的低級裝置。
- 既然它提供了操作硬體的介面, 自然也就可以用來防止硬體被失控的程式濫用。
作業系統提供了如下幾種基本的抽象概念:檔案, 虛擬儲存空間, 進程(概念的範圍由前往後越來越廣)。
- 在作業系統上運行程式會造成一種假象, 似乎當前只有這個程式在使用處理器, 記憶體和IO裝置,這些假象就是通過進程這個概念來實現的。進程其實就是對一個正在啟動並執行程式的抽象, 一個系統上可以同時運行多個進程, 每一個都好像在獨佔地使用硬體, 而實際情況是他們是往往是交錯啟動並執行, 作業系統在不同的進程間交錯執行的機制就叫做環境切換。在同一個進程中, 還有一個類似的概念叫做線程, 現代程式中一個進程往往又多個線程來共同完成, 線程之間共用代碼和全域資料, 由於他們之間更加容易共用資料, 往往線程更加高效。
- 虛擬儲存空間是另外一個抽象概念,它使得每一個進程看起來都像是獨佔使用記憶體, 每一個進程看到的一致的儲存空間, 叫做虛擬位址空間,其結構從第地址到高地址分別是 :
- 程式碼和資料:這一點對於所有程式都一樣, 代碼從固定地址開始, 緊接著是和C語言中全域變數相對應的資料位元置。
- 堆:運行時堆, 當調用malloc或者free時, 堆能夠動態地擴充和收縮。
- 共用庫:用來存放類似C語言中標準庫數學哭等代碼和資料的地方。
- 棧:編譯器用它來實現函數調用,和堆一樣能夠動態伸縮。
- 核心虛擬儲存空間:核心是作業系統的一部分, 這一部分空間是留給核心的, 不允許程式讀寫這部分空間或者調用核心代碼定義的函數。
- 每一個IO裝置, 包括磁碟, 顯示器, 鍵盤甚至網路都可以稱之為檔案, 系統所有的輸入輸出都是通過被稱為Unix I/O的系統函數調用讀寫檔案來實現的。
1.8系統之間的通訊
電腦並不是孤立存在的, 每一個電腦系統通常通過網路來相互串連, 網路也可以是為一個IO裝置。
1.9重要主題
- 並行與並發
- 線程級並發:一般利用線程切換來完成, 後來出現的多處理器系統以及多核系統提高了系統系統的效能。
- 指令集並發:通過pipelining的使用聰明的處理多條指令同時進行。
- 單指令多資料並行:即SIMD並行, 現代處理器允許一條指令產生多個可執行檔操作來加快執行速度。
- 抽象是電腦中一個相當重要的概念, 它隱藏內部的軟硬體內部的實現細節,用簡單統一的視角來簡化研究。
電腦系統漫遊