計算機原理學習(2)-- 存儲器和I/O設備和總線

前言

 

前一篇文章介紹了馮諾依曼體系結構的計算機的基本工做原理,其中主要介紹了CPU的結構和工做原理。這一篇主要來介紹存儲區,總線,以及IO設備等其餘幾大組件,來了解整個計算機是如何工做的。 這些東西都是看得見摸得着的硬件,平時咱們買電腦時最關注的就是CPU的速度,內存的大小,主板芯片等等的參數。html

 

1. 存儲器

 

前面咱們以一個簡單通用的計算機模型來介紹了CPU的工做方式,CPU執行指令,而存儲器爲CPU提供指令和數據。 在這個簡單的模型中,存儲器是一個線性的字節數組。CPU能夠在一個常數的時間內訪問每一個存儲器的位置,雖然這個模型是有效的,可是並不能徹底反應現代計算機實際的工做方式。前端

 

1.1 存儲器系統層次結構

在前面介紹中,咱們一直把存儲器等同於了內存,可是實際上在現代計算機中,存儲器系統是一個具備不一樣容量,不一樣訪問速度的存儲設備的層次結構。整個存儲器系統中包括了寄存器、Cache、內部存儲器、外部存儲。下圖展現了一個計算機存儲系統的層次圖。層次越高速度越快,可是價格越高,而層次越低,速度越慢,價格越低。程序員

相對於CPU來講,存儲器的速度是相對比較慢的。不管CPU如何發展,速度多塊,對於計算機來講CPU老是一個稀缺的資源,因此咱們應該最大程度的去利用CPU。其面咱們提到過CPU週期,一個CPU週期是取1條指令的最短的時間。因而可知,CPU週期在很大程度上決定了計算機的總體性能。你想一想若是當CPU去取一條指令須要2s,而執行一個指令只須要2ms,對於計算機來講性能是多麼大的損失。因此存儲器的速度對於計算機的速度影響是很大的。編程

對於咱們來講,老是但願存儲器的速度能和CPU同樣或儘可能的塊,這樣一個CPU週期須要的時鐘週期就越少。可是現實是,這樣的計算機可能至關的昂貴。因此在計算機的存儲系統中,採用了一種分層的結構。速度越快的存儲器容量越小,這樣就能作到在性能和價格之間的一個很好的平衡。數組

 

1.2 存儲技術

計算機的發展離不開存儲器的發展,早起的計算機沒用硬盤,只有幾千字節的RAM可用。而咱們如今4G,8G的內存已經隨處可見,1T的大硬盤以及上百G的固態硬盤,而價格也比10年,20年前便宜的不少不少。因此我先大概瞭解下各類存儲技術。目前存儲技術大體分爲SRAM存儲器、DRAM存儲器、ROM存儲器和磁盤。瀏覽器

 

1.2.1 寄存器

在上一篇文章的圖中咱們有看得CPU內部有不少寄存器,而上一張圖也顯示,寄存器在存儲層次結構的頂端。它也叫觸發器,它每每和CPU同時鍾頻率,因此速度很是快。可是一個寄存器須要20多個晶體管,因此若是大量使用,CPU的體積會很是大。因此在CPU中只有少許的寄存器。而每一個寄存器的大小都是8-64字節。緩存

 

1.2.2 RAM隨機訪問存儲

RAM(Read-Access Memory)分爲兩類,靜態(SRAM)和動態(DRAM)。SDRAM比DRAM要快的多,可是價格也要貴的多。網絡

  • 靜態RAM: SRAM將每一個位存儲在一個雙穩態的存儲單元中,每一個存儲單元是用一個六晶體管電路實現的。它的特色是能夠無限期(只要有電)的保持在兩個穩定狀態中的一個(正好能夠存放0或1),而其餘任何狀態都是不穩定的會立刻切換到這兩個狀態中的一個。
  • 動態RAM: DRAM是利用電容內儲存電荷的多寡來表明一個二進制位元(bit)是1仍是0,每一bit由一個晶體管和電容組成。因爲在現實中電容會有漏電的現象,致使電位差不足而使記憶消失,所以除非電容常常週期性地充電,不然沒法確保記憶長存。因爲這種須要定時刷新的特性,所以被稱爲「動態」記憶體。

