讀書筆記-深入理解計算機系統(第一章)

此係列爲讀<深入理解計算機系統>的筆記,如有理解錯誤,望請指正.

第一章 計算機系統漫遊

計算機系統是由硬件和系統軟件組成的,它們共同工作來運行應用程序.

1.1信息就是位+上下文

源程序實際上就是由一個值0和1組成的位(bit)序列,8個位被組織成一組,稱爲字節.每個字節表示程序中某個文本字符.

大部分現代系統都是有ASCII標準表示文本字符,只由ASCII字符構成的文件稱爲文本文件,所有其他文件都稱爲二進制文件.

系統中所有的信息—–包括磁盤文件、存儲器中的程序、存儲器中存放的用戶數據以及網絡上傳送的數據,都是由一串位表示的.區分不同數據對象的唯一方法是我們讀到這些數據對象時的上下文.比如:在不同的上下文中,一個同樣的字節序列可能表示一個整數、浮點數、字符串或者機器指令.

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

此例子爲書中所寫的hello.c的例子,從其生命週期分析系統的執行過程(可見原書)

在Unix系統上,從源文件到目標文件的轉化是由編譯器驅動程序完成的:

unix>gcc -o hello hello.c

執行這四個階段的程序(預處理器、編譯器、彙編器、鏈接器)一起構成了編譯系統(compilation system).

1,預處理階段.預處理器(cpp)根據以字符#開頭,修改原始的C程序.

2,編譯階段.編譯器(ccl)將文本文件hello.i翻譯成文本文件hello.s,它包含一個彙編語言程序.

3,鏈接階段.目標文件合併到我們的hello.o程序中,鏈接器就處理這種合併.得到hello文件,一個可執行目標文件,可以被加載到內存中,由系統執行.

翻譯過程可分爲四個階段完成

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

有一些重要的原因是促使程序員必須知道編譯系統是如何工作的,其原因如下:

  • 優化程序性能:現代編譯器都是成熟的工具,通常可以生成很好的代碼.但是,爲了在C程序中做出好的編碼選擇.我們確實需要了解一些機器代碼以及編譯器將不同的C語句轉化爲機器代碼的方式.例如:while循環比for循環更有效嗎?
  • 理解鏈接時出現的錯誤.一些最令人困擾的程序錯誤往往都與鏈接器操作有關.例如:爲什麼有些鏈接錯誤直到運行時纔會出現?
  • 避免安全漏洞.緩衝區溢出錯誤是造成大多數網絡和Internet服務器上安全漏洞的主要原因.學習安全的第一步就是理解數據和控制信息存儲在程序棧上的方式會引起的後果.

1.4處理器讀並解釋存儲在存儲器中的指令

要想Unix系統上運行該可執行文件,我們將它的文件名輸入到成爲外殼(shell)的應用程序中.

外殼是一個命令解釋器,它輸出一個提示符,等待你輸入一個命令行,然後執行這個命令.

1.4.1 系統的硬件組成
  • 此圖爲Intel Pentium系統產品系列的模型
    Intel Pentium系統產品系列的模型
    CPU:中央處理單元 ALU:算術/邏輯單元 PC:程序計數器 USB:通用串行總線
  • 總線貫穿整個系統的是一組電子管道,稱做總線,它攜帶信息字節並負責在各個部件間傳遞.
  • I/O設備:輸入/輸出(I/O)設備是系統與外部世界的聯繫通道.
  • 主存:主存是一個臨時存儲設備,在處理器執行程序時,用來存放程序和程序處理的數據.
  • 處理器:中央處理單元(CPU),簡稱處理器,是解釋(或執行)存儲在主存中指令的引擎.處理器的核心是一個字長的存儲設備(或寄存器),稱爲程序計數器(PC).
1.4.2運行程序
  • 1,外殼程序將字符逐一讀入寄存器,再把它存放到存儲器中.
  • 2,外殼執行一系列指令來加載可執行的文件,將目標文件中的代碼和數據從磁盤複製到主存.
  • 3,目標文件中的代碼和數據被加載到主存,處理器開始執行程序的main程序中的機器語言指令.這些指令將字符串的字節從主存複製到寄存器文件,再從寄存器文件中複製到顯示設備,最終顯示在屏幕上.

