深入理解計算機系統1

2022-07-10 01:09:10 字數 3785 閱讀 2032

hello.c

#include int main()

源程式(原始檔)實際上就是乙個由0和1組成的位(又成位元bit)序列,8個位被組組成一組,稱為位元組。每個位元組表示程式中的某些文字字元(大部分的現代計算機系統都使用ascii標準來表示文字字元)

hello.c -> 預處理器(cpp) -> hello.i(修改了源程式文字-將#include、巨集 進行相應的替換) -> 編譯器(ccl) -> hello.s(翻譯成匯程式設計序文字) -> 彙編器(as) -> hello.o(翻譯成機器語言指令) -> 鏈結器(ld) -> hello(可執行檔案)

系統硬體的組成

1.匯流排

貫穿剩個系統的是一組電子管道,稱為匯流排,它攜帶資訊位元組並負責在各個部件間傳遞。通常匯流排被設計成傳遞定長的位元組塊,也就是子(word).字重的位元組數(即字長)是乙個基本的系統引數,各個系統中都不盡相同.現在的大多數機器位元組長要麼是4個位元組(32位),要麼是8個位元組(64位)

2.i/o裝置

i/o(輸入/輸出)裝置是系統與外部世界的聯絡通道

3.主存

主存是乙個臨時儲存裝置,在處理器執行程式時,用來存放程式和程式處理的資料.從物理上來說,主存是由一組動態隨機存訪問儲存器(dram)晶元組成的.從邏輯上來說,儲存器是乙個線性的位元組陣列,每個位元組都有其唯一的位址(陣列索引),這些位址是從零開始的.一般來說,組成程式的每條機器指令都由不同數量的位元組構成

4.處理器

**單元處理器(cpu),簡稱處理器,是解釋(或執行)儲存在主存中指令的引擎.處理器的核心是乙個為乙個字的儲存裝置(或暫存器),稱為程式計數器(pc).在任何時刻,pc都指向主存中的某條機器語言指令(即含有該條指令的位址)

從系統痛點開始,直到系統斷電,處理器一直在不斷地執行程式計算器指向的指令,在更新程式計數器,使其指向下一條指令.處理器看上去是按照乙個非常簡單的執行模型來操作的,這個模型是由指令集架構決定的.這個模型中,指令按照嚴格的順序執行,而執行一條指令包含執行一系列步驟.處理器從程式計數器指向的記憶體處讀取指令,解釋執行中的位,執行指令指示的簡單操作,然後更新pc,使其指向下一條指令,而這條指令並不一定和記憶體中剛跟執行的指令相鄰.

這樣的簡單操作並不多,它們圍繞著主存、暫存器檔案(register file)和算數/邏輯單元(alu)進行.暫存器檔案是乙個小的儲存裝置,由一些單個字長的暫存器組成,每個暫存器都有唯一的名字.alu計算新的資料和位址值.下面是一些簡單的操作的例子,cpu在指令的要求下可能會執行這些操作

- 載入:從主存複製乙個位元組或者乙個字到暫存器,以覆蓋暫存器原來的內容

- 儲存:從暫存器複製乙個位元組或者乙個字到主存的某個位置,已覆蓋這個位置上原來的內容

- 操作:把兩個暫存器的內容複製到alu,alu對著兩個字做算術運算,並將結果存放到乙個暫存器中,已覆蓋暫存器中原來的內容

- 跳**從指令本身抽取乙個字,並將這個字複製到程式計數器(pc)中,以覆蓋pc中原來的值

在處理器和乙個較大較慢的裝置(例如主存)之間插入乙個更小更快的儲存裝置(例如告訴快取)的想法已經成為乙個普遍的觀念.實際上,每個計算機系統中的儲存裝置都被組織成了乙個儲存器層次結構,在這個層次結構中,從上至下,裝置的訪問速度越來越慢,容量越來越大,並且每個位元組的造價也越來越便宜.暫存器檔案在層次結構中位於頂層,也就是第0級或記為l0.

作業系統有兩個基本的功能:

- 防止硬體被失控的應用程式濫用

- 向應用程式提供簡單一直的機制來控制複雜而又通常大不相同的低階硬體裝置

作業系統通過幾個基本的抽象概念(程序、虛擬記憶體和檔案)來實現這兩個功能

!(如上圖所示:檔案是對i/o裝置的抽象表示,虛擬記憶體是對主存和磁碟i/o裝置的抽象表示,程序則是對處理器、主存和i/o裝置的抽象表示

程序
```程序```是作業系統對乙個正在執行的程式的一種抽象.在乙個系統上可以同時執行多個進行,而每個程序都好像在獨佔地使用硬體.而```併發執行```,則是說乙個程序的指令和另乙個程序的指令是交錯執行的.在大多數系統中,需要執行的程序數是多於可以執行他們的cpu個數的.傳統系統在乙個時刻只能執行乙個程式,而先進的多核處理器同時能夠執行多個程式,這是通過處理器在程序間切換來實現的.作業系統是新建這種交錯的機制稱為```上下文切換```

作業系統保持跟蹤程序執行所需的所有狀態資訊.這種狀態,也就是上下文,包括許多資訊,入pc和暫存器we年的當前值.當作業系統決定要把控制權從當前程序轉移到某個新程序時,就會進行上下文切換,即儲存了當前程序的上下文、恢復新程序的上下文,然後將控制權傳遞到新程序.新程序就會從它上次停止的地方開始

執行緒

儘管通常我們認為乙個程序只有單一的控制流,但是在現代系統中,乙個程序實際上可以由多個稱為```執行緒```的執行單元組成,每個執行緒都執行在進行的上下文中,並共享同樣的**和全域性資料.由於網路伺服器中對並行處理的需求,現場稱為越來越重要的程式設計模型,因為多執行緒之間比多程序之間更容易資料共享,也因為執行緒一般來說都比程序更高效.當有多處理器可用的時候,多執行緒也是一種使得程式可以執行的更快的方法
虛擬記憶體
虛擬記憶體是乙個抽象的概念,它為每個程序提供了乙個假象,即每個程序都在獨佔地使用主存.每個程序看到的記憶體都是一致的,稱為```虛擬位址空間```.

在linux中,位址空間最上面的區域是保留給作業系統中的**和資料的,這對所有程序來說都是一樣的.位址空間的底部區域存放使用者進行定義的**和資料(下圖中位址是從下往上增大的)

每個程序看到的虛擬位址空間由大量準確定義的區域構成,每個區都有專門的功能

- 程式**和資料:對所有的程序來說,**時從同一固定位址開始,緊接著是和c全域性變數相對應的資料位置.**的資料區是直接按照可執行目標we年的內容初始化,在示例中就是可執行檔案 hello.

- 堆:**和資料區後緊隨著的是執行時```堆```.**和資料區在程序一開始執行時就被制定了大小,與此不同,當呼叫了malloc和free這樣的c標準庫函式時,堆可以在執行時動態地擴充套件和收縮

- 共享庫:大約在位址空間的中間部分是一塊用來存放像c標準庫和數學庫的共享庫的**和資料的區域.共享庫的概念非常強大,也相當難懂

- 棧:位於使用者虛擬位址空間頂部的是```使用者棧```,編譯器用它來實現函式呼叫.和堆一樣,使用者棧在程式執行期間可以動態的擴充套件和收縮.特別的,每次我們呼叫乙個函式時,棧會增長;從乙個函式返回時,棧胡收縮

- 核心虛擬記憶體:位址空間頂部的區域是為了核心保留的.不允許應用程式讀寫這個區域的內容或者直接呼叫核心**定義的函式.相反,它們必須呼叫核心來執行這些操作

檔案
檔案就是位元組序列,僅此而已.每個i/o裝置,包括磁碟、鍵盤、顯示器、甚至網路,都可以看成是檔案.系統中的所有輸入輸出都是通過使用一小組稱為 unix i/o的系統函式呼叫來讀寫檔案實現的

檔案這個簡單而精緻的概念是非常強大的,因為它向應用程式提供了乙個統一的檢視.

深入理解計算機系統

關鍵路徑是在迴圈的反覆執行中形成的資料相關鏈。迴圈展開是一種程式變換,通過增加每次迭代計算的元素的數量,減少迴圈的迭代次數。重新結合變換能夠減少計算中關鍵路徑上操作的數量,通過更好地利用功能單元的流水線能力得到更好的效能。浮點運算不保證是可結合的,通常迴圈展開和並行地累積在多個值中,是提高程式效能的...

《深入理解計算機系統》

知乎 深入理解計算機系統 這本書需要什麼水平能看懂?15 213 18 218 15 513 introduction to computer systems schedule fall 2016 鏈結失效則 cmu15 213的課程主頁,有ppt,還有錄影,主講人就是這本書的作者。備註 備註 詳細...

深入理解計算機系統

系統的硬體組成 快取記憶體 作業系統管理硬體 程序虛擬記憶體 檔案amdahl定律 併發和並行 0和1組成的位序列,又稱為位元序列,8個位被組織成一組,成為位元組。每個位元組表示程式中的某些文字字元。系統中的所有資訊 包括磁碟檔案 記憶體中的程式 記憶體中存放的的使用者資料以及網路上傳送的資料,都是...