SRAM相比DRAM速度更快功耗更低,而因爲結構相對複雜佔用面積較大,因此通常少許在CPU內部用做Cache,而不適合大規模的集成使用,如內存。而DRAM主要用來做爲計算機的內部主存。架構

  • Cache: 目前咱們CPU中通常集成了2到3級的Cache,容量從128K到4M。對於CPU總的Cache來講,它們的也是和CPU同頻率的,因此理論上執行速度和寄存器應該是相同的,可是Cache每每用來存儲一些指令和數據,這樣就存在一個命中的問題。當沒有命中的時候,須要向下一集的存儲器獲取新的數據,這時Cache會被lock,因此致使實際的執行速度要比寄存器慢。一樣對於L1,L2,L3來講,速度也是愈來愈慢的。
  • 主存: 也就是咱們說的內存,使用DRAM來實現。可是咱們目前聽的內存通常叫DDR SDRAM,還有早期的SDRAM。這是一種同步的DRAM技術,咱們不須要了解他的詳情,只須要知道它能有效的提升DRAM的傳輸帶寬。而DDR表示雙倍的速率,而如今又有了DDR2,DDR3,DDR4,他們的帶寬也是愈來愈大。

 

1.2.3 ROM只讀存儲

前面的RAM在斷電後都會丟失數據,因此他們是易失的。另外一方面非易失的存儲器即使在斷點後也能保存數據。通常咱們稱之爲ROM(Read-Only Memory)。雖然這麼說,可是ROM在特殊的狀況下仍是能夠寫入數據的,不然就不能叫存儲器了。異步

  • PROM: 可編程ROM,只能被編程一次,PROM包含一種熔絲,每一個存儲單元只能用高電流燒斷一次。
  • EPROM:可擦寫可編程ROM,有一個透明的石英窗口,紫外線經過窗口照射到存儲單元就被清除爲0,而對它編程是使用一種特殊的設備來寫入1。寫入次數1K次。
  • EEPROM:: 電子可擦除可編程ROM,不須要特殊設備而能夠直接在印製的電路板上編程。寫入次數10萬次。
  • Flash Memory: 這是咱們見到最多的閃存,有NOR Flash、NAND Flash、V-NAND Flash、SLC、MLC、TLC。雖然是基於EEPROM,可是速度上卻要快不少。其中NOR 、NANA Flash大量的使用在U盤,SD卡、手機存儲上。

ROM在計算機中應用也比較多,好比咱們的BIOS芯片,最開始採用PROM,後來使用EPROM,若是損壞計算機就沒法啓動了。而目前手機中也採用ROM來燒入系統,而RAM做爲內存,使用Flash Memory做爲機身存儲。

 

1.2.4 磁盤存儲

也就是咱們最多見的硬盤。目前硬盤主流已是500G,1T。轉速也在7200轉左右。相對於8G的內存,一個500G的硬盤能夠說是至關的便宜。可是問題在於他的速度很是的慢,從磁盤讀取數據須要幾個毫秒,而CPU時鐘週期是以納秒計算。磁盤讀取操做要比DRAM慢10萬倍,比SRAM慢百萬倍。

相對於CPU,內部存儲的電子結構,磁盤存儲是一種機械結構。數據都經過電磁流來改變極性的方式被電磁流寫到磁盤上,而經過相反的方式讀回。一個硬盤由多個盤片組成,每一個盤片被劃分爲磁道,扇區和最小的單位簇。而每一個盤面都有一個磁頭用來讀取和寫入數據。而硬盤的馬達裝置則控制了磁頭的運動。

 

1.2.5 虛擬硬盤(VHD)和固態硬盤(SSD)

隨着計算機的發展,緩慢的磁盤速度已經成爲計算機速度的障礙了。大多數狀況下,你的CPU夠快,內存夠大,但是打開一個程序或遊戲時,加載的速度總仍是很慢。(關於程序加載的過程後面的文章會講到)。緣由就是磁盤讀寫速度太慢,因此一度出現了虛擬硬盤。就是把一部份內存虛擬成硬盤,這樣一些緩存文件直接放到內存中,這樣就加快了程序訪問這些數據的速度。可是他的問題是易失的。固然你能夠保存到磁盤,可是加載和回寫的速度會隨着數據量加大而加大。因此這個適用於一些臨時數據的狀況,好比瀏覽器緩存文件。

