1. 程式人生 > ><深入理解計算機系統(第三版)》第一章

<深入理解計算機系統(第三版)》第一章

第一章 計算機系統漫遊

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

1.1 資訊就是位+上下文

源程式實際上就是由一個值0和1組成的位(bit)序列,8個位被組織成一組,稱為位元組.每個位元組表示程式中某個文字字元.
大部分現代系統都是有ASCII標準表示文字字元,只由ASCII字元構成的檔案稱為文字檔案,所有其他檔案都稱為二進位制檔案.
系統中所有的資訊—–包括磁碟檔案、儲存器中的程式、儲存器中存放的使用者資料以及網路上傳送的資料,都是由一串位表示的.區分不同資料物件的唯一方法是我們讀到這些資料物件時的上下文.比如:在不同的上下文中,一個同樣的位元組序列可能表示一個整數、浮點數、字串或者機器指令.

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

此例子為書中所寫的hello.c的例子,從其生命週期分析系統的執行過程
在Unix系統上,從原始檔到目標檔案的轉化是由編譯器驅動程式完成的:
unix>gcc -o hello hello.c
執行這四個階段的程式(前處理器、編譯器、彙編器、連結器)一起構成了編譯系統.
1,預處理階段.前處理器(cpp)根據以字元#開頭,修改原始的C程式.
2,編譯階段.編譯器(ccl)將文字檔案hello.i翻譯成文字檔案hello.s,它包含一個組合語言程式.
3,連結階段.目標檔案合併到我們的hello.o程式中,連結器就處理這種合併.得到hello檔案,一個可執行目標檔案,可以被載入到記憶體中,由系統執行.

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

有一些重要的原因是促使程式設計師必須知道編譯系統是如何工作的,其原因如下:
①優化程式效能:現代編譯器都是成熟的工具,通常可以生成很好的程式碼.但是,為了在C程式中做出好的編碼選擇.我們確實需要了解一些機器程式碼以及編譯器將不同的C語句轉化為機器程式碼的方式.例如:while迴圈比for迴圈更有效嗎?
②理解連結時出現的錯誤.一些最令人困擾的程式錯誤往往都與連結器操作有關.例如:為什麼有些連結錯誤直到執行時才會出現?
③避免安全漏洞.緩衝區溢位錯誤是造成大多數網路和Internet伺服器上安全漏洞的主要原因.學習安全的第一步就是理解資料和控制資訊儲存在程式棧上的方式會引起的後果.

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


在圖中:CPU:中央處理單元 ALU:算術/邏輯單元 PC:程式計數器 USB:通用序列匯流排
程式執行全過程:
1.外殼程式將字元逐一讀入暫存器,再把它存放到儲存器中.
2.外殼執行一系列指令來載入可執行的檔案,將目標檔案中的程式碼和資料從磁碟複製到主存.
3.目標檔案中的程式碼和資料被載入到主存,處理器開始執行程式的main程式中的機器語言指令.這些指令將字串的位元組從主存複製到暫存器檔案,再從暫存器檔案中複製到顯示裝置,最終顯示在螢幕上.

1.5 快取記憶體至關重要

高速緩衝儲存器是存在於主存與CPU之間的一級儲存器, 由靜態儲存晶片(SRAM)組成,容量比較小但速度比主存高得多, 接近於CPU的速度。

1.6 儲存裝置形成層次結構

1.7 作業系統管理硬體

程序:它是作業系統對一個正在執行的程式的一種抽象。在一個系統上可以同時執行多個程序,而每個程序都好像在獨佔地使用硬體。
執行緒:它有時被稱為輕量程序,是程式執行流的最小單元。一個標準的執行緒由執行緒ID,當前指令指標(PC),暫存器集合和堆疊組成。此外,執行緒是程序中的一個實體,是被系統獨立排程和分派的基本單位,執行緒自己不擁有系統資源,只擁有一點兒在執行中必不可少的資源,但它可與同屬一個程序的其它執行緒共享程序所擁有的全部資源。
虛擬記憶體:它是一個抽象概念,它為每個程序提供了一個假象,即每個程序都在獨佔地使用主存。
檔案:它就是位元組序列,每個I/O裝置,包括磁碟、鍵盤、顯示器、網路等,都可以看成是檔案。

1.8 系統之間利用網路通訊

如果系統視為一個孤立的硬體和軟體的集合體,那麼網路可以視為一個I/O裝置.
當系統從主存將一串字串複製到網路介面卡時,資料流經過網路達到另一臺機器上.
系統可以讀取從其他機器傳送來的資料,並將資料複製到自己的主存.

總結:

通過對計算機系統的整體瞭解,更深的認識到系統的執行機制,更有利於個人對整個系統的瞭解與掌握,真正的去從設計系統的角度看待整個系統的執行方式,從而可以更加清晰的明白每個程式是如何在系統中執行的。