如果你全力投身學習本書中的概念,完全理解底層計算機系統以及它對應用程序的影響,那麼你會步入上成為為數不多的“大牛”的道路。
一、信息=位 上下文<1>hello.c 這樣隻由 ASCII 字符構成的文件稱為文本文件,其他的所有文件都稱為二進制文件
<2>系統中所有的信息-包括磁盤文件、内存中的程序、内存中存放的用戶數據以及網絡上傳送的數據,都是由一串比特表示的。區分不同數據對象的唯一方法是我們讀到這些數據對象時的上下文。比如,在不同的上下文中,一個同樣的字節序列可能表示一個整數、浮點數、字符串或者機器指令。
二、程序被其他程序翻譯成不同的格式hello.c文本文件會經過四個階段的程序(預處理器、編譯器、彙編器、鍊接器)生成一個目标程序(也叫可執行目标程序)
三、處理器讀并解釋存儲在内存中的指令CPU 在指令的要求下,可能會執行的操作。(一些簡單操作的例子)
- 加載:從主存複制一個字節或者多個字節到寄存器,以覆蓋寄存器原來的内容。
- 存儲:從寄存器複制一個字節或者字到主存的某個位置,以覆蓋這個位置上原來的内容
- 操作:把兩個寄存器的内容複制到ALU,ALU對這兩個字做算術運算,并将結果存放到一個寄存器中,以覆蓋該寄存器原來的内容。
- 跳轉:從指令本身中抽取一個字,并将這個字複制到寄存器(PC)中,以覆蓋PC中原來的值。
五、操作系統管理硬件
操作系統有兩個基本功能:
- 防止硬件被失控的應用程序濫用。
- 向應用程序提供簡單一緻的機制來控制複雜而又大不相同的低級硬件設備。
操作系統通過幾個基本的抽象概念(進程、虛拟内存和文件)來實現這兩個功能。
1、進程進程是操作系統對一個正在運行的程序的一種抽象。
從一個進程到另外一個進程的轉換是由操作系統内核來管理的。内核是操作系統代碼常駐内存的部分。當應用程序需要執行操作系統的某些操作時,比如讀寫文件,它就執行一條特殊的系統調用(System call)指令,将控制權傳遞給内核。然後内核執行被請求的操作并返回應用程序。
注意:内核不是一個獨立的進程。相反,它是系統管理全部進程所有代碼和數據結構的集合。
2、線程每個線程都運行在進程的上下文中,并共享同樣的代碼和全局數據。多線程比多進程之間更容易共享數據,也更高效。
3、虛拟内存
- 程序代碼和數據。全局變量是存放在讀/寫代碼數據區域。
- 堆。可以動态擴展的數組之類的數據結構肯定放在這個區域的。
- 共享庫。C标準庫和數據庫存放在這個區域。共享庫的概念非常強大,也相當難懂。
- 棧。函數調用的時候,使用這塊區域
- 内核虛拟内存。
圖中的箭頭,指的是存儲空間動态擴展的方向。沒有文字标識的空間是空白空間。
4、文件文件就是字節序列,僅此而已。每個I/O設備,包括磁盤、鍵盤、鼠标、顯示器,甚至網絡,都可以看成文件。系統中的所有輸入輸出都是使用一小組稱為 Unix I/O 的系統函數調用讀寫文件來實現的。
文件這個抽象概念非常強大。例如:處理磁盤文件内容的程序員可以非常幸福,因為他們無需了解具體的不同德磁盤技術。
六、系統之間通過網絡進行通信我們一直把系統視為一個孤立的硬件和軟件的集合體。實際上,現代系統經常通過網絡和其他網絡連接在一起,例如分布式系統。從一個單獨的系統來看,網絡可以視為I/O設備。系統可以從主存中複制一串數字到網絡适配器。
七、重要主題1、Amdahl 定律當我們對系統的某部分加速時,其對系統整體性能的影響取決于該部分的重要性和加速程度。
2、并發和并行
1、并發是指兩個進程或者兩個線程交替執行。
2、并行是指在同一時刻(計算機同一時鐘周期)内,2個進程或線程同時在執行。
3、計算機系統中抽象的重要性
文件是對I/O設備的抽象;虛拟内存是對程序存儲器的抽象;而進程是對一個正在運行的程序的抽象,指令集架構是對處理器的抽象,底層的硬件遠比抽象描述的要複雜精細。API接口是對函數的抽象;虛拟機是對整個計算機的抽象。
,