人類爲何要發明計算機?一直以來,人類都有愛偷懶的習慣,而正是因爲這個緣由,促使了人類發明了計算機,從而提升生產力,那麼人類有了更多空閒時間去娛樂了~~緩存
馮諾依曼結構的計算機由五大組成部分,分別是計算器、控制器、存儲器(內存)、輸入設備和輸出設備,而計算機和控制器組成CPU(center process unit,中央處理單元)。馮.諾依曼結構的特色就是數據和指令以二進制形式,不加區別的存放在存儲器中。以計算兩個數相加爲例,首先將相關代碼和數據讀入到內存中,編譯器將相關代碼編譯成彙編代碼。數據200和數據400分別存放在地址爲1000、1004的地方,MOVE [1000] EAX
表示將地址是1000的內容放到寄存器EAX中,MOVE [1004] EBX
表示將地址是1004的內容放到寄存器EBX中,ADD EAX EBX
表示將EAX和EBX的內容相加,並將結果存放到EBX寄存器中。咱們發現,簡單的數據相加在彙編層面卻對應着3條指令,若是更加複雜的數據運算就須要更加複雜的指令了。bash
CPU經過I/O橋和內存相連,I/O橋和IO總線相連,IO總線掛載着USB控制器、圖形控制器和磁盤控制器。 總線結構(不是全部的設備都是兩兩相連,而是經過總線結構)微信
SOA也是總線結構,服務之間並非兩兩相連的網絡
代碼存放在磁盤中,若是要運行代碼,首先須要將磁盤中的代碼放到內存中,而後CPU找到這段程序的第一個地址,例如找到main方法的地址數據結構
I/O橋是對南橋和北橋的抽象併發
北橋:鏈接的是快速設備,例如鏈接的是內存異步
南橋:鏈接的是慢速設備 spa
常見的指令格式有三地址指令、二地址指令、一地址指令和零地址指令,以下圖所示,其中,二地址指令所佔用的空間比三地址指令要少,x86系列的處理器就是採用二地址形式的;一地址指令一般被用做累加器;零地址指令地址比較緊湊,可是要完成一件事情,通常會比二地址或三地址指令須要更多的指令,例如code
iconst_1
iconst_2
iadd
istore_0
複製代碼
iadd(表示整形加法)指令並無任何參數。連源地址都沒有指定,零地址指令有什麼做用?零地址意味着源和目標都是隱含參數,其實現依賴於一種常見的數據結構--棧。cdn
指令的執行是分步驟的(取指、譯碼、執行等),也正是這個緣由,它對應着不一樣的部件,這些部件咱們要充分的利用起來,因此纔有了流水線這個概念。若是不採用流水線,那麼CPU的速度會變得很慢,譬如:當取值部件正在取值時,譯碼、執行部件是空閒的。因此,當一條指令在譯碼的時候,另外一條指令從內存中取指令,這樣作,取值部件和譯碼部件均可以利用起來了。
下面這張圖描述的是CPU、內存、硬盤和網絡之間的速度差別,其中,CPU的速度是1s,主存速度是6min,硬盤速度是1~12個月,而網絡速度則達到19年,咱們發現這些設備的速度差異巨大,內存比CPU慢幾百倍,硬盤比CPU慢幾十萬倍,網絡比CPU慢千萬倍,這樣一來,CPU能坐等內存或硬盤慢吞吞的幹活嗎?或者說,有什麼方法解決這種局面嗎?
1. 提高硬盤等設備的速度,和CPU匹配(現階段不可能)
2. 認可侷限,但充分壓榨CPU的能力,讓CPU"忙死"
同步 -> 異步 異步經典的例子就是DMA(Direct Memory Access,直接內存訪問),CPU發起一個硬盤讀的操做以後,不等待硬盤完成,馬上去幹別的事情,由DMA控制器來負責把數據從硬盤讀到內存,完成後通知CPU。
順序 -> 併發 順序就是每一個程序按序執行;併發就是在單個CPU上經過時間片切換方式實現執行不一樣指令,因爲時間片很短,人類是感受不出來的,所以咱們感受多個程序是並行執行的;而並行是在多個CPU上實現多個程序同時執行。
歡迎關注微信公衆號:木可大大,全部文章都將同步在公衆號上。