而固態硬盤是最近幾年出來的,並且隨着技術的發展,價格也愈來愈便宜,愈來愈多的人採用SSD+HHD的方式來搭建系統,提升系統的速度。其實SSD在上世紀80年代就有基於DRAM的產品,可是由於易失性和價格而沒法推廣開來。而如今的SSD則是使用Flash Memory。目前市面上最多見的是SLC,MLC,TLC存儲介質的固態硬盤。咱們知道Flash都是與寫入次數限制的。而SLC>MLC>TLC。目前主流的SSD都是使用MLC,好比Intel 520,三星830系列。固然目前三星也退出了基於TLC的固態硬盤,價格相對要便宜一些。

 

1.2.6 遠程存儲

簡單能夠理解爲是將數據指令存儲在其餘機器上,好比分佈式系統,WebService Server,HTTP Server以及如今炒的火熱的雲端存儲。計算機經過網絡相互鏈接。比較起磁盤,遠程存儲的速度是以秒來計算。

 

1.3 局部性

經過上面介紹咱們對計算機存儲器有了一個瞭解,而且知道了存儲器層次越高速度越快。那麼爲何咱們要對存儲器分層呢? 分紅是爲了彌補CPU和存儲器直接速度的差距。這種方式之全部有效,是由於應用程序的一個特性:局部性。

咱們知道計算機的體系是存儲程序,順序執行。因此在執行一個程序的指令時,它後面的指令有很大的可能在下一個指令週期被執行。而一個存儲區被訪問後,也可能在接下來的操做中再次被訪問。這就是局部性的兩種形式:

  • 時間局部性
  • 空間局部性

對於現代計算機來講,不管是應用程序,操做系統,硬件的各個層次咱們都是用了局部性。

  1. 硬件:經過引入Cache存儲器來保存最近訪問的指令數據來提升對主存的訪問速度。
  2. 操做系統: 容許是用主存做爲虛擬地址空間被引用塊的高速緩存以及從盤文件的塊的高速緩存。
  3. 應用程序:將一些遠程服務好比HTTP Server的HTML頁面緩存在本度的磁盤中。

CODE1:

int sumarraycols(int a[m][n])
{
  int i, j , sum = 0;
  for(j = 0; j < n; j++)
    for(i = 0; i < m; i++)
      sum += a[i][j];
    return sum;
}

CODE2:

int sumarraycols(int a[m][n])
{
  int i, j , sum = 0;
  for(i = 0; i < m; i++)
    for(j = 0; j < n; j++)
      sum += a[i][j];
    return sum;
}

以上2段代碼差異只有for循環的順序,可是局部性卻相差了不少。咱們知道數組在內存中是按照行的順序來存儲的。可是CODE1確實按列去訪問,這可能就致使緩存不命中(須要的數據並不在Cache中,由於Cache存儲的是連續的內存數據,而CODE1訪問的是不聯繫的),也就下降了程序運行的速度。

 

2 存儲器訪問和總線

 

前面介紹了存儲器的存儲技術和分層,也一直提到CPU從存儲器中獲取數據和指令,這一節就介紹一下CPU和存儲器之間是如何通訊的。

 

2.1 總線

所謂總線是各類功能部件之間傳送信息的公共通訊幹線,它是由導線組成的傳輸線束。咱們知道計算機有運算器,控制器,存儲器,輸入輸出設備這五大組件,因此總線就是用來鏈接這些組件的導線。

按照計算機所傳輸的信息種類,計算機的總線能夠劃分爲

  • 數據總線: 數據總線DB是雙向三態形式的總線,即它既能夠把CPU的數據傳送到存儲器或輸入輸出接口等其它部件,也能夠將其它部件的數據傳送到CPU。數據總線的位數是微型計算機的一個重要指標,一般與微處理的字長相一致。咱們說的32位,64位計算機指的就是數據總線。
  • 地址總線: 地址總線AB是專門用來傳送地址的,因爲地址只能從CPU傳向外部存儲器或I/O端口,因此地址總線老是單向三態的,這與數據總線不一樣。地址總線的位數決定了CPU可直接尋址的內存空間大小。
  • 控制總線:控制總線主要用來傳送控制信號和時序信號。控制總線的傳送方向由具體控制信號而定,通常是雙向的,控制總線的位數要根據系統的實際控制須要而定。其實數據總線和控制總線能夠共用。

總線也能夠按照CPU內外來分類:

  • 內部總線:在CPU內部,寄存器之間和算術邏輯部件ALU與控制部件之間傳輸數據所用的總線稱爲片內部總線。
  • 外部總線:一般所說的總線指片外部總線,是CPU與內存RAM、ROM和輸入/輸出設備接口之間進行通信的通路,也稱系統總線。

 

