前言程序員
之因此開始記錄學習CSAPP的筆記,是由於剛開始接觸這麼課的時候發現這門課實在是太有意思了。以前一直據說CSAPP這本書很是有意思,如今開始了以後發現確實可以對整個計算機系統有一個深入的理解,很是有助於程序員的程序編寫。同時,由於今年咱們研一開設了這麼課程,老師上課講的也很是有意思,所以結合這本書和老師的上課筆記進行一個總結,但願有興趣的同窗能夠一塊兒來學習。再次強調,《深刻理解計算機系統》(簡稱CSAPP)這本書很是有意思,沒看過的趕忙看一下,能學到不少東西。 shell
第一章 計算機系統漫遊緩存
1.1信息=位+上下文安全
源程序是以0和1組成的位序列構成的,其每一個字符都對應一個ASCII字符,。一個ASCII字符是以惟一的單字節大小的整數值來表示每一個文本字符,每一個字節由8bit組成,所以源程序裏面的全部信息都是一串位來表示的。咱們能夠理解爲咱們看到的C語言程序最終都是0、1組合的形式告訴計算機。那麼一樣的一段數據有可能有不一樣的含義,這就須要結合上下文來進行理解。服務器
1.2編譯的工做原理網絡
以hello.c源文件來舉例子:併發
hello.c --> 預處理器 --> 編譯器 --> 彙編器 --> 連接器 --> 目標文件分佈式
首先,hello.c源文件須要進行預處理,也就是把頭文件包含的內容添加到源文件中,至關於把頭文件的庫加載進來最終組成一個文件。而後將這個預處理好的文件進行統一編譯,把高級語言轉換成彙編語言,彙編語言再轉化成機器語言,最後是處理hello.c裏面涉及到的printf函數,須要把這部分代碼與當前的代碼進行連接,最終合併到一個文件。合併成功後就能夠加載到內存中由系統來執行。函數
1.3理解編譯系統的好處性能
1.4程序運行的流程
目標文件存在磁盤中,當咱們在shell裏面輸入該文件名的時候,計算機會把目標文件從磁盤複製到主存,而後處理器開始執行main程序裏面的機器語言指令,把相關數據從內存複製到寄存器文件中,而後再經過總線從寄存器複製到顯示設備進行顯示。
1.5高速緩存
高速緩存在提高程序性能來講是很是重要的,由於咱們的程序從磁盤到主存,從主存到寄存器這些過程都須要開銷時間,這樣就會下降效率。然而咱們能夠利用高速緩存的局部性原理來進行有效提高程序的性能,把最近出現或者將來可能會用到的程序放到高速緩存中,這樣就能夠減小訪問磁盤或者內存的次數,從而實現提升效率。同時,高速緩存的訪問速度跟寄存器差很少,比訪問主存要快不少,更比磁盤快不少。在如今的系統中,甚至已經有L一、L2和L3三級的高速緩存。
1.6存儲設備層次結構
訪問速度從快到慢:寄存器文件 --> L1 cache --> L2 cache --> L3 cache --> 主存 --> 本地磁盤 -->分佈式系統、Web服務器。
同時,前面一個存儲設備能夠做爲後面一個的高速緩存,至關於一箇中間件橋樑的做用,或者理解爲緩衝區的做用,這對於提高程序性能來講很是重要,所以咱們須要好好理解高速緩存的概念。
1.7操做系統管理硬件
操做系統至關於在應用程序和硬件之間加了一層軟件,經過這層軟件能夠對底層硬件進行抽象化,而後方便用戶更方便地操控硬件。操做系統有幾個基本抽象概念來實現這些功能,分別是進程、虛擬存儲器和文件。
文件是對I/O設備地抽象,說白了文件就是字節序列,全部的I/O設備均可以抽象爲文件,包括磁盤、鍵盤、顯示器甚至網絡。
虛擬存儲器是對文件和主存的抽象表示,爲每個進程提供了獨佔地使用內存地假象。
進程是對處理器、主存和I/O設備的抽象表示,也是最重要的概念。進程是動態的,是正在運行的程序的一種抽象。處理器在處理代碼和數據的時候每每會涉及到進程的上下文切換,這也是提升CPU利用率的方法。對進程的進一步劃分還有一個線程的概念,線程能夠共享進程的全部資源。
綜述所述,咱們須要理解操做系統對硬件設備的抽象表示,只有這樣咱們才能更好地經過操做系統對硬件進行管理。
1.8系統間網絡通訊
網絡其實能夠當作是一個I/O設備,由於經過網絡咱們能夠鏈接到任何一臺設備,這樣地話咱們把任何一臺設備地輸出當成咱們本地設備地輸入,也就能夠把網絡理解爲I/O設備。網絡之間地通訊最典型地機制是客戶端—服務器的形式,其總體的運行流程跟本機運行的流程基本一致,只是把網絡接口當成了一個輸入輸出通道而已。
1.9重要主題
線程級併發、指令級並行和SIMD並行(單指令、多數據並行)這三個概念有點抽象,後續繼續探討。除此以外,抽象是一個很是重要的概念,添加一個虛擬機的概念,虛擬機是對整個計算機的抽象,包括操做系統、處理器和程序。