操作系統精髓與設計原理(一)計算機系統概述

一.基本構成

  • 處理器:cpu
  • 內存:存儲數據和程序,關機後內存上的內容會丟失,相對應的是磁盤存儲器,關機後內容不會丟失
  • 輸入輸出模塊(IO):在計算機和外部環境之間移動數據,外部環境由各種外部設備組成包括硬盤,通信設備和終端
  • 系統總線:在處理器,內存,輸入輸出模塊間提供通信的設施

  • MAR:內存地址寄存器用於確定下一次讀/寫的存儲器地址
  • MBR:內存緩存寄存器存放要寫入內存的數據和從內存中讀取的數據
  • I/O AR:輸入輸出地址寄存器,用於確認一個特定的輸入輸出設備
  • I/O BR:輸入輸出緩存寄存器用於在輸入輸出模塊和處理器間交換數據

二 .指令的執行

處理器執行的程序是由一組保存在存儲器中的指令組成的,最簡單的指令處理包含兩步:

處理器從存儲器中一次讀取一條指令,然後執行每條指令.

這兩步分別稱爲取指階段執行階段

PC:程序計數器(program counter) 保存下一次要取的指令地址.一般處理器在每次取指令後總是遞增PC.以便能按順序取下一條指令.

比如PC被置爲地址300,處理器下一次將在地址爲300的存儲單元處取指令,取完後,pc地址變爲301..下一次302..303

IR:指令寄存器 用於存放處理區取到的指令.

指令:指令中包含確定處理器將要執行的操作.處理器解釋指令,並執行對應的操作 具體操作分爲以下4類

  1. 處理器---存儲器:數據可以從處理器傳送到內存(存儲器),或從存儲器傳送到處理器.
  2. 處理器---I/O:數據可以從處理器輸出到I/O模塊(外部設備),或者從外部設備向處理器輸入數據
  3. 數據處理:處理器可以執行很多與數據相關的算術操作邏輯操作
  4. 控制:控制指令執行的順序,比如跳轉或者循環,

    比如處理器從地址爲149的存儲單元取一條指令,指令指定下一條指令從地址爲160的存儲單元取.這樣處理器就會將程序計數器置爲160,而不是遞增爲150.

一個例子:

假設一臺機器具有以上圖中的特徵,處理器中包含一個累加器(AC)的數據寄存器

所有指令爲16位,指令格式中操作碼佔4位,總共有2^4=16種操作碼

0001 從內存中讀取到AC  指令的第一個數字是1 後面3個數字代表存儲單元地址

0010 將AC中的數據存儲到內存 指令第一個數字爲2

0101 從內存中添加到AC 指令第一個數字爲5

下圖描述了程序的部分執行相加的過程

1.pc程序計數器中第一個指令地址爲300,300地址中的指令1940被讀取到IR指令寄存器中,PC加1變爲302

2.處理器解釋IR中1940初4位爲1代表從內存中讀取地址爲940的數據0003到AC

3.pc程序計數器中當前指令地址爲301,301中的指令5941被讀取到IR中 pc加1變爲302

4.IR中5941前4位爲5 換算成二進制位0101,將941的數據0002添加到AC.AC中變成0005.

5.pc程序計數器中當前指令地址爲302,302中的指令2941被讀取到IR中,PC變爲303

6.IR中2941前4爲爲2 也就是0010,將AC中的數據0005存儲到存儲單元地址爲941的位置,

這就是以上列子的執行過程.

三.中斷

中斷最初是用於提高處理器效率的一種手段.

中斷的分類包括

  1. 程序中斷:在某些條件下由指令執行的結果產生,如除數爲0,非法的機器指令等
  2. 時鐘中斷:由處理器內部的計時器產生,允許操作系統以一定的規律執行函數.
  3. I/O中斷:由I/O控制器產生,用於發信號通知一個操作的正常完成或各種錯誤條件
  4. 硬件失效中斷:斷電等機器故障產生

多數I/O設備要遠慢於處理器,假設處理器要一直週期性給一臺打印機傳送數據,在每次寫操作後,處理器都必須暫停,直到打印機完成工作,暫停的時間可能相當於成百上千個指令週期.這對於處理器來說是相當浪費的.

假設有一個CPU,每秒約可以執行10^9條指令,硬盤7200轉/秒,旋轉半周的時間約爲4ms,這比處理器約慢400萬倍.

無中斷:例如上圖a中用戶程序在處理過程中會間斷執行一些Write操作,Write調用執行I/O程序,用戶執行遇到Write指令,用戶程序被中斷,開始執行I/O操作,I/O操作可能要花費較長時間,用戶程序會停留較長時間.然後一直到I/O操作完成再接下去執行.時間都用在了等待I/O操作上

短中斷:圖b中處理器可以在I/O操作的執行過程中執行其他指令,用戶程序到達Write處時,執行I/O準備代碼和命令,然後立刻返回繼續執行用戶程序,這期間用戶程序中的指令和I/O操作是併發的.當I/O操作完成後,I/O模塊會給處理器發送一箇中斷請求信號,這時處理器會暫停當前用戶程序,處理I/O後續的操作.中斷和指令週期如下圖

