CPU、硬盤、內存與指令

最近加入了一個java學習有關的QQ羣,在老師的指導下和大家一起學習。這兩週經大家推薦,看了幾本有關於計算機基礎原理的書籍,例如《編碼:隱匿在計算機軟硬件背後的語言》, 《程序是怎樣跑起來的》等。特此寫一篇博客將自己學到的東西做一個整理。
一、從馮•諾依曼體系說起

馮•諾依曼體系結構將計算機分爲運算器,控制器,存儲器,輸入設備,輸出設備這五個部分。到目前爲止,我們所使用到的計算機基本都是採用馮•諾依曼體系結構所設計的。

採用馮•諾依曼體系結構實現了“存儲程序”的概念,即將程序存儲在計算機的內存中,從程序的第一條指令開始執行,並根據程序所規定的順序執行以後的指令,知道程序執行完成。馮•諾依曼體系結構的五個部分可以對應到計算機的不同部件中,見圖1:運算器和控制器共同構成CPU;存儲器包含內存和硬盤以及CPU中也包含一部分存儲器,比如各類寄存器;輸入設備如鍵盤,麥克風等;輸出設備如屏幕,音響。

 
圖1. 馮諾依曼體系結構
二、CPU
CPU是Central Process Unit的縮寫,中文名叫中央處理器。可以認爲它是計算機的大腦。如圖2所示,從功能上分,CPU內部包括控制器,運算器,寄存器和時鐘四個部分。寄存器可用來寄存指令、數據等處理對象。根據種類的不同,一個CPU內部會有20~100個寄存器。控制器負責把內存上的指令、數據等讀入寄存器,並根據指令的執行結果來控制整個計算機。運算器負責運算從內存讀入寄存器的數據。時鐘負責發出CPU開始計時的時鐘信號。
 
圖2. CPU的內部結構
CPU的兩個特點:
1. CPU看似功能強大,但它只能按照程序指令來運行,而且它能夠執行的指令也很有限。嚴格來說,CPU能夠執行的指令只有以下四種:數據傳送指令,運算指令,跳轉指令,call/return指令。圖3列出了這四種類型指令的功能。
 
圖3. 機器指令的類型和功能
2. CPU的運算速度很快。這個快是相對與磁盤而言的。CPU的速度是硬盤的100萬倍。這使得訪問硬盤成了限制程序運行速度的一個很大的因素。而加入內存的一個原因就是解決CPU與硬盤速度不匹配的問題,但是CPU的速度還是比內存塊,大約是它的100倍。因此除此之外,在操作系統的層面,也採用了一些方法來提升計算機的運行速度。


三、硬盤與內存
硬盤和內存同屬於存儲器,但兩者之間有着不小的差別。硬盤是利用磁效應來實現的,因此也成爲磁盤,而內存使用電效應實現的。硬盤廉價而低速,內存則高速高價。除此之外,當計算機斷電時,內存中的數據就全被清空了,而硬盤則可以將數據保存下來。
1. 硬盤的物理結構
硬盤的物理構成如圖4所示。硬盤有許多盤面構成,每個盤片都有很多一圈一圈的磁道,每個磁道又分爲一個一個的扇區。多個盤片上的同一位置的磁道組成了一個柱面。扇區是對磁盤進行物理讀寫的最小單位。在Windows中使用的磁盤,一般一個扇區爲512字節。硬盤中數據的保存,必須以扇區或簇(扇區的整數倍)爲單位。當要對硬盤上的某一個扇區進行訪問時,需要先找到該扇區所在的磁道,然後找到對應扇區。
 
圖4. 磁盤的物理結構
2. 利用內存提升程序運行速度
通過將從硬盤中讀取的數據裝載到內存中可以加快程序的運行速度。這是根據程序的時間局部性和空間局部性原理設計得到的。
  • 時間局部性:一條被訪問的指令,在接下來的時間內很可能在此被訪問。
  • 空間局部性:如果一條指令被訪問,那麼這條指令臨近的指令接下來也很可能被訪問。

根據局部性原理,當CPU需要讀取一條指令或數據時,可以先訪問內存,如果內存中有,則直接從內存中讀取,否則再從硬盤中讀取,並將其加載入內存。

當內存已經存滿,有一條新的指令或數據要從硬盤寫入內存時,就需要考慮將內存中哪一條指令或數據移除,這就時內存替換算法所需要完成的工作。內存替換算法包括:最近最少使用算法(Least-Recently-Used,LRU),先進先出算法(First in First out,FIFO),隨機替換算法等等。


四、指令

接下來聊一聊計算機的指令。首先我們要對指令本身有一個認識。

指令是指揮計算機工作的命令,CPU的工作就是按照指令的要求來進行相應的操作,我們所寫的程序,就是有一條條指令所構成的。比如MOV [1000] EAX就是一條指令,表示將地址1000出的數取出來放到EAX這個寄存器中(當然,計算機看到的並不是這樣的彙編語言,而是機器語言)。

指令由操作碼和操作數兩部分組成。操作碼是這條指令所要進行的操作所對應的序列號,比如MOV;而操作數是指令執行該操作時所需用到的數據,這裏的數據往往是內存地址。不同的指令對應的操作不同,但這些指令的執行過程都必須包括以下三個步驟:

  1. 取指:將指令從內存中取出。計算機中,數據和指令都以二進制不加區分地存放在存儲器中。取值階段將指令從內存中取出,放到CPU內的指令寄存器上。
  2. 譯碼:對指令進行分析,即確定指令要進行怎樣的操作。
  3. 執行:執行指令。

這三步是所有指令都必須包含的。對於有些指令,需要將結果寫回存儲器中,那麼就需要在步驟3後再執行兩個步驟,分別是:

4. 訪存:得到寫回到內存中的地址。

5. 寫回:將數據寫入內存。

CPU在執行同一條指令的不同步驟時,所需要用到的部件也是不一樣的。指令流水就是根據這一特點來提升CPU執行指令的速度的。簡單來說就是幾條指令同時在CPU中執行,但出於不同的階段,因此不會造成衝突,從而提高運行速度,減少CPU的空閒率。圖5是指令流水一個簡單示意圖。


圖5. 指令流水示意圖


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章