1.5高速緩存至關重要

Tips:

1,程序的機器指令最初是存放在磁盤上,當程序加載時,它被複制到主存.

2,指令又從主存複製到處理器.

3,數據初始時在磁盤上,然後複製到主存,最後從主存複製到顯示設備.

4,較大的存儲設備要比較小的存儲設備運行的慢.

5,加快處理器的運行速度要比加快主存的運行速度要容易和便宜.

  • 爲了解決處理器與主存之間的差異,系統設計採用了更小、更快的存儲設備.(高速緩存)作爲暫時的集結區域,用來存放處理器近期可能會需要的信息.
  • 高速緩存的容量達到數萬字節,訪問速度幾乎和訪問寄存器文件一樣快.
  • 程序具有訪問局部區域裏的數據和代碼的趨勢.
  • 利用高速緩存可以將程序的性能提高一個數量級.

高速緩存

1.6存儲設備形成層次結構

在處理器和一個又大又慢的設備之間插入一個更小更快的存儲設備(高速緩存)的想法已經成爲了一個普遍的觀念.

計算機系統中的存儲設備都被組織成了一個存儲器層次結構.

可以利用對整個存儲層次結構的理解來提高程序性能.

存儲器層次結構的主要思想是一層上的存儲器作爲低一層存儲器的高速緩存.

存儲設備形成層次結構

1.7操作系統管理硬件

1,可以把操作系統看成是應用程序和硬件之間插入的一層軟件.

2,所有應用程序對硬件的操作嘗試都必須通過操作系統.

3,操作系統的兩個基本功能:

  • 防止硬件被失控的應用程序濫用
  • 嚮應用程序提供簡單一致的機制來控制複雜而又大相徑庭的低級硬件設備.

4,操作系統的抽象概念:

  • 文件是對I/O設備的抽象表示.
  • 虛擬存儲器是對主存和磁盤I/O設備的抽象表示.
  • 進程則是對處理器、主存和I/O設備的抽象表示.
1.7.1進程

進程是計算機科學中最重要和最成功的概念之一.

進程是操作系統對一個正在運行的程序的抽象表示.

併發運行時說一個進程的指令和另一個進程的指令是交錯執行的.

併發地執行多個進程,是通過處理器在進程間切換來實現的.

操作系統實現這種交錯執行的機制成爲上下文切換.

操作系統保持跟蹤進程運行所需的所有狀態信息.這種狀態,就是上下文,它包括許多信息(寄存器文件當前的值,主存的內容).

1.7.2線程

一個進程實際上可以由多個稱爲線程的執行單元組成.

每個線程都運行在進程的上下文中,並共享同樣的代碼和全局數據.

多線程之間更容易共享數據.

線程一般來說比進程更高效.

多處理器時,多線程也是使程序更快運行的方法.

1.7.3虛擬存儲器

虛擬存儲器是一個抽象概念,它爲每個進程提供了一個假象.即每個進程都獨享主存.

每個進程看到的一致的存儲器,稱爲虛擬空間地址.

  • 空間地址上面是爲操作系統中的代碼和數據保留的.對所有程序都是一樣的.
  • 地址空間的底部區域存放用戶進程定義的代碼和數據.

每個進程看到的虛擬空間地址由大量的標準定義的區構成.每個區都有專門的功能

  • 程序代碼和數據:對所有進程來說,代碼是從同一個固定地址開始的,緊接着是C全局變量相對的數據位置.(代碼和數據區在程序一開始運行就被規定了固定大小)
  • :代碼和數據區後緊隨着的是運行時堆.堆可以在運行時動態的擴展和收縮.
  • 共享庫:大約在地址空間的中部,一塊用來存放像C標準庫和數學庫這樣的共享庫的代碼和數據的區域.
  • :位於用戶虛擬地址空間頂部的用戶棧.編譯器用它來調用函數.棧在程序執行的過程中可以動態的擴展和收縮.
  • 內核虛擬存儲器:內核總是駐留在內存中,是操作系統的一部分.地址空間的頂部區域是爲內核保留的.其他應用程序不允許讀寫此區域的內容或者調用內核代碼定義的函數.

