csapp第一章 计算机系统漫游 学习和理解
?計算機系統是由硬件和系統軟件組成的。
系統的具體實現在變,但系統內在的概念沒有變。
所有的系統都有相似的硬件,相似的軟件組件,它們執行著相似的功能。
這些組件是如何工作的?這些組件是如何影響程序的正確性和性能的?本書予以解答。
K&R的hello程序要完成運行,系統的每個組成部分都需要協調工作。本書就是告訴你在系統上運行hello程序時,系統發生了什么以及為什么會這樣。
1.1 信息就是位+上下文
圖1-2真的是hello.c的ASCII碼表示,除了可見的字符外,不可見的是sp和\n,從第一個到最后一個完整的表示出來。這就是文本文件。
“\n”是在每一行的結尾處,或者說有“\n"才有一行的結束,其表現就是光標到了下一行,另起一行。
這里說ASCII字符構成的文件稱為文本文件,所有其他文件都是二進制文件,我想有點不對,應該是所有由編碼字符構成了文件是文本文件,其他是二進制文件。編碼字符不止ASCII,還有UTF-8等等,ASCII不可以表示中文。
系統的所有信息都是一串位,區分這些位表示什么信息的方法,唯一方法,是讀到這些位時候的上下文。
這個上下文既然是從位的角度講的,那么至少也是在匯編語言級別去解釋,比如mov,是movb還是movw,這種就應該算是上下文,更底層的機器語言就看不懂了。c語言也不是,c的表達方式就已經在文本級別了,與位其實有一定的差距了。(這句話的理解也不知道對不對,暫且不管)
c語言是系統級編程的首選,同時也非常適用于應用級程序的編寫。c++和java是應用級程序的新的程序設計語言。
1.2 程序被其他程序翻譯成不同的格式
可執行目標文件是二進制文件,是按照一種格式打包起來的,這個格式稱為可執行目標程序,打包的對象是從每條c語句轉化出來的低級機器語言指令。
編譯器驅動程序完成從源文件到可執行目標文件的轉化。這里有驅動兩個字。
轉化的過程有4個階段,分別用到預處理器,編譯器,匯編器,鏈接器。
- 預處理器處理的是以字符#開頭的命令,也就是說#開頭的就是預處理命令,會經過預處理器處理。
- 編譯器為不同的高級語言的不同的編譯器提供了通用的輸出語言—匯編語言。
- 匯編器也會打包,按照可重定位目標程序的格式來打包。二進制文件的字節編碼是機器語言指令而不是字符。
- 鏈接器,每個程序不可避免的會使用到一些標準庫里的函數什么的,每個編譯器都包含了c的標準庫,存放在可重定位目標程序格式打包的文件中(我認為),將這個文件和匯編器產生的文件合并,就是鏈接器的作用。然后,結果是得到了可執行目標文件,打包格式為可執行目標程序。
1.3 了解編譯系統如何工作是大有益處的
優化程序性能-我們確實需要了解一些機器代碼以及編譯器將不同的c語句轉化為機器代碼的方式。
兩種機器語言:IA32和X86-64,3章學習這個,機器語言,說的是機器語言還是匯編,應該是一樣的,匯編和機器是一一對應的。所以就是機器語言。
3章學習這兩個語言,5章學習如何優化程序性能,6章學習存儲器系統
3章還將學習堆棧原理和緩沖區溢出錯誤,這是大多數安全漏洞的主要原因。
1.4 處理器讀并解釋存儲在存儲器中的指令
shell是一個命令行解釋器。
所有系統都有的相同外觀和特性:總線,字長是一個基本的系統參數,4字長就是32位。I/O設備,每個I/O設備都通過一個控制器或者適配器與I/O總線相連;控制器是芯片組,或在主板上或在I/O設備本身上;適配器是插在主板插槽上的卡。
處理器的核心是程序存儲器(PC),是一個字長的存儲設備,或者說寄存器。PC中始終存著某條指令的地址。這說明一個事情:地址是一個字長的。(至少表面上看是這樣的)。
寄存器文件是由一些1字長的寄存器組成的。ALU計算新的數據和地址。
CPU執行:
- 加載——把一個字節或者一個字從主存復制到寄存器。
- 存儲——把一個字節或者一個字從寄存器復制到主存。
- 操作——兩個寄存器的內容復制給ALU,ALU算術運算,并將結果存放到一個寄存器中
- 跳轉——從指令本身中抽取一個字,并復制到PC中。
3章介紹指令集結構(每條指令的效果),4章介紹微體系結構(處理器的實現)。
1.5 高速緩存至關重要
意識到高速緩存存在的應用程序員可以利用高速緩存將他們程序的性能提高一個數量級。6章將介紹。
1.6 存儲設備形成層次結構
每個計算機系統中的存儲設備都被組織成了一個存儲器層次結構。
1.7 操作系統管理硬件
操作系統有兩個基本功能:1防止硬件被失控的應用程序濫用,2應用程序提供簡單一致的機制來控制復雜而又通常大相徑庭的低級硬件設備。
操作系統通過幾個基本的抽象概念來實現這兩個功能:進程,虛擬存儲系統,文件。文件抽象I/O設備,虛擬存儲器抽象文件和主存,進程抽象虛擬存儲器和處理器。
系統上只有一個程序的假象,是通過進程的概念來實現的。
進程是操作系統對正在運行的程序的一種抽象。操作系統進行的抽象。
一個cpu看上去像是在并發的執行多個進程,這時通過處理器在進程間切換來實現的。操作系統實現這種交錯執行的機制是上下文切換。
上下文是操作系統保持跟蹤進程運行所需的所有狀態信息。包括:PC和寄存器文件的當前值,主存的內容。
單處理器系統在任何時候都只能執行一個進程的代碼。
shell是一個進程,hello是一個進程。8章介紹進程的實現。
每個線程都運行在進程的上下文中,并共享同樣的代碼和全局變量。12章學習寫線程化的程序。
虛擬存儲器為進程提供了一個假象,即每個進程都在獨占地使用主存。
每個進程看到的是一致的存儲器,稱為虛擬地址空間。一致的,就是說一樣的。
在linux中,每個進程看到的虛擬地址空間由大量準確定義的區組成。空間從底部向上地址不斷增加。
- 對于所有的進程來說,代碼是從同意固定地址開始,就是程序的代碼(這里應該是編譯后的機器代碼了)從確定的位置開始。也就是虛擬地址空間的底部都具有相同的地址,從這個地址開始首先存放的是代碼,然后是c全局變量。這兩者是按照可執行目標文件的內容初始化的。7章會學到更多有關地址空間的內容。
- 在代碼和數據后是堆,運行時堆,代碼和數據區在進程開始的時候就規定了大小,這是正常的,因為代碼和全局變量是不會變化的。堆會動態的擴展和收縮,c中使用malloc和free這兩標準庫函數就會有這種效果。9章更詳細的研究堆。
- 大約在地址空間的中間部分是一塊用來存放像C標準庫和數學庫這樣共享庫的代碼和數據的區域。也是代碼和數據的區域。7章將學習共享庫是如何工作的。
- 位于用戶虛擬地址空間頂部的是用戶棧,編譯器用它來實現函數調用。也會收縮和擴展,調用一個函數時就增長,從一個函數返回時就收縮。這里的棧是在頂部,用戶虛擬地址空間的頂部,上面還有內核虛擬存儲器,這個不管,在用戶虛擬地址空間的頂部說明棧是向下增長的,而堆緊靠著代碼和數據區說明堆是向上增長的,兩者中間是共享庫區,好理解。3章學習編譯器是如何使用棧的。
- 內核總是駐留在內存中的,是操作系統的一部分,地址空間頂部的區域(不是用戶虛擬地址空間,而是虛擬地址空間)是為內核保留的,不允許應用程序讀寫這個區域的內容或者直接調用內核代碼定義的函數。應用程序只能使用操作系統提供的統一的接口吧,這些接口既然不在內核中(因為不能使用內核代碼),所以應該在共享庫中。
9章將詳細解釋虛擬存儲器系統如何工作。
文件就是字節序列,僅次而已。I/O設備可以視為文件。
系統中所有輸入和輸出都是通過使用一小組稱為Unix I/O的系統函數調用讀寫文件來實現的。
這里有個概念,I/O就是輸入和輸出,I/O設備就是可以輸入和輸出的設備。而文件可以讀和寫,讀和寫又可以看作是輸出和輸入。所以,I/O設備與文件具有核心的共性。所以可以抽象。10章介紹Unix I/O。
1.8 系統之間利用網絡通信
網絡可以視為一個I/O設備,適配器就是網絡適配器(網卡,有線的或者無線的),而網絡就是一個I/O設備。11章講學到如何構造網絡應用程序,并利用這些知識創建一個簡單的web服務器。
1.9 重要主題
系統是硬件和軟件相互交織的集合體。系統又是硬件和應用程序之間的一層軟件。系統可以有很多名字。
在此再次強調幾個貫穿計算機系統所有方面的重要概念:
并發(concurrency)指同時具有多個活動的系統。并行指用并發使系統更快。并行可以在計算機系統的多個抽象層次上運用。從高到低的三個層次:
線程級并發:單處理器系統--只有一個處理器的系統,這種系統也是可并發的,因為比如奔4的單核系統就可以變聽歌邊上網。但這種并發是模擬出來的,是的,這就是模擬出來了,是單處理器在不同進程之間不斷切換來實現的,這種就叫模擬出來的并發。
多處理器系統分兩種:多處理器和超線程。
- 多處理器是一個集成電路芯片上有多個核(cpu),一個核完整的應該是計算單元,寄存器文件,L1高速緩存(L2高速緩存);這稱為一個核,一個cpu。
- 超線程是指一個核執行多個控制流的技術,事實上,一個進程中多個控制流就指多個線程。這個時候的核可以只有一個計算單元,但是寄存器文件和L1高速緩存可能就有多組,由于內存中共用虛擬地址空間(一個進程嗎)所以幾組寄存器和L1高速緩存就可以有幾組線程。常規的處理器需要大約20000個時鐘周期來做不同線程間的切換,而這種超線程技術的處理器之用一個周期。
這種多處理器系統才可以說是真的做到了并發吧。
指令級并行;這個微機原理中其實講的比較清楚,就是取指令和處理指令其實是分開的,多條指令的不同步驟可以同時的進行,這個就是指令級并行,4章研究流水線的使用,5章介紹超標量處理器的高級模型。
單指令/多數據并行:一條指令可以產生多個可以并行執行的操作。上面的是多個指令并行的執行,這個是一個指令的不同部分并行的執行。SIMD并行。
最高級別是線程級并發,其實多核就是進程級的并發了,超線程是線程級的并發。再往上,就沒有了。進程已經到頂了。
抽象是計算機科學中最為重要的概念之一。
指令集結構是對實際硬件的抽象,表示的是執行模型。兩個處理器的執行模型一樣不代表實際硬件的實現方式一樣,雖然由于執行模型相同,也就是指令集相同,所有可以執行相同的機器語言代碼,但是卻有不同的開銷和性能。
1.10 小結
(OVER)
轉載于:https://www.cnblogs.com/rayhill/archive/2012/04/15/2450641.html
總結
以上是生活随笔為你收集整理的csapp第一章 计算机系统漫游 学习和理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过eclipse手工生成osgi-bu
- 下一篇: 股指期货策略精选合集