2.2 控制芯片

前面我面介紹了總線的分類,在咱們的簡單模型中。CPU經過總線和存儲器之間直接進行通訊。實際上在現代的計算機中,存在一個控制芯片的模塊。CPU須要和存儲器,I/O設備等進行交互,會有多種不一樣功能的控制芯片,咱們稱之爲控制芯片組(Chipset)。

對於目前的計算機結構來講,控制芯片集成在主板上,典型的有南北橋結構和單芯片結構。與芯片相鏈接的總線能夠分爲前端總線(FSB)、存儲總線、IQ總線,擴展總線等。

  • 南北橋芯片結構:
    • 北橋芯片,它控制着CPU的類型,主板的總線頻率,內存控制器,顯示核心等。它直接與CPU、內存、顯卡、南橋相連,因此它數據量很是大。
      • 前端總線:是將CPU鏈接到北橋芯片的總線。FSB的頻率是指CPU和北橋之間的數據交換速度。速度越快,數據帶寬越高,計算機性能越好。
      • 內存總線:是將內存鏈接到北橋芯片的總線。用於和北橋之間的通訊。
      • 顯卡總線:是將顯卡鏈接到北橋芯片的總新。目前有AGP,PCI-E等接口。其實並無顯卡總線一說,通常認爲屬於I/O總線。
    • 南橋芯片,它主要負責外部接口和內部CPU的聯繫
      • I/O總線:鏈接外部I/O設備鏈接到南橋的總線, 好比USB設備,ATA,SATA設備,以及一些擴展接口。
      • 擴展總線:主要是主板上提供的一些PCI,ISA等插槽。
  • 單芯片結構: 單芯片組主要是是取消了北橋,由於如今CPU中內置了內存控制器,不須要再經過北橋來控制,這樣就能提升內存控制器的頻率,減小延遲。而如今一些CPU還集成了顯示單元。也使得顯示芯片的頻率更高,延遲更低。

2.3 運行頻率

 

數據帶寬 = (總線頻率*數據位寬)/ 8

 

2.3.1 外頻

外頻是創建在數字脈衝信號震動速度基礎上的。它是CPU與系統總線以及其餘外部設備共同運行的速度。咱們知道計算機中有一個時序發生器來保證各個部件協同工做,而這裏說的外頻率就是這個時序發生器的頻率。外頻也是系統總線的工做頻率。

 

2.3.2 頻率和控制芯片

  • 在計算機剛開始的時候,CPU和內存還有I/O設置是直接經過總線鏈接的而沒有控制芯片。全部設備都同步的工做在同一個總線頻率下。
  • 可是隨着CPU的發展,CPU速度愈來愈塊。但受限於I/O設備。因而就出現了芯片。他使得I/O總線不在直接和CPU的系統總線相連。這樣就有了2個不一樣頻率的總線,這個芯片實際起到了一個降頻的做用,也就相對於系統總線的分頻技術。
  • 但CPU速度發展至關快,CPU的速度已經高於內存運行的速度,因而引入了倍頻的概念。CPU在不改變外頻和系統總線頻率的狀況下運行在更高的頻率。
  • 發展到後來,就出現了北橋芯片,而CPU和北橋以前的總線稱爲了FSB總線,而內存與北橋以前稱爲內存總線。

 

2.3.2 分頻和倍頻

  • 分頻:使得I/O設備能夠和較高的外頻協同工做。好比AGP,PCI總線,運行頻率在66MHZ和33MHZ,因此對於一個100MHZ的外頻來講,採用2/3或1/3分頻的方式就能使得CPU和外設同步的工做了。不然設備可能沒法正常工做。
  • 倍頻: 爲了提升CPU頻率又正常的和內存進行工做,因此產生了倍頻。因此對於CPU來講他實際的頻率是外頻*倍頻。

 

2.3.3 FSB頻率

前面咱們如今已經知道CPU和北橋芯片鏈接是經過FSB。而FSB頻率表示CPU和北橋芯片之間的工做速度。可是從前面咱們就知道FSB的實際頻率是和外頻同樣的。可是隨着技術的發展,Intel的QDR技術和AMD的HT技術,使得CPU在一個時鐘週期能夠傳送4次數據,因此對於FSB淶說雖然工做早外頻的頻率下,可是等效的頻率是外頻的4倍。因此咱們說的FSB頻率是等效頻率,而不是實際的工做頻率。隨着技術的發展,Intel芯片的FSB有800MHz,1600HMz等等。但隨着北橋芯片的消失,FSB的機率也慢慢遠去。

 

