計算機系統=硬件+系統軟件構成的。程序員
它們共同工做來運行應用程序。系統的具體實現方式隨時間變化,可是系統的內在概念卻沒有改變。編程
深刻了解計算機系統的組件如何影響程序的正確性和性能。數組
====================================================緩存
源程序其實是由0和1組成的位序列。8個位被組織成一組,稱爲字節。每一個字節表示程序中某個文本字符。現代系統都使用ASCII標準來表示文本字符。安全
源程序以字節序列的方式存儲在文件中。每一個字節都有一個整數值,每一個整數值對應一個文本字符。由ASCII字符構成的文件稱爲文本文件。全部其餘文件都被稱爲二進制文件。服務器
基本思想:計算機中全部的信息都是由一串位表示的。區分不一樣數據對象的惟一方法就是讀到這些數據對象時的上下文。在不一樣的上下文中,同一個字節序列可能表示不一樣的含義。網絡
做爲程序員須要瞭解數字的機器表示方式。多線程
==================================================== 併發
高級語言程序(可以被人讀懂)——(其餘程序轉換)——>低級機器語言指令——(按照指定格式打包)——>可執行目標文件(也叫作可執行目標文件)(以文件形式存放);編輯器
從源文件到可執行目標文件的過程有四個階段:預處理器、編譯器、彙編器、連接器;
預處理器
編譯前對源程序hello.c的替換與處理。結果是獲得另外一個C程序,即hello.i。
編譯器
將文本文件hello.i翻譯成文本文件hello.s,即彙編語言程序。
彙編器
將hello.s翻譯成機器語言指令。把這些指令打包成一種叫作可重定位目標程序(relocatable object program)的格式。並將結果保存在目標文件hello.o中。hello.o文件是二進制文件,它的字節編碼是機器語言指令而不是文本字符,因此用文本編輯器打開的話將會看到一堆亂碼。
連接器
例如hello程序中調用了printf函數,它是每一個C編譯器都會提供的標準C庫中的一個函數。printf函數存在於一個名爲printf.o的單獨的預編譯好了的目標文件中。這個文件必須以某種方式合併到咱們的hello.o程序中。連接器就是負責處理這種合併的。
GNU項目:開源的,開發出包含Unix操做系統的全部主要部件的環境。(內核除外,Linux項目是獨立發展出來的),GNU環境包括:EMACS編輯器、GCC編譯器、GDB調試器、彙編器、連接器、處理二進制文件的工具以及其餘一些部件。
GCC編譯器已經發展成針對不一樣的語言,不一樣的機器生成代碼。
====================================================
瞭解編譯器的重要的緣由:優化程序性能,理解連接時出現的錯誤,避免安全漏洞;
====================================================
Shell是一種命令行解釋器,它輸出提示符,等待你輸入一個命令行,而後去執行這個命令。若是該命令行的第一個單詞不是一個內置的外殼命令,那麼外殼將會假設這是一個可執行文件名字,加載並運行這個文件。
典型系統的硬件組成:
總線:被設計成傳輸定長的字節塊,也就是字(word)。字長是一個基本的系統參數。例如32位(4個字節)字長。
I/O設備:系統與外部世界的聯繫通道。每一個I/O設備都經過控制器或者適配器與I/O總線相連。控制器與適配器之間的區別主要在於它們的封裝方式。它們的功能都是在I/O總線和I/O設備之間傳遞信息。適配器是一塊插在主板插槽的卡。控制器是置於I/O設備自己的或者系統的主印製電路板上的芯片組。
主存:
主存是一個臨時存儲設備。在處理器執行程序時,用於存放程序和程序處理的數據。物理上來說:主存是一組DRAM芯片組。邏輯上來說:是線性的字節數組,每一個字節都有其惟一的地址。
處理器:
CPU,或處理器,解釋或執行存儲在主存中的指令的引擎。
處理器的核心是:一個字長的存儲設備,(或寄存器)。稱爲程序計數器PC,在任什麼時候刻PC都指向主存中的某條機器語言指令(即PC中存有該指令在主存中的地址)。
一個很是簡單的指令執行模型:處理器按照這個模型運做。
這個模型由指令集結構決定。
在整個模型中,執行一條指令按照一系列步驟展開:1、處理器從PC指向的存儲器中讀取指令;2、解釋指令中的位,執行該指令指示的簡單操做;3、更新PC,使其指向下一條指令,而這一條指令並不與剛剛執行的指令相鄰;
這些操做都是圍繞:主存(內存)、寄存器文件(小的存儲設備,一些1字長的寄存器組成)、算數/邏輯單元(ALU負責計算新的數據和地址值)進行的。
CPU在指令的要求下可能進行以下操做:
加載:主存->寄存器;
存儲:寄存器->主存;
操做:將連個寄存器的內容複製到ALU,ALU對這兩個字作算術運算,將結果保存到另外一個寄存器中;
跳轉:從指令自己抽取一個字,並將這個字複製到程序計數器PC中,以覆蓋PC中原來的值。
處理器看上去只是它的指令集結構的簡單實現,可是實際上現代處理器用了很是複雜的機制來加速程序的執行。
指令集結構:描述的是每條機器代碼指令的效果;-->研究機器代碼時考慮的是機器的指令集結構所提供的抽象性;
微體系結構:描述的是處理器其實是如何實現的;-->處理器其實是如何實現的
利用DMA技術,數據能夠不經過處理器而直接從磁盤到達主存。
====================================================
系統花了大量的時間把信息從一個地方挪到另外一個地方。從程序員角度來看,這實際上就是開銷,減緩了程序的「真正」的工做。系統設計者的主要目標就是使這些複製操做盡量快地完成。
處理器愈來愈快,可是主存的速度更不上。系統設計者採用了更小、更快的存儲設備,告訴緩存存儲器(簡稱高速緩存),做爲暫時的集結區域,用於存放處理器近期可能會須要的信息。
三級高速緩存:L1(比L2快5倍)、L2(SRAM比主存快5~10倍)、L3(比主存快,主存屬於L4);
L0是寄存器;
利用高速緩存,程序員能夠將他們的程序性能提升一個數量級。--->如何利用高速緩存?
====================================================
L0:寄存器,最快(可是相應地造價更高,存儲空間更小);
L1:L1高速緩存;
L2:L2高速緩存;
L3:L3高速緩存;
L4:主存(DRAM);
L5:本地二級存儲(本地磁盤);
L6:遠程二級存儲(分佈式文件系統,Web服務器);
====================================================
應用程序不直接操做硬件,而是經過操做系統。操做系統提供兩大基本功能:
1)防止硬件被失控的應用程序濫用;
2)嚮應用程序提供簡單一致的機制來控制複雜而又一般截然不同的低級硬件設備;
操做系統實現這兩大功能,經過幾個基本的抽象概念:進程、虛擬存儲器、文件;
抽象表示:
文件是對I/O設備的抽象表示;
虛擬存儲器是對主存和磁盤I/O設備的抽象表示;
進程是對處理器、主存和I/O設備的抽象表示;
進程是計算機中最重要和最成功的概念之一;
進程是操做系統對一個正在運行的程序的一種抽象。操做系統保持跟蹤進行運行所需的全部狀態消息。這種狀態,也就是上下文。任什麼時候刻,單處理器系統都只能執行一個進程的代碼。當操做系統決定要把控制權從一個進程轉移到另外一個進程時,就會進行上下文切換,即保存當前進程的上下文,恢復新進程的上下文。而後將控制權轉移到新進程上。因此會讓用戶看上去好像計算機在同時執行多個程序。
實現進程這一抽象概念須要硬件和操做系統軟件之間緊密配合。
一個進程實際上能夠由多個稱爲線程的執行單元組成。每一個線程都運行在進程的上下文中,並共享一樣的代碼和全局數據。多線程之間比多進程之間更容易共享數據。線程通常來講比進程更高效。因爲網絡服務器對並行處理的需求,線程成爲一種愈來愈重要的編程模型。線程是一種使程序運行更快的方法,
虛擬存儲器是一種抽象概念,它爲每一個進程提供一種假象,即每一個進程都在獨佔地使用主存。每一個進程看到的是一致的存儲器,虛擬地址空間。
程序代碼的數據 :對於全部進程來講,代碼是從同一固定地址開始的,緊接着的是和C全局變量相對應的數據位置。
堆:緊隨着代碼和數據的是堆,代碼和數據區在進程一開始運行時就被規定了大小。當調用入malloc和free這樣的C標準庫函數時,對能夠在運行時動態地擴展和收縮。、
共享庫:地址空間的中間部分是用來存放像C標準庫和數學庫這樣共享庫的代碼和數據的區域。共享庫的概念很是強大,也至關難懂。
棧:用戶棧,用它來實現函數調用。
內核虛擬存儲器:內核老是駐留在內存中,是操做系統的一部分。對用戶代碼來講是不可見的。
虛擬存儲器的運做須要硬件和操做系統之間很是複雜的配合,包括對處理器生成的每一個地址的硬件翻譯。其基本思想就是把一個進程虛擬存儲器的內容存儲在磁盤上,而後用主存做爲磁盤的高速緩存。
圖:進程的虛擬地址空間
文件就是字節序列,僅此而已。每一個I/O設備,包括磁盤,鍵盤,顯示器,甚至網絡,均可以視爲文件。系統中的全部輸入輸出都是經過使用一小組稱爲Unix I/O 的系統函數調用讀寫文件來實現的。
文件這個概念簡單精緻但內涵豐富。它嚮應用程序提供了統一的視角,來看待系統中可能含有的各式各樣的I/O設備。
====================================================
現代系統一般經過網絡與其餘系統相連。從單一的系統視角來看,網絡可視爲一個I/O設備。網絡-網絡適配器的模型,說明網絡也是一種I/O設備。
客戶端和服務器的交互模式在網絡應用中是很是常見的 。
====================================================
系統不只僅是硬件,系統是硬件和系統軟件互相交織的集合體。
兩個需求:計算機作得更多,計算機作得更快;
推進了驅動的進步。
併發是一個通用的概念,是指一個同時具備多個活動的系統;
並行指的是用併發使一個系統運行得更快;
並行能夠在計算機系統的多個抽象層次上運用。
1線程級併發
對於單核系統來講,這種併發只是模擬出來的。
多核才能實現真正的併發;
2指令級並行
現代處理器能夠同時執行多條指令的屬性被稱爲指令級並行。
3 單指令、多數據並行
抽象的使用是計算機科學中最爲重要的概念之一;
指令集結構:提供了對處理器硬件的抽象;
這裏再增長一個抽象:虛擬機,它提供對整個計算機的抽象。
====================================================
計算機系統是由硬件以及軟件組成的,它們共同協做以運行應用程序。計算機內部的信息被表示爲一組組的位。它們根據上下文有不一樣的解釋方式。程序被其餘程序翻譯成不一樣的形式,一開始是ASCII文本,後來被編譯器和連接器翻譯成二進制可執行文件。
存儲設備劃分層次結構;
操做系統內核是應用程序與硬件之間的媒介,它提供三種基本的抽象:1)文件是對I/O設備的抽象。2)虛擬存儲器是對主存和磁盤的抽象。3)進程是對處理器、主存和I/O設備的抽象。
網絡提供計算機系統之間通訊的手段,從特定操做系統的角度看,網絡就是一種I/O設備抽象。