虛擬存儲器的運作需要硬件和軟件之間複雜精密的交互.包括對處理器生成的每個地址的硬盤翻譯.其基本思想是把一個進程虛擬存儲器的內容存儲在磁盤上,然後用主存作爲磁盤的高速緩存.

1.7.4文件

文件就是字節序列,僅此而已.

系統中的所有輸入輸出都是通過使用一小組稱爲Unix I/O的系統函數調用讀寫文件來實現的.

文件嚮應用程序提供了一個統一的視角,來看待系統中各種I/O設備.

1.8系統之間利用網絡通信

如果系統視爲一個孤立的硬件和軟件的集合體,那麼網絡可以視爲一個I/O設備.

當系統從主存將一串字符串複製到網絡適配器時,數據流經過網絡達到另一臺機器上.

系統可以讀取從其他機器發送來的數據,並將數據複製到自己的主存.

1.9重要主題

系統是硬件和軟件互相交織的集合體,它們必須共同協作以達到運行應用程序的最終目的.

1.9.1併發和並行

計算機的歷史中,兩個需求是驅動技術進步的動力.

  • 希望計算機做的更多
  • 希望計算機做的更快

併發是一個通用的概念,指一個同時具有多個活動的系統.

並行指的是用併發使一個系統運行的更快.並行可以在計算機系統的多個抽象層次上運行.

1,線程級併發

同時執行多個程序的系統,就導致了併發.

通過使計算機在它正在執行的程序之間快速的切換的方式來實現.

併發形式允許多個用戶同時與系統交互.(如多人從web頁獲取信息)

併發允許一個用戶同時從事多個任務.(如聽歌的同時看電影 - -!)

2,指令級並行

在較低的抽象層次上,現代處理器可以同時執行多條指令的屬性稱爲指令級並行.

3,單指令,多數據並行

在最低層次上,許多現代處理器用戶特殊的硬件,允許一條指令生產多個可以並行執行的操作,這種方式稱爲單指令、多數據,即SIMD並行.

處理器

1.9.2計算機系統中抽象的重要性
  • 抽象的使用是計算機科學中最爲重要的概念之一.

  • 只要執行模型一樣,不同的處理器實現也能執行同樣的機器代碼,而又提供不同的開銷和性能.

操作系統中的抽象 :

  • 1,文件是對I/O的抽象

  • 2,虛擬存儲器是對程序存儲器的抽象.

  • 3,進程是對一個正在運行的程序的抽象.

  • 4,虛擬機,它提供對整個計算機(操作系統,處理器和程序)的抽象.

計算機系統提供的抽象

1.10小結

計算機系統是由硬件和軟件組成的,它們共同協作以運行應用程序.

計算機的內部的信息被表示爲一組組的位,它們依據不同的上下文有不同的解釋方式.

程序被其他程序翻譯成不同的形式.開始時時ASCII文本,然後被編譯器和鏈接器翻譯成二進制可執行文件.

筆記總結:

通過對計算機系統的整體瞭解,更深的認識到系統的運行機制,更有利於個人對整個系統的一種整體感覺,真正的去從設計系統的角度看待整個系統的運行方式,從而可以更加清晰的明白程序是如何在系統中運行的,以前很多想不明白的地方也有了新的認識.

系統介於軟件與硬件之間,通過軟件與硬件的相互交互來運行應用程序.而每個環節又分爲各種層次,從而更好的提供上層抽象,同時在學習的過程中,體會到系統設計的精妙之處,大道至簡,瞭解其實質的運行機制,才能更好的寫出好的程序.

通過學習與記錄,可以更好的去了解系統的真正面目,才能爲以後的深入學習提供打下基礎,溫故而知新,每次讀都有新的認識,有種豁然開朗的感覺.踏實學習,點滴記錄.不期速成,日拱一卒….

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