第一章計算機系統漫遊

概述

	計算機系統是由硬件和軟件組成的
	一個最基本的c語言程序:
		#include<stdio.h>
				
		int main()
		{
			printf("hello world");
			return 0;
		}

1.信息就是位+上下文

  1. hello程序的生命週期是從一個源程序開始的,即程序員通過編輯器創建並保存的文本文件,文件名是hello.c。源程序實際上就是一個由值0和1組成的位(又稱爲比特)序列,8個位被組成一組,稱爲字節。
  2. Hello.c程序是以字節序列的方式儲存在文件中的。每個字節都有一個整數值,對應於某些字符。例如,第一個字節的整數值是35,它對應的字符是"#"。每個文本行都是以一個看不見的換行符’\n’來結束的,它對應的整數值爲10。像hello.c只由ASCII字符構成的文件稱爲文本文件,所有的其他文件稱爲二進制文件
  3. Hello.c的表示方法說明:系統中的所有信息------包括磁盤文件、內存中的程序、內存中存放的用戶數據以及網絡上傳送的數據,都是由一串比特表示的。區分不同對象的唯一的方法是我們讀到這些這些數據對象時的上下文。

2.程序被其他程序翻譯成不同的格式

  1. 爲了在系統上能夠運行hello.c程序,每條c語句都必須被其他程序轉化爲低級語言指令,然後這些指令按照一種稱爲可執行目標程序的格式打好包,並以二進制的磁盤文件的形式存放起來。目標程序也成爲可執行目標文件。

  2. 從源文件向目標文件的轉換是由編譯器的驅動程序完成的

  3. 從源文件到目標文件轉換需要四個步驟:

    1. 預處理階段:預處理器(cpp)根據以字符#開頭的命令,修改原始的c程序。比如#include<stdio.h>就是告訴預處理器讀取系統頭文件stdio.h的內容,並把它直接插入到程序文本中,得到另一個c程序,以.i爲擴展名
    2. 編譯階段:編譯器(ccl)將文本文件hello.i翻譯成文本文件hello.s,它包含一個彙編語言程序
    3. 彙編階段:彙編器(as)將hello.s翻譯成機器語言指令,把這些指令打包成一種叫做可重定位目標程序的格式,並將結果保存在目標文件hello.c中。
      鏈接階段:printf函數存在於一個名爲printf.o單獨編譯好的文件中,這個文件要合併到hello.o程序中,鏈接器(ld)負責處理這種合併。結果就得到了hello文件,他是一個可執行的目標文件。
      在這裏插入圖片描述

3.瞭解編譯系統如何工作是大有益處的

		1. 優化程序性能
		2. 理解鏈接時出現的錯誤
		3. 避免安全漏洞

4.處理器讀並解釋儲存在內存中的指令

要在Unix系統上運行可執行文件,應將文件名輸入到稱爲shell的應用程序中。shell是一個命令解釋器,它輸出一個提示符, 等待輸入一個命令行,然後執行這個命令。如果該命令的第一個單詞不是一個內置的shell命令,那麼shell就會假設這是一個可執行文件的名字,它將加載並運行這個文件。

  1. 系統的硬件的組成
    1. 總線
      總線,是貫穿整個系統的一組電子管道,它攜帶信息字並負責在各個部件間信息傳遞。通常總線被設計成傳送定長的字節塊,也就是字。
    2. I/O設備
      I/O設備是系統與外部世界的聯繫通道。每個I/O設備都通過一個控制器或適配器與I/O總線相連。控制器和適配器的主要區別是他們的封裝方式。控制器是I/O設備本身或者是主板上的芯片組,適配器是一塊插在主板上的卡。它們的功能都是在I/O總線和I/O設備之間傳遞信息
    3. 主存
      主存是一個臨時存儲設備,用來存放程序和程序要處理的數據。從物理上來說,主存是由一組動態隨機存取存儲器(DRAM)芯片組成。從邏輯上來說,存儲器是一個線性的字節數組,每個字節都有唯一的地址,這些地址是從零開始。一般來說,每條機器指令是由不同的字節數量的字節組成
    4. 處理器
      1. 中央處理單元,是解釋或執行存儲在主存中的指令引擎。處理器的核心是一個大小爲一個字的存儲設備,即程序計數器(PC),PC一直指向主存中的某條機器語言指令(即含有該條指令的地址)
      2. 從系統通電開始,處理器一直不斷的執行PC所指向的指令,在更新程序計數器,使其指向下一條指令。
      3. 一些簡單操作的例子
        1. 加載:從主存中複製一個字節或者一個字到寄存器中,以覆蓋原來寄存器中的內容
        2. 存儲:從寄存器複製一個字節或一個字到主存的某個位置,以覆蓋這個位置上原來的內容
        3. 操作:把兩個寄存器的內容複製到ALU,ALU對這兩個字做算數運算,並將結果存放到一個寄存器中,以覆蓋該寄存器中原來的內容
        4. 跳轉:從指令本身抽取一個字,並將這個字複製到程序計數器(PC)中,以覆蓋PC中原來的值。

