1. 程式人生 > >深入理解計算機系統學習筆記(一)

深入理解計算機系統學習筆記(一)

程式的編譯過程

為了說明程式的編譯過程,我們用經典的hello world程式作為例子

#include <stdio.h>

int main(int argc, char const *argv[])
{
    printf("hello world!!!\n");
    return 0;
}

在linux系統中,我們用GCC編譯器將源程式檔案helloworld.c編譯成可執行目標檔案helloworld。

zengwh@zengwh:~/test_code$ gcc helloworld.c -o hello
zengwh@zengwh:~/test_code
$ ./hello hello world!!!

這個過程經過四個階段,分別是預處理階段,編譯階段,彙編階段和連結階段。執行這個四個階段的程式分別是前處理器,編譯器,彙編器和連結器,一起構成了編譯系統。
這裡寫圖片描述

  • 預處理階段:前處理器(cpp)根據‘#’包含的標頭檔案,將標頭檔案的內容加進源程式中。得到新的程式檔案文字,以“.i”為副檔名。比如說helloworld程式包含stdio.h標頭檔案,這個階段將這個標頭檔案的內容插進源程式中
  • 編譯階段:編譯器(ccl)將文字檔案hello.i翻譯成彙編程式hello.S。也就是將高階語言翻譯成彙編程式碼,低階的機器語言指令。
  • 彙編階段:彙編器(as)將彙編程式hello.S翻譯成機器指令,將這些指令打包成可重定位目標程式的格式,並把結果儲存在hello.o檔案中,hello.o是個二進位制檔案。
  • 連結階段:連結器(ld)將會把一個工程中所有的.o檔案連結合併成一個可執行目標檔案,可以被載入在記憶體中,由系統執行。

系統硬體組成

這裡寫圖片描述

快取記憶體(Caches)

快取記憶體用來存放處理器近期可能需要的資訊,用來加快程式在CPU的執行,下圖是一個典型系統中的快取記憶體儲存器。
這裡寫圖片描述
位於處理器晶片上的L1快取記憶體訪問速度跟訪問暫存器的速度幾乎一樣快,L2快取記憶體通過一條特殊的匯流排連線到CPU,訪問速度比L1慢5倍左右,但比訪問主存要快5-10倍。更新的系統還會有L3快取記憶體,他們都是用一種SRAM的硬體技術實現的。這樣,系統就可以獲得很大的一塊儲存器,而且訪問速度也很快。
程式具有訪問區域性區域裡的資料和程式碼的趨勢。通過將可能經常訪問的資料儲存在快取記憶體中的方法,大部分的儲存器操作都將在快速的快取記憶體中完成,程式效能大大提升。

作業系統管理硬體

在處理器中,指令集結構是對實際處理器硬體的抽象,在作業系統中,檔案是對I/O的抽象,虛擬儲存器是對程式儲存器的抽象,程序是對一個正在執行的程式的抽象,虛擬機器則是對整個計算機(包括作業系統,處理器和程式)的抽象
這裡寫圖片描述

程序

程序是作業系統中對一個正在執行的程式的一個抽象。一個系統可以同時執行多個程序程式,而每個程序都好像獨佔使用硬體。併發執行則是說一個程序的指令和另一個程序的指令是交錯執行的。

執行緒

一個程序可以由多個執行緒組成,每個執行緒執行在程序的上下文中,並共享同樣的程式碼和全域性資料。

虛擬儲存器

虛擬儲存器是一個抽象概念,為每個程序提供一個假象,即每個程序好像在獨佔使用主存。每個程序看到的是一致的儲存器,即是虛擬地址空間。圖中的地址是從下往上增大。
這裡寫圖片描述

  • 程式程式碼和資料:對所有程序來說,程式碼都是從同一固定地址開始,接著就是全域性變數對應的資料位置。程式碼和資料區一開始執行就已經規定大小。
  • 堆:堆可以執行的時候動態地擴充套件和收縮,比如呼叫malloc或free函式的時候。
  • 共享庫:大約在地址中間,用來存放像C標準庫或數學庫這樣共享的程式碼和資料區域。
  • 棧:位於使用者虛擬地址空間頂部的是棧,編譯器同它來實現函式呼叫。和堆一樣,在程式執行期間可以動態地擴充套件和收縮。每呼叫函式,棧增長,函式返回,棧收縮。
  • 核心虛擬儲存器:地址空間頂部區域是為核心保留的,不允許應用程式讀寫這個區域的內容或者直接呼叫核心程式碼定義的函式。

相關推薦

深入理解計算機系統學習筆記

程式的編譯過程 為了說明程式的編譯過程,我們用經典的hello world程式作為例子 #include <stdio.h> int main(int argc, char const *argv[]) { printf("hell

深入理解計算機系統筆記棧【插圖】

歡迎檢視《深入理解計算機系統》系列部落格 《深入理解計算機系統》筆記(一)棧(本篇) ------------------------------------------------------------------------------------------

3.2《深入理解計算機系統筆記內存和高速緩存的原理【插圖】

img sram 本質 text ddr rate too 是我 很大的 《深入計算機系統》筆記(一)主要是講解程序的構成、執行和控制。接下來就是運行了。我跳過了“處理器體系結構”和“優化程序性能”,這兩章的筆記繼續往後延遲! 《深入計算機系統》的一個很大的用處

深入理解計算機系統配套實驗 data lab 函式詳解

