2021-05-12 14:32:11
計算機基礎系列教學一:計算機硬體
計算機(Computer),俗稱電腦,是一種能夠按照事先儲存的程式,自動、高速地進行大量數值運算和各種資訊處理的現代化智慧電子裝置。計算機硬體發展史(From Egon)
計算機系統
一台完整的計算機硬體系統由以下5部分構成:運算器、記憶體、控制器、輸入裝置、輸出裝置。
CPU(Center Processing Unit,集運算及控制)
整個計算機硬體系統中,最重要的當屬CPU了,它在整個計算機系統中的作用就相當於我們的大腦。它從記憶體中取指令->解碼->執行,然後再取指令->解碼->執行下一條指令,周而復始,直至整個程式被執行完成。因為存取記憶體以得到指令或資料的時間比cpu執行指令花費的時間要長得多,所以,CPU內部都有一些用來儲存關鍵變數和臨時資料的暫存器,這樣通常在cpu的指令集中專門提供一些指令,用來將一個字(可以理解為資料)從記憶體調入暫存器,以及將一個字從暫存器存入記憶體。cpu其他的指令集可以把來自暫存器、記憶體的運算元據組合,或者用兩者產生一個結果,比如將兩個字相加並把結果存在暫存器或記憶體中。這樣再次呼叫暫存器中的指令就會使等待時間大大縮短。
暫存器的分類:
1.儲存變數和臨時結果的通用暫存器。
2.多數計算機還有一些對程式設計師設計的專門暫存器,其中之一便是程式計數器(或稱為指令指標),它儲存了將要取出的下一條指令的記憶體地址。在指令取出後,程式計算器就被更新以便執行後期的指令。
3.另外一個暫存器便是堆疊指標,它指向記憶體中當前棧的頂端。該棧包含已經進入但是還沒有退出的每個過程中的一個框架。在一個過程的堆疊框架中儲存了有關的輸入引數、區域性變數以及那些沒有儲存在暫存器中的臨時變數。
4.最後一個非常重要的暫存器就是程式狀態字暫存器(Program Status Word,PSW),這個暫存器包含了條碼位(由比較指令設定)、CPU優先順序、模式(使用者態或核心態),以及各種其他控制位。使用者通常讀入整個PSW,但是只對其中少量的欄位寫入。在系統呼叫和I/O中,PSW非常非常非常非常非常非常重要。
除了在嵌入式系統中的非常簡單的CPU之外,多數CPU都有兩種模式,即核心態與使用者態。通常,PSW中有一個二進位制位控制這兩種模式。
核心態:當cpu在核心態執行時,cpu可以執行指令集中所有的指令,很明顯,所有的指令中包含了使用硬體的所有功能。(作業系統在核心態下執行,從而可以存取整個硬體)
使用者態:使用者程式在使用者態下執行,僅僅只能執行cpu整個指令集的一個子集,該子集中不包含操作硬體功能的部分,因此,一般情況下,在使用者態中有關I/O和記憶體保護(作業系統占用的記憶體是受保護的,不能被別的程式佔用),當然,在使用者態下,將PSW中的模式設定成核心態也是禁止的。
那為什麼需要設計出兩種工作模式呢?由於需要限制不同的程式之間的存取能力, 防止他們獲取別的程式的記憶體資料, 或者獲取外圍裝置的資料, 並行送到網路, CPU從而劃分出兩個許可權等級。
所有使用者程式都是執行在使用者態的,但是有時候程式確實需要做一些核心態的事情, 例如從硬碟讀取資料,或者從鍵盤獲取輸入等。而唯一可以做這些事情的就是作業系統,所以此時程式就需要向作業系統請求以程式的名義來執行這些操作。
這時需要一個這樣的機制: 使用者態程式切換到核心態,但是不能控制在核心態中執行的指令,這種機制叫系統呼叫(system call),在CPU中的實現稱之為陷阱指令(Trap Instruction)。
它們的工作流程如下:
- 使用者態程式將一些資料值放在暫存器中, 或者使用引數建立一個堆疊(stack frame), 以此表明需要作業系統提供的服務。
- 使用者態程式執行陷阱指令。
- CPU切換到核心態, 並跳到位於記憶體指定位置的指令, 這些指令是作業系統的一部分, 他們具有記憶體保護, 不可被使用者態程式存取。
- 這些指令稱之為陷阱(trap)或者系統呼叫處理器(system call handler)。他們會讀取程式放入記憶體的資料引數, 並執行程式請求的服務。
- 系統呼叫完成後,作業系統會重置CPU為使用者態並返回系統呼叫的結果。
多執行緒和多核晶片
Moore定律指出,晶片中的電晶體數量每18個月翻一倍,隨著電晶體數量的增多,更強大的功能成為了可能,如
I.第一步增強:在cpu晶片中加入更大的快取,一級快取L1,用和cpu相同的材質製成,cpu存取它沒有延時。
II.第二步增強:一個cpu中的處理邏輯增多,intel公司首次提出,稱為多執行緒(multithreading)或超執行緒(hyperthreading),對使用者來說一個有兩個執行緒的cpu就相當於兩個cpu。多執行緒執行cpu保持兩個不同的執行緒狀態,可以在納秒級的時間內來回切換,速度快到你看到的結果是並行的,偽並行的,然而多執行緒不提供真正的併行處理,一個cpu同一時刻只能處理一個進程(一個進程中至少一個執行緒,進程是資源單位而執行緒才是cpu的執行單位)。
III.第三步增強:除了多執行緒,還出現了包含2個或者4個完整處理器的cpu晶片,如下圖。要使用這類多核晶片肯定需要有多處理作業系統。
圖3
記憶體
由於硬體技術的限制,我們可以製造出容量很小但很快的記憶體,也可以製造出容量很大但很慢的記憶體,魚與熊掌不可兼得,不可能製造出存取速度又快容量又大的記憶體。因此,現代計算機都把記憶體分成若干級,稱為Memory Hierarchy,按照離CPU由近到遠的順序依次是CPU暫存器、Cache、記憶體、硬碟,越靠近CPU的記憶體容量越小但存取速度越快,下圖給出了各種記憶體的容量和存取速度的典型值。
圖4
暫存器、Cache和記憶體中的資料都是掉電丟失的,這稱為易失性記憶體(Volatile Memory),與之相對的,硬碟是一種非易失性記憶體(Non-volatile Memory)。
除了存取暫存器由程式指令直接控制之外,存取其它記憶體都不是由指令直接控制的,有些是硬體自動完成的,有些是作業系統配合硬體完成的。
Cache從記憶體取資料時一次取一個Cache Line快取起來,作業系統從硬碟取資料時一次取 幾KB快取起來,都是希望這些資料以後會被存取到。大多數程式的行為都具有區域性性 (Locality)的特點:它們會花費大量的時間反復執行一小段程式碼(例如迴圈),或者反 復存取一個很小的地址範圍中的資料(例如存取一個陣列)。所以預讀快取的辦法是很有 效的:CPU取一條指令,我把它相鄰的指令也都快取起來,CPU很可能馬上就會取 到;CPU存取一個資料,我把它相鄰的資料也都快取起來,CPU很可能馬上就會存取到。 設想有兩台計算機,一台有32KB的Cache,另一台沒有Cache,而記憶體都是512MB的, 硬碟都是100GB的,雖然多出來32KB的Cache和記憶體、硬碟的容量相比微不足道,但由 於區域性性原理,有Cache的計算機明顯會快很多。高速記憶體即使容量只能做得很小也能 顯著提升計算機的效能,這就是Memory Hierarchy的意義所在。
暫存器即L1快取:
用與cpu相同材質製造,與cpu一樣快,因而cpu存取它無延時,典型容量是:在32位元cpu中為32*32,在64位元cpu中為64*64,在兩種情況下容量均<1KB。
快取記憶體即L2快取:
主要由硬體控制快取記憶體的存取,記憶體中有快取記憶體行按照0~64位元組為行0,64~127為行1......最常用的快取記憶體行放置在cpu內部或者非常接近cpu的快取記憶體中。當某個程式需要讀一個儲存字時,快取記憶體硬體檢查所需要的快取記憶體行是否在快取記憶體中。如果是,則稱為快取記憶體命中,快取滿足了請求,就不需要通過匯流排把存取請求送往主記憶體(記憶體),這畢竟是慢的。快取記憶體的命中通常需要兩個時鐘週期。快取記憶體未命中,就必須存取記憶體,這需要付出大量的時間代價。由於快取記憶體價格昂貴,所以其大小有限,有些機器具有兩級甚至三級快取記憶體,每一級快取記憶體比前一級慢但是容量大。
快取在電腦科學的許多領域中起著重要的作用,並不僅僅只是RAM(隨機存取記憶體)的快取行。只要存在大量的資源可以劃分為小的部分,那麼這些資源中的某些部分肯定會比其他部分更頻繁地得到使用。此時用快取可以帶來效能上的提升。一個典型的例子就是作業系統一直在使用快取,比如,多數作業系統在記憶體中保留頻繁使用的檔案(的一部分),以避免從磁碟中重複地呼叫這些檔案,類似的/root/a/b/c/d/e/f/a.txt的長路徑名轉換成該檔案所在的磁碟地址的結果然後放入快取,可以避免重複尋找地址,還有一個web頁面的url地址轉換為網路地址(IP)地址後,這個轉換結果也可以快取起來供將來使用。
快取是一個好方法,在現代cpu中設計了兩個快取,再看圖3中的兩種cpu設計。第一級快取稱為L1總是在CPU中,通常用來將已經解碼的指令調入cpu的執行引擎,對那些頻繁使用的資料自,多少晶片還會按照第二L1快取 。。。另外往往設計有二級快取L2,用來存放近來經常使用的記憶體字。L1與L2的差別在於對cpu對L1的存取無時間延遲,而對L2的存取則有1-2個時鐘週期(即1-2ns)的延遲。
記憶體:
再往下一層是主記憶體,此乃記憶體系統的主力,主記憶體通常稱為隨機存取儲存RAM,就是我們通常所說的記憶體,容量一直在不斷攀升,所有不能再快取記憶體中找到的,都會到主記憶體中找,主記憶體是易失性儲存,斷電後資料全部消失。
除了主記憶體RAM之外,許多計算機已經在使用少量的非易失性隨機存取儲存如ROM(Read Only Memory,ROM),在電源切斷之後,非易失性儲存的內容並不會丟失,ROM唯讀記憶體在工廠中就被程式設計完畢,然後再也不能修改。ROM速度快且便宜,在有些計算機中,用於啟動計算機的引導載入模組就存放在ROM中,另外一些I/O卡也採用ROM處理底層裝置的控制。
EEPROM(Electrically Erasable PROM,電可擦除可程式化ROM)和快閃記憶體(flash memory)也是非易失性的,但是與ROM相反,他們可以擦除和重寫。不過重寫時花費的時間比寫入RAM要多。在便攜式電子裝置中,快閃記憶體通常作為儲存媒介。快閃記憶體是數碼相機中的膠卷,是便攜式音譯播放器的磁碟,還應用於固態硬碟。快閃記憶體在速度上介於RAM和磁碟之間,但與磁碟不同的是,快閃記憶體擦除的次數過多,就被磨損了。
還有一類記憶體就是CMOS,它是易失性的,許多計算機利用CMOS記憶體來保持當前時間和日期。CMOS記憶體和遞增時間的電路由一小塊電池驅動,所以,即使計算機沒有加電,時間也仍然可以正確地更新,除此之外CMOS還可以儲存設定的引數,比如,哪一個是啟動磁碟等,之所以採用CMOS是因為它耗電非常少,一塊工廠原裝電池往往能使用若干年,但是當電池失效時,相關的設定和時間等都將丟失。
磁碟:
磁碟低速的原因是因為它是一種機械裝置,在磁碟中有一個或多個金屬碟片,它們以5400,7200或10800rpm(RPM =revolutions per minute 每分鐘多少轉 )的速度旋轉。從邊緣開始有一個機械臂懸在盤面上,這類似於老式黑膠唱片機上的拾音臂。資訊寫在磁碟上的一些列的同心圓上,是一連串的2進位制位(稱為bit位),為了統計方便,8個bit稱為一個位元組bytes,1024bytes=1k,1024k=1M,1024M=1G,所以我們平時所說的磁碟容量最終指的就是磁碟能寫多少個2進位制位。
每個磁頭可以讀取一段環形區域,稱為磁軌。把一個機械手臂位置上所有的磁軌合起來,組成一個柱面。每個磁軌劃成若干磁區,磁區典型的值是512位元組。
資料都存放於一段一段的磁區,即磁軌這個圓圈的一小段圓圈,從磁碟讀取一段資料需要經歷尋道時間和延遲時間。
平均尋道時間:
機械手臂從一個柱面隨機移動到相鄰的柱面的時間成為尋到時間,找到了磁軌就以為著招到了資料所在的那個圈圈,但是還不知道資料具體這個圓圈的具體位置。
平均延遲時間:
機械臂到達正確的磁軌之後還必須等待旋轉到資料所在的磁區下,這段時間稱為延遲時間。
虛擬記憶體:
許多計算機支援虛擬記憶體機制,該機制使計算機可以執行大於實體記憶體的程式,方法是將正在使用的程式放入記憶體取執行,而暫時不需要執行的程式放到磁碟的某塊地方,這塊地方稱為虛擬記憶體,在linux中稱為swap。這種機制的核心在於快速地對映記憶體地址,由cpu中的一個部件負責,稱為記憶體管理單元(Memory Management Unit ,MMU)。
PS:從一個程式切換到另外一個程式,稱為上下文切換(context switch),快取和MMU的出現提升了系統的效能,尤其是上下文切換。
圖5
圖6
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2017-05/144224p2.htm
相關文章