1. 程式人生 > >計算機系統結構的總體概述

計算機系統結構的總體概述

我們(程式設計師)天天都在用計算器編寫程式碼,但你瞭解計算機的整體架構和各個元件是如何相互配合來完成資料的錄入,資料的流轉,指令的執行,結果的輸出嗎?

我在學校期間和實習階段對這些問題都有過系統的學習,但那時的關注點是,只知道有什麼.工作後,在日常的工作中對這些計算機元件有了更深入的認識.

因此,現在抽時間把以前的知識點梳理下,並把自己的一些理解寫下來.供自己備忘和有興趣的同學一起探討.

一 計算機系統的總體架構

我們從一張圖開始吧,如下: 


 <圖1>

上圖中有幾個重要的概念.

1.1  匯流排

什麼是匯流排?

匯流排是貫穿整個系統的電子管道

匯流排的傳輸單元是什麼,大小是多大?

匯流排一般傳送定長的位元組塊,也就是字(word). 字長大多數系統是4個位元組(32位),有的是8個位元組(64)位

匯流排在這計算機系統的重要性不言而喻, CPU在計算的過程中隨時隨地都在通過匯流排傳遞資料到其它部件.

1.2  IO裝置

每個IO裝置通過一個控制器或介面卡與IO匯流排連線,接入整個計算機系統. 

可以把I/O裝置(磁碟,鍵盤,顯示器,網路)都可以視為檔案. 

1.3  主存

通常說的記憶體. 程式執行過程中絕大多數的資料都存放在主存中,當計算需要用到某一部分資料時,通過匯流排把這部分資料從主存載入到暫存器,通過CPU運算得到結果後,再儲存到主存.

主存在物理上是一組"動態隨機存取儲存器(DRAM)晶片組成",邏輯上來說,儲存器是一個線性的位元組陣列,每個位元組都有其唯一的地址,地址從0開始.

1.4 處理器

CPU(中央處理器),解釋執行儲存在主存指令的引擎. 

PC(程式計數器), 一個字長的儲存裝置. 任意時刻,PC都指向主存中的某條機器指令(指令的地址)

二 儲存裝置

圖1中還有個重要的元件沒列出來. cpu的快取記憶體.

快取記憶體在複製資料的過程中至關重要,現代CPU一般都有三級快取記憶體.

cpu的暫存器,三級快取記憶體,主存,磁碟,遠端二級儲存等一系列儲存元件組成了計算機系統的一個儲存層次結構.

為什麼要設計成層次結構呢?

因為計算機把大量的時間用於儲存器,I/O裝置和CPU暫存器之間複製資料. 把儲存裝置劃分為上述層次結構,高層比底層裝置快,較高層次作為較低層次裝置的快取記憶體,有利於快速傳遞資料.

這個層次結構如下圖所示


很多人應該看過這張圖. 

從下到上,他們有幾個特點: 

1,  cpu從他們那拿資料的速度越來越快.

2,  儲存容量越來越小,成本越來越貴.

cpu從各個儲存元件拿資料的速度大致有如下數量級關係(讀一個字為例).

1).  主存比磁碟快1000萬倍.

2).  暫存器比主存快100倍.

3).  L2比L1的速度快5倍.

可以看出,主要的差距還是在主存和磁碟之間. L1,L2,L3和主存之間的差距,相對於磁碟讀寫資料就快很多. 

三 計算機中資訊的表示

深入理解計算機體系一書中,把資訊的概念歸納為:  資訊就是位+上下文.

系統中所有的資訊,包括磁碟檔案,儲存器中的程式,儲存器中存放的使用者資料,網路上傳輸的資料,都是由一串位表示的.
區分不同資料物件的唯一方法就是讀取物件時的上下文. 不同上下文中,一個相同的位元組序列可能表示整數,浮點數,字串或者機器指令.

比如有個檔案abc.txt, 內容是: "hello world" 

那麼上述檔案在計算機中是如何表示和儲存的呢?

首先abc.txt是一個檔案,在計算機中,檔案就是位元組序列. 所有的I/O裝置(磁碟,鍵盤,顯示器,網路)都可以視為檔案. 系統中的所有輸入輸出都可以通過系統函式呼叫讀寫檔案來實現. 

大部分的現代系統都用ASCII來表示文字字元,用一個位元組大小表示一個字元. 0和1組成的位,8個位被組織成一組,成為位元組.

上述abc.txt的儲存結果如下:

  h           e           l          l          o        ,           w        o          r           l             d         

104      101      108     108    111    44     119     111     114      108      100    

四 虛擬儲存器

虛擬儲存器是一個抽象的概念,它為每個程序提供了一個假象,每個程序都在獨佔的使用主存. 每個程序看到的是一致的儲存器,稱為 虛擬地址空間.  如下圖所示: 

4.1  程式程式碼和資料

程式碼和資料區是直接按照可執行目標檔案的內容初始化載入進來的. 在程序一開始的時候就被規定了大小.

4.2 堆

堆在執行時可動態的擴充套件和收縮. 通過malloc/free這樣的C標準庫函式,可以收放自如. java中是new和gc動態收集.

4.3 共享庫

標準庫和數學庫這樣的共享庫的程式碼和資料區域.

4.4 棧

函式呼叫時會用到. java的區域性變數也在棧中儲存.使用者棧也可以動態收縮和擴張.

4.5 核心虛擬儲存器

核心是作業系統的一部分,總是駐留在記憶體中.

五 程序和執行緒

什麼是程序?  程序是作業系統對一個正在執行的程式的一種抽象.

多個程序看上去像是在並行執行,作業系統實現這種交錯執行的機制成為 "上下文" 切換.

什麼上下文? 作業系統保持跟蹤程序執行所需的所有狀態資訊.

上下文具體包含的內容: PC和暫存器檔案的當前值,以及主存的內容.

程序由多個執行緒的執行單元組成,每個執行緒執行在程序的上下文中,共享同樣的程式碼和全域性資料.

執行緒優點: 

                  1, 執行緒間比程序間更容易共享資料. 
 2, 執行緒一般比程序更高效.
 3, 有多處理器的時,執行緒是一種使程式執行更快的方法.

六 抽象

抽象是電腦科學中最為重要的一個概念之一.

作業系統的抽象:
1, 檔案是對I/O的抽象.
2, 虛擬儲存器是對程式儲存器的抽象.
3, 程序是對一個正在執行的程式的抽象.
4, 虛擬機器是對整個計算器(包括作業系統,處理器和程式)的抽象.

七 總結

1, 檔案是對IO的抽象,所有的IO操作都可以看做檔案的讀寫.

                                        2, 執行的程式在計算機中用程序來抽象.

                                        3, 計算機體系結構中,儲存裝置被分層設計和管理.

                                        4,  計算機用位和上下文來表示任何在計算機中儲存的資訊.

注: 本部落格中的圖都來自 <深入理解計算機系統> randal E. Bryant David R.O'Hallaron 第二版