在這裏插入圖片描述
2. 運行hello程序(分爲3步)

  1. 初始時,shell程序執行他的指令,等待我們輸入一個命令。當我們在鍵盤上輸入"./hello"後,shell程序將字符逐一讀入寄存器,並把他們放到內存中
  2. 當敲下回車鍵時,shell程序就知道我們結束了命令的輸入。然後shell執行一系列指令來加載可執行的hello文件,這些指令將hello目標文件中的代碼和數據從磁盤複製到主存
  3. 當目標文件hello中的代碼和數據被加載到主存,處理器就開始執行hello程序中的main程序中的機器語言指令。這些指令將"hello,world\n"字符串中的字節從主存複製到寄存器文件,再從寄存器文件中複製到顯示設備,最終顯示在屏幕上。

5.高速緩存至關重要

  1. 高速緩存存儲器(cache memory)存放處理器近期可能會需要的信息

  2. L1和L2高速緩存是用一種叫做靜態隨機訪問存儲器(SRAM)的硬件技術實現

  3. 三級高速緩存:L1、L2、L3

  4. 系統可以獲得一個很大的存儲器,同時訪問的速度也很快,原因是利用了高速緩存的局部性原理,即程序具有訪問局部區域裏的數據和代碼的的趨勢。

6.存儲設備形成層次結構

在這裏插入圖片描述

7.操作系統管理軟硬件

操作系統是應用程序和硬件之間插入的一層軟件
操作系統由兩個基本功能:
	1. 防止硬件被失控的應用程序濫用
	2. 嚮應用程序提供簡單統一的機制來控制複雜而又通常大不相同的低級硬件設備
文件是對I/O設備的抽象,虛擬內存是對主存和磁盤I/O設備的抽象表示,進程則是對處理器、主存和I/O設備的抽象表示
1. 進程
  1. 進程是操作系統對一個正在運行的程序的一種抽象。併發運行,則是指一個進程的指令和另一個進程指令是交錯執行的。
  2. 無論是在單核還是在多核系統中,一個CPU看上去是在併發的執行多個進程,這是通過處理器在進程間的切換來實現的。操作系統實現這種交錯執行的機制稱爲上下文切換
  3. 操作系統保持跟蹤進程運行所需的所有狀態信息。這種狀態,也就是上下文,包括許多信息,比如PC和寄存器文件的當前值,以及主存的內容。
  4. 當操作系統決定要把控制權從當前進程轉移到某個進程的時候,就會進行上下文切換,即保存當前進程的上下文,恢復新進程的上下文,然後將控制權傳遞到新的進程。
  5. 從一個進程到另一個進程的轉換是由操作系統的內核(kernel)來管理的,內核是操作系統代碼常駐主存的部分。當應用程序需要操作系統的某些操作時,他就執行一條特殊的系統調用指令,將控制權傳遞給內核。然後內核執行被請求的操作並返回應用程序。內核是系統管理全部進程所用代碼和數據結構的集合。
2. 線程
  1. 一個進程實際上是由多個稱爲線程的執行單元組成,每個線程都運行在進程的上下文中,並共享同樣的代碼和全局數據