/* 135. * bitAnd - x&y using only ~ and | 136. * Example: bitAnd(6, 5) = 4 137. * Legal ops: ~ | 138. * Max ops: 8 139. *

深入理解計算機系統筆記記憶體和快取記憶體的原理【插圖】

歡迎檢視《深入理解計算機系統》系列部落格 --------------------------------------------------------------------------------------------------------------

深入理解C指標學習筆記

第一章 認識指標 指標在C和C++中隨處可見,它給程式設計師帶來了極大的方便,指標為動態記憶體的分配提供了重要支援。使用指標我們可以方便的操控記憶體,提高程式的執行效率;同時利用指標變數我們可以實現各種資料結構,例如連結串列等;另一方面指標與陣列的表示法

深入理解計算機系統筆記連結知識【附圖】

歡迎檢視《深入理解計算機系統》系列部落格 --------------------------------------------------------------------------------------------------------------

[計算機基礎]計算機系統學習筆記

1,ASCII嗎  ASCII碼的含義就是用一個唯一的位元組大小的整數值來表示每個字元。 ASCII碼對照表  例如:文字檔案  sss  qhd  以上文字檔案對應的二進位制檔案是: 00000000h: 73 73 73 0D 0A 71 64 63          

深入理解計算機作業系統學習筆記

前言 《深入理解計算機作業系統》這本書是作業系統領域內非常經典的書,只要在網上搜索作業系統的書籍,必然會有人推薦這一本書,這本書也被各路大牛所推薦。雖然之前在圖書館借過這本書,但是匆匆看了一遍,只是記住了皮毛,最近下決心買了本紙質版的書,準備重讀經典,順便寫下讀書的收穫與思考。 這本

分布式系統學習筆記

常見 算法 特征 最大 普通 部分 AR 復制 完美 1.分布式架構的發展歷史   1.1 1946 年情人節(2.14) , 世界上第一臺電子數字計算機誕生在美國賓夕法尼亞大學大學,它的名字是:ENIAC; 這臺計算機占地 170 平米、重達 30 噸,每秒可進行 5

深入理解Java虛擬機器筆記

內容主要參考《深入理解Java虛擬機器(第2版)》 Java和C++之間有一堵由記憶體動態分配和垃圾收集技術所圍成的“高牆”,牆外面的人想進去,牆裡面的人想出來。 一 JVM執行時資料區 執行時資料區結構如下圖: 1 程式計數器:記憶體較小,執行緒執行的位元組碼的行號指

深入理解linux核心》筆記

第一章:緒論 Linux 是真UNIX核心 Linux原始碼通常在/usr/src/linux目錄下 執行緒之間的上下文切換比普通程序之間花費代價少,因為前者通常在一個共同的地址空間執行 linux是非搶佔式核心,意味不能交錯執行處於特權模式下的流 X.x.x 第

深入理解計算機系統學習筆記

一、資訊就是位 + 上下文 作者使用的標題是:資訊就是位 + 上下文,那麼問題來了:什麼是位?什麼是上下文? 計算機系統是由硬體和系統軟體組成的,它們共同工作來執行應用程式。所有計算機系統都有相似的硬體和軟體元件,它們執行著相似的功能。 從某種意義上來說,本書的目的就是要幫助你

深入理解計算機系統》| 學習筆記

一、資訊就是位 + 上下文 作者使用的標題是:資訊就是位 + 上下文,那麼問題來了:什麼是位?什麼是上下文? 計算機系統是由硬體和系統軟體組成的,它們共同工作來執行應用程式。所有計算機系統都有相似的硬體和軟體元件,它們執行著相似的功能。 從某種意義上來說,本書的目的

深入理解java虛擬機器學習筆記

Java記憶體區域模型 Java虛擬機器在執行Java程式的過程中,會把它所管理的記憶體區域劃分為若干個不同的資料區域,這些區域一般被稱為執行時資料區(Runtime Data Area),也就是我們常說的JVM記憶體。 執行時資料區通常包括以下這幾個部分: 程式計數器(Program Counte

深入理解JAVA虛擬機器學習筆記JVM記憶體模型

一、JVM記憶體模型概述 JVM記憶體模型其實也挺簡單的,這裡先提2個知識點: 1、組成:java堆,java棧(即虛擬機器棧),本地方法棧,方法區和程式計數器。 2、是否共享:其中方法區和堆區是執行緒共享的,虛擬機器棧,本地方法棧和程式計數器是執行緒私有的,也稱執行緒

深入理解計算機系統學習1

原始檔:0, 1 組成每行以一個看不見的’\n’結尾, 執行一個原始檔分四個階段:預處理, 編譯,彙編,連線 .i 檔案:.c檔案預處理後生成 .ii檔案: .cpp檔案預處理後生成 預處理階段:前處理器(cpp)根據以#開頭的命

系統分析與設計學習筆記

學習 掌握 應該 溝通 基本 最終 表示 對象 毫無 為什麽要學習這門課程?   “擁有一把錘子未必能成為建築師”。 這門課程學習的是面向對象分析和設計的核心技能的重要工具。對於使用面向對象技術和語言來,創建設計良好、健壯且可維護的軟件來說,這門課程所

深入理解計算機系統_3e 第十章家庭作業 CS:APP3e chapter 11 homework

cep serve 技術分享 apn only class control 相同 法則 註:tiny.c csapp.c csapp.h等示例代碼均可在Code Examples獲取 11.6 A. 書上寫的示例代碼已經完成了大部分工作:doit函數中的printf("%

Linux視訊學習筆記--系統分割槽

宣告:本系列文章是博主根據 “兄弟連新版Linux視訊教程”做的筆記和視訊截圖,只為學習和教學使用,不適用任何商業用途。 PS:如果對Linux感興趣,建議去看《細說Linux》,沈超老師和李明老師的教學風格我很喜歡:)   視訊2.1-VMWare虛擬機器安裝與使用