2.3.4 內存頻率

對於內存頻率咱們能夠看到,通常包括了核心頻率,總線頻率和傳輸頻率:

  • 核心頻率和外頻相似,是創建在脈衝震盪信號上的。
  • 總線頻率就是指內存總線的工做頻率。也就是內存和北橋芯片之間的工做頻率。
  • 而傳輸頻率相似FSB,是指實際傳輸數據的頻率。

對於SDR來講,它的3個頻率是一致的。而DDR在一個時鐘週期能夠傳送2次數據,因此它的傳輸頻率是核心和總線頻率的2倍。DDR2在DDR的基礎上,採用了4bit預讀,因此總線頻率是核心頻率的2倍,而DDR3採用了8bit預讀,總線頻率是核心頻率的4倍。

 

DDR SDRAM
Standard
Bus clock
(MHz)
Internal rate
(MHz)
Prefetch
(min burst)
Transfer Rate
(MT/s)
Voltage DIMM
pins
SO-DIMM
pins
MicroDIMM
pins
DDR 100–200 100–200 2n 200–400 2.5/2.6 184 200 172
DDR2 200–533 100–266 4n 400–1066 1.8 240 200 214
DDR3 400–1066 100–266 8n 800–2133 1.5 240 204 214

 

從下表咱們就能看出。因此咱們常說的DDR3 1600,DDR2 800指的是內存的傳輸頻率。相同的技術還有顯卡的AGP4X,8X,PCIE-8X,16X等技術。

而隨着FSB速度不斷加快,內存的總線頻率組建成爲了瓶頸,因而出現了DDR雙通道,雙通道是指芯片擁有2個內存控制器,因此可使得傳輸速率翻倍。

 

2.3.5 內存總線工做方式

由於內存總線頻率不一樣,因此內存和CPU之間存在同步和異步兩種工做方式。

  • 同步方式:內存總線頻率和CPU外頻相同。好比之前的PC133和P3處理器,他們以同步的方式工做在133MHZ下。而當你超頻時就須要擁有更高總線頻率的內存。固然也須要北橋芯片的支持。
  • 異步方式:內存總線頻率和CPU外頻不一樣。睡着CPU外頻的提升,內存也必須更新,因此出現了異步的方式。好比P4 CPU外頻爲200MHz,而內存卻可使用DDR333來運行。同時異步方式也在超頻時常用。通常來講會有一個內存異步比率。在BIOS中會有相應的選項。

從性能上來說,同步方式的延遲要好於異步方式,這也是爲何之前會說P4 200外頻的CPU要使用DDR400才能發揮最大功效。但這也不是絕對的。好比個人I5處理器CPU外頻工做在100MHz,而我使用的DDR3-1600的總線頻率在200MHz,雖然不一樣步,可是擁有更高的傳輸速率。因此不能一律而論。

 

2.3.6 QPI和HT總線技術

從前面咱們知道了FSB對整個系統的性能影響很大,1600MHZ的FSB能提供的數據帶寬也只有12.8GB/s,因此隨着技術的發展,如今最新的計算機基本都採用了單芯片設計,北橋的功能被集成到了CPU內部。因而咱們前面說的FSB也就不存在了。對於Intel和AMD這2大芯片廠商,分別有本身的技術來提升CPU和存儲器以及其餘設備之間的傳輸速率,知足更高的計算要求。

  • QPI: Intel的QuickPath Interconnect技術縮寫爲QPI,譯爲快速通道互聯。用來實現芯片之間的直接互聯,而不是在經過FSB鏈接到北橋。早期20位寬的QPI鏈接其帶寬可達驚人的每秒25.6GB,遠非FSB可比。而隨着技術發展,在高端安騰處理中峯值能夠達到96GB/s。
  • HT:HyperTransport本質是一種爲主板上的集成電路互連而設計的端到端總線技術,目的是加快芯片間的數據傳輸速度。HyperTransport技術在AMD平臺上使用後,是指AMD CPU到主板芯片之間的鏈接總線(若是主板芯片組是南北橋架構,則指CPU到北橋)即HT總線。HT3.1理論上能夠達到51.2GB/s。