3.虛擬內存
  1. 虛擬內存是一個抽象概念,它爲每個進程提供了一個假象,即每個進程都在獨佔地使用主存。每個進程看到的內存都是一致的,稱爲虛擬地址空間。地址空間最上面的區域是保留給操縱系統中的代碼和數據的。地址空間的底部區域存放用戶進程定義的代碼和數據。
    在這裏插入圖片描述
  2. 虛擬地址的每一個區的簡單介紹
    1. 程序代碼和數據。對所有的進程來說,代碼是從同一固定的地址開始的,緊接着的是和C全局變量相對應的數據位置。代碼和數據區是直接按照可執行目標文件的內容初始化的。
    2. 堆。代碼和數據區後緊接着的是運行時堆。當調用malloc和free這樣的C標準庫函數時,堆可以在運行時動態地擴展和收縮
    3. 共享庫。大約在地址空間的中間部分是一塊用來存放像C標準庫和數學庫這樣的共享庫的代碼和數據的區域
    4. 棧。位於用戶虛擬地址空間頂部的是用戶棧,編譯器用他來實現函數調用。用戶棧也可以在程序執行的期間動態的擴展和收縮
    5. 內核虛擬內存。地址空間頂部的區域是爲內核保留的。不允許應用程序讀寫這個區域的內容或者直接調用內核代碼定義的函數。相反,它們必須調用內核來執行這些操作
4.文件
  1. 文件就是字節序列

8.系統之間利用網絡進行通信

  1. 從一個單獨的系統來看,網絡可視爲一個I/O設備
    在這裏插入圖片描述
  2. 利用telnet通過網絡遠程運行hello
    在talnet客戶端鍵入“hello”字符串並敲下回車鍵後,客戶端軟件就會將這個字符串發送到telnet的服務器。telnet服務器從網絡上接收到這個字符串後,會把它傳給遠端的shell程序。然後,遠端shell運行hello程序,並將輸出行返回給telnet服務器。最後,telnet服務器通過網絡把輸出串轉發給telnet客戶端,客戶端就將輸出串輸出到本地終端
    在這裏插入圖片描述

9.重要主題

  1. Amdahl定律
    當對系統的某個部分進行加速的時候,其對系統整體的性能的影響取決於該部分的重要性和加速程序。

    若系統執行某個應用程序需要的時間爲Told。假設系統某部分所需執行時間與該時間的比例爲a,而該部分性能提升比例爲k。即該部分初始所需時間爲a*Told,現在所需時間爲(a*Told)/k。
    
    因此,總的執行時間爲
    
    				Tnew = (1 - a)* Told + (a * Told)/ k = Told[(1 - a)+ a / k]
    因此加速比爲
    
    	                S = Told / Tnew.    S = 1 / ((1 - a) + a / k)
    
  2. 併發和並行
    併發指一個同時具有多個活動的系統
    並行指用併發來使一個系統運行的更快

    1. 線程級併發
      1. 單處理器系統(一個處理器)
      2. 多處理器系統(多處理器)
        在這裏插入圖片描述
      3. 超線程,也稱爲同時多線程,是一項允許一個CPU執行多個控制流的技術
      4. 多處理器的使用可以從兩方面提高系統的性能
        1. 它減少了在執行多個任務時模擬併發的需要
        2. 它可以使應用程序運行的更快
    2. 指令級並行
      1. 流水線:將執行一條指令所需要的活動劃分成不同的步驟,將處理器的硬件組織成一系列的階段,每個階段執行一個步驟
      2. 超標量處理器:處理器可以達到比一個週期一條指令更快的執行速率
    3. 單指令、多數據並行
      1. 單指令、多數據:允許一條指令產生多個可以並行執行的操作
  3. 計算機系統中抽象的重要性

    1. 計算機系統中的一個重大主題就是提供不同層次的抽象表示,來隱藏實際實現的複雜性
    2. 計算機系統的抽象
      1. 文件是對I/O設備的抽象
      2. 虛擬內存是對程序存儲器的抽象
      3. 進程是對一個正在運行的程序的抽象
      4. 虛擬機是對整個計算機的抽象,包括操作系統、處理器和程序
        在這裏插入圖片描述

上述就是作者的關於第一章的筆記,希望讀者指正,共同深刻的理解計算機

發佈了22 篇原創文章 · 獲贊 13 · 訪問量 4857
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章