顯然在這個處理中有一定的開銷,在中斷處理程序中,必須執行額外的指令判斷中斷性質,並決定採用何種操作.

下圖是上面圖b控制流的時序圖

這樣的前提是I/O操作時間相當短,少於用戶寫操作之間完成指令執行的時間,也就是說I/O操作在下一次Write調用前要完成

但是實際情況是I/O操作往往比這一系列用戶程序指令的時間還要長的多.

長I/O等待:圖c中用戶程序在第一次I/O操作完成之前就到達了第二次Write調用,這時用戶程序掛起,當第一次/O操作完成後再開始第二次I/O調用,下面是上訴情況和無中斷的時序圖,I/O操作在沒完成前,依然會和用戶程序指令執行併發,效率依然比無中斷高

四.存儲器的層次結構

存儲器的三個重要特性是:容量,速度,價格.

三者之間的關係如下

存取時間越快,每位的價格越高,容量越大,每位的價格越低,容量越大,每位的速度越慢

在同等價格前提的情況下,我們希望又有大容量,而且有需要速度快.所以我們使用存儲器層次結構

具體分爲板上存儲器,板外存儲器,離線存儲器(外置?)

上圖中的存儲結構從上向下存在下面的特點:

  • 每位的價格越來越低
  • 容量遞增
  • 存取的速度越來越慢
  • 處理器訪問的頻率越來越低

五.高速緩存

爲什麼要有高速緩存

因爲在指令週期中,指令保存在存儲器中,處理器在取指時至少要訪問一次存儲器,(實際上是很多次),內存的速度過慢,導致處理器執行指令的速度也變慢.但是如果內存的構造技術採用和處理器中的寄存器相同的技術,成本又過高.於是解決辦法是在處理器和內存之間提供一個容量小但是速度快的存儲器,就是高速緩存

高速緩存的原理

如圖所示,處理器讀取存儲器的一個字節時,先看高速緩存中有沒有,有就直接從高速緩存中直接讀取,如果沒有,就由固定數目的字節組成一塊內存數據一次性讀入高速緩存,再傳遞給處理器,當一塊數據被讀取入高速緩存時滿足一次處理器訪問時,很可能緊接着的多次訪問的數據是該塊中的其他字節.就避免了頻繁和內存交互.

上圖是高速緩存的多級使用,其中1級緩存速度大於2級大於3級,容量小於2級小於3級.

下圖是高速緩存和內存的結構圖

內存由2^n個可尋址的字組成.(例如32位電腦,爲2^32可以換算成4G內存),將內存分爲多個塊,每個塊有K個字,就會有

M=2^n/K個,高速緩存中有C個存儲槽,也可以當做行,每個槽有K個字,當讀取存儲器中某一塊的某一個字時,這個塊又不在槽中,則將這個塊轉移到一個槽中,每個槽中有一個標籤,用來標識當前存儲的塊,標籤通常是地址中較高的若干位,表示以這些位開始的所有地址

如標籤01塊中包含下列地址單元 010000,010001,010002......011111.

下圖是一個高速緩存的讀操作過程

六.直接內存存取

在移動大量數據時,直接內存存取模塊(DMA)負責與存儲器交互,傳送整個數據塊,不需要處理器參與,在傳送完成後,纔給處理器一箇中斷信號

七. 多處理器和多核 

多處理器
是有多個獨立的CPU,每個CPU能執行相同的功能,也叫對稱處理器
多核
是多個處理器組裝在同一個硅片上,又名芯片多處理器
二者區別
對於多個處理器而言,它們在執行命令的時候多個處理器之間的通信手段是電腦主板上的總線;而對於多核處理器而言,多個核心處理器之間通信時通過CPU內部總線進行信息的交互的。對於執行效率而言,多核處理器要優於多個處理器
若跑小程序,選多核
對於多處理器:如果跑一個多線程的程序(常見典型情況),不考慮超線程,那麼每一個線程就要跑在一個獨立的CPU上,線程間的所有協作都要走總線,而共享的數據更是有可能要在好幾個Cache裏同時存在。這樣的話,總線開銷相比較而言是很大的,怎麼辦?那麼多Cache,即使我們不心疼存儲能力的浪費,一致性怎麼保證?如果真正做出來,還要在主板上佔多塊地盤,給佈局佈線帶來更大的挑戰?所以對於個人計算機來說,都採用單處理器多核。只需要一套芯片組,一套存儲,多核之間通過芯片內部總線進行通信,共享使用內存。在這樣的架構上,如果我們跑一個多線程的程序,那麼線程間通信將比上一種情形更快。如果最終實現出來,對板上空間的佔用較小,佈局佈線的壓力也較小。
若跑大程序,選多CPU多核
假設倆大程序,每一個程序都好多線程還幾乎用滿cache,它們分時使用CPU,那在程序間切換的時候,光指令和數據的替換就很費事。所以,需要更強的多任務併發能力,就用多顆多核CPU的機子。

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