除此以外,但芯片中的QPI和HT傳輸不須要通過北橋新片,在CPU內存除了集成內存控制器意外還能夠集成PCI-E2.0的圖形核心,使得集成顯卡的核心頻率和數據吞吐量大幅提升。

 

如圖,Core I7處理器外頻只有133MHz, 使用QPI技術後總線頻率達到2.4GMhz,而使用DDR3-1600的內存,內存總線頻率在800MHz。

 

2.3.7 小結

這一結介紹了計算機總線系統以及CPU和各個設備之間的交互。咱們能夠看到除了CPU自身的速度以外,總線的速度也影響這計算機的總體性能。從發展的過程來看,總線也是一個分分合合的過程。從最初的一條總線,到後來的單獨出來的I/O總線,內存總線,就是爲了提升CPU的效率。而當CPU和內存速度都發展到必定階段後,又出現了DDR,雙通道等技術,在不提升核心頻率的狀況下提升了傳輸率。因而又出現了CPU和內存間直接總線通訊下降延遲的狀況。 (從2000年開始接觸電腦DIY,一直到07年畢業,都對DIY頗有興趣,可是隨着電腦愈來愈快,目前以及弄不太清楚了,複習這些知識也費了我好多時間。)

 

 

3. I/O設備

 

 前面主要介紹了系統總線和CPU與內存之間的通訊,最後一部分簡單介紹一下CPU和I/O設備是如何通訊的。對於計算機來講輸入輸出設備也是五大組件。咱們知道相對於CPU,I/O設備的工做頻率要慢的不少。好比早期的PCI接口工做頻率只有33MHz,硬盤的IDE-ATA6的傳輸速率也只有133MB/s。而如今的 SATA3接口速率能達到600MB/s。

 

3.1 I/O設備原理

對於硬件工程師來講,I/O設備是電子芯片、導線、電源、電子控制設備、電機等組成的物理設備。而對於程序員來講,關注的只是I/O設備的編程接口。

 

3.1.1 I/O設備分類

  • 塊設備: 塊設備把信息存放在固定大小的塊中,每一個塊都有本身的地址,獨立於其餘塊,可尋址。例如磁盤,USB閃存,CD-ROM等。
  • 符號設備:字符設備以字符爲單位接收或發送一個字符流,字符設備不能夠尋址。列入打印機、網卡、鼠標鍵盤等。

3.1.2 設備控制器

I/O設備通常由機械部件和電子部件兩部分組成。電子設備通常稱爲設備控制器,在計算機上通常以芯片的形式出現,好比咱們前面介紹的南橋芯片。不一樣的控制器能夠控制不一樣的設備。因此南橋芯片中包含了多種設備的控制器,好比硬盤控制器,USB控制器,網卡、聲卡控制器等等。而經過總線以及卡槽提供和設備自己的鏈接。好比PCI,PCI-E,SATA,USB等。

 

3.1.3 驅動程序

對於不一樣的設備控制器,進行的操做控制也是不一樣的。因此須要專門的軟件對他進行控制。這個軟件的做用就是用來專門和設別控制器對話,這種軟件稱爲驅動程序。通常來講驅動程序由硬件設別廠商提供。因此咱們有時會碰到一些設備由於沒有安裝驅動程序而沒法使用的狀況。 而目前的OS總都包含了大量的通用驅動程序,使得咱們在安裝完系統後不須要在額外的安裝驅動。可是通用的驅動只能使用設備的基本功能。

驅動程序由於是非操做系統廠商開發,而且須要被安裝到操做系統並調用,因此須要有一個統一的模型來開發驅動程序。不然操做系統是沒法操做各式各樣的設備的。前面咱們知道設備非爲兩大類,因此通常操做系統都定義了這兩類設備的標準接口。

 

3.1.4 內存映射I/O

每一個控制器都有幾個寄存器和CPU進行通訊。經過寫入這些寄存器,能夠命令設備發送或接受數據,開啓或關閉。而經過讀這些寄存器就能知道設備的狀態。由於寄存器數量和大小是有限的,因此設備通常會有一個RAM的緩衝區,來存放一些數據。好比硬盤的讀寫緩存,顯卡的顯存等。一方面提供數據存放,一方面也是提升I/O操做的速度。

如今的問題是CPU如何和這些設備的寄存器或數據緩衝區進行通訊呢?存在兩個可選方案:

  1. 爲每一個控制器分配一個I/O端口號,全部的控制器能夠造成一個I/O端口空間。存放在內存中。通常程序不能訪問,而OS經過特殊的指令和端口號來從設備讀取或是寫入數據。早期計算機基本都是這種方式。
  2. 將全部控制器的寄存器映射到內存空間,因而每一個設備的寄存器都有一個惟一的地址。這種稱爲內存映射I/O。

另外一種方式是兩種的結合,寄存器擁有I/O端口,而數據緩衝區則映射到內存空間。Pentinum就是使用這種方式,因此在IBM-PC兼容機中,內存的0-640K是I/O端口地址,640K-1M的地址是保留給設備數據緩衝區的。(關於內存分佈後面文章會介紹)

 

對於咱們程序員來講這兩種方案有所不一樣

  1. 對於第一種方式須要使用匯編語言來操做,而第2種方式則可使用C語言來編程,由於他不須要特殊的指令控制,對待I/O設備和其餘普通數據訪問方式是相同的。
  2. 對於I/O映射方式,不須要特殊的保護機制來組織對I/O的訪問,由於OS已經完成了這部分工做,不會把這一段內存地址分配給其餘程序。
  3. 對於內存可用的指令,也能使用在設備的寄存器上。

任何技術有有點就會有缺點,I/O內存映射也同樣:

  1. 前面提到過Cache能夠對內存進行緩存,可是若是對I/O映射的地址空間進行緩存就會有問題。因此必須有機制來禁用I/O映射空間緩存,這就增大了OS的複雜性。
  2. 另外一個問題是,由於發送指令後須要判斷是內存仍是I/O操做,因此它們須要可以檢查所有的內存空間。之前CPU,內存和I/O設備在同一個總線上,因此檢查很方便。可是後來爲了提升CPU和內存效率,CPU和內存之間有一條高速的總線(好比QPI)。這樣I/O設備就沒法查看內存地址,由於內存地址總線旁落到了內存和CPU的高速總線上,因此須要一個額外的芯片來處理(北橋芯片,內存控制器的做用),增大了系統的複雜度。

 

3.2 CPU和I/O設備數據交換方式

前面已經知道CPU經過內存映射的方式和I/O設備交換數據,可是對於CPU來講,不管是從內存仍是I/O設備讀取數據,都須要把地址放到地址總線上,而後在向控制總線傳遞一個READ信號,還要用一條信號線來表示是從內存仍是I/O讀取數據。由於I/O映射的內存區域是特定的,因此不存在沒法區分是內存仍是I/O操做。目前一共有3種方式進行操做:

  1. 程序控制I/O: CPU在向I/O設備發出指令後,經過程序查詢方式檢查I/O設備是否完成工做,若是完成就讀取數據,這種方式缺點是CPU在I/O設備工做時被佔用。
  2. 中斷驅動I/O: CPU是稀缺資源,因此爲了提升利用率,減小I/O等待。在I/O設備工做時CPU再也不等待,而是進行其餘的操做,當I/O設備完成後,經過一個硬件中斷信號通知CPU。CPU在來處理接下來的工做,好比讀取數據存放到內存。可是每次只能請求一個字節,效率很低。
  3. DMA: Direct Memory Access利用一種特性的芯片存在於CPU和I/O設備之間。CPU須要操做I/O設備時只須要發送消息給DMA芯片,後面的事情所有內又DMA來完成,當把所須要數據放入內存後在通知CPU進行操做,整個過程DMA直接和內存總線打交道,而CPU也只須要和DMA芯片和內存交互,大大提升了速度。

 

總結

 

這一篇文章介紹了計算機組件中的存儲器的分類和工做原理,以及I/O設別的工做方式。經過總線將各個部件鏈接起來。咱們能夠看到計算機的發展不光是CPU,存儲器以及I/O設備的發展,總線也是起了很是關鍵的做用。經過前2章的介紹,應該對計算機硬件的工做原理有了大概的瞭解。後面開始將主要偏向計算機操做系統軟件的工做方式。固然這些也是和一些硬件的特性分不開的。

 

 

 

參考

《深刻理解計算機系統》

 

《現代操做系統(原書第3版)》

 

動態隨機存取存儲器

 

動態隨機存取存儲器:

 

寄存器的速度爲什麼比內存更快?

 

PC架構系列:CPU/RAM/IO總線的發展歷史!

 

內存核心頻率、工做頻率、預讀技術詳解

相關文章
相關標籤/搜索