简单了解计算机组成原理 -- CPU与操作系统
本文主要是從程序運(yùn)行來看計(jì)算機(jī)組成原理
我們平時(shí)常說的程序, 大多指的是一個(gè)可執(zhí)行文件 .exe, 當(dāng)雙擊 .exe文件運(yùn)行時(shí), 操作系統(tǒng)就會(huì)讀取這個(gè)文件, 將其加載到內(nèi)存中, 由CPU中的寄存器讀取相應(yīng)指令, 運(yùn)算后返回內(nèi)存
Java代碼也是同理.
寫了一個(gè) .java 被編譯成 .class 后被 JVM 進(jìn)行加載, .class中保存的就是一些二進(jìn)制指令 (和CPU無關(guān)), 也就會(huì)先放在內(nèi)存中
1 計(jì)算機(jī)的大腦----CPU:中央處理器
1.1 簡介
- 芯片:主要指的就是CPU
在計(jì)算機(jī)中,機(jī)組,微機(jī)原理接口技術(shù),計(jì)算機(jī)系統(tǒng)結(jié)構(gòu),模電,數(shù)電…都是在講CPU的,這幾門課是計(jì)算機(jī)的基礎(chǔ)
1.1.1 引入: CPU與顯卡的區(qū)別
- CPU:: 通用計(jì)算結(jié)構(gòu) -> 應(yīng)對各種計(jì)算場景
- 相當(dāng)于大學(xué)生, 參加工作, 可以從事各種工作, 當(dāng)然能計(jì)算1+1
- 顯卡: 專用計(jì)算芯片 -> 特別擅長大量的簡單運(yùn)算, 如: 大規(guī)模浮點(diǎn)數(shù), 尤其是矩陣運(yùn)算) - 相當(dāng)于小學(xué)生, 只會(huì)算1+1,但有些場景下需要運(yùn)算大量的1+1
- 游戲: 畫面非常復(fù)雜, 需要很大運(yùn)算量
- 挖礦: 本質(zhì)是狂算 哈希值, 相當(dāng)于把自己電腦的算力貢獻(xiàn)出來, 替別人完成一些簡單運(yùn)算, 當(dāng)你的電腦算力為其他人提供了實(shí)質(zhì)性幫助時(shí), 他人就會(huì)給你一定報(bào)酬, 這個(gè)過程成為挖礦
- 機(jī)器學(xué)習(xí): 模型的訓(xùn)練, 也需要巨大的運(yùn)算量 (如: 對龐大數(shù)據(jù)進(jìn)行分析等)
1.1.2 一些基本參數(shù)
- 1.90GHz : CPU的主頻, 描述了CPU的運(yùn)算速度
- Hz: 一秒震動(dòng) (運(yùn)算) 一次
- G: 1G ≈10億
1.2 內(nèi)部結(jié)構(gòu)
1.2.1 本質(zhì): 一系列的門電路
半加器 (2bits輸入, 2bits輸出) + 全加器 (3bits輸入, 2bits輸出) -> 各種加法器 -> 各種門電路 -> 計(jì)算單元 / 控制單元/ 存儲(chǔ)單元… => CPU
1.2.1.1 CPU內(nèi)部結(jié)構(gòu)的發(fā)展方向
底層設(shè)備結(jié)構(gòu)的變化, 對于程序員的代碼編寫方式, 也是有深遠(yuǎn)影響的
1.2.1.1.1 制程 越來越小
-
什么是制程?
計(jì)算機(jī)芯片框架的運(yùn)算速度
- 運(yùn)算速度: 每秒處理的百萬級的機(jī)器語言指令數(shù). 微機(jī)一般用主頻來描述運(yùn)算速度. 主頻越高, 運(yùn)算速度越快 -
為什么我們認(rèn)為CPU的 制程 越小越好?
一個(gè)CPU芯片的面積是固定的,制程越小,單個(gè)門電路體積越小, 整個(gè)CPU上能夠搭載的門電路數(shù)量越多, CPU上的功能模塊越多, 算的就更快
但從物理角度來說, 制程是無法無限小的, 縱使無限小, 在nm尺度上, 經(jīng)典力學(xué)已經(jīng)處在失效的邊緣了. 目前就小制程CPU的研究方向于 “量子計(jì)算機(jī)”, 它的計(jì)算能力會(huì)比經(jīng)典計(jì)算機(jī)提升好多個(gè)數(shù)量級
1.2.1.1.2 多核CPU
家用PC上, 好的CPU, 12核24線程 #并發(fā)編程
如果在服務(wù)器的CPU上, 核心數(shù)會(huì)更多
1.2.2 寄存器
- 功能: 存儲(chǔ)程序運(yùn)行中的數(shù)據(jù)
- 和內(nèi)存相比, 功能差不多, 數(shù)據(jù)斷電就消失; 同時(shí), 存儲(chǔ)空間更小, 訪問速度更快 (比內(nèi)存又快3-4個(gè)數(shù)量級)
- CPU的計(jì)算是針對寄存器中的值進(jìn)行的, 輔助計(jì)算, 保存計(jì)算中所需要的中間結(jié)果
- 示例: 計(jì)算10+20
- 從 內(nèi)存 中讀 10 到 寄存器A
- 從 內(nèi)存 中讀 20 到 寄存器B
- 執(zhí)行相加指令, 把兩個(gè)寄存器的值相加, 保存到 寄存器A 中
- 把 寄存器A 中的值寫回內(nèi)存
1.3 CPU如何進(jìn)行工作
1.3.1 指令: 人給計(jì)算機(jī)發(fā)布的命令
1.3.1.1 人與計(jì)算機(jī)的交流
-
人寫的: 高級語言
- Java/C 等編程語言構(gòu)成的代碼
-
計(jì)算機(jī)認(rèn)識的: 機(jī)器語言
- 二進(jìn)制的指令
- [[attachment/未命名#^326d9f|指令表]] (極簡版本, 實(shí)際上指令有很多)
- 二進(jìn)制的指令
-
編譯: 把 高級語言 翻譯成 機(jī)器語言
1.3.1.2 CPU執(zhí)行一條指令的過程
1.3.1.2.1 程序計(jì)數(shù)器(PC指針)
在x86_32CPU叫做eip寄存器程序計(jì)數(shù)器中包含了一個(gè)"地址", 指示接下來要讀取哪個(gè)內(nèi)存里的指令
解析指令
- 按照設(shè)定進(jìn)行解讀. 如: 一個(gè)8bit 指令, 前4bit 是其操作碼(opcode), 表示指令要干什么; 后4bit 是操作數(shù)
- 指令00101110 => 從11010這個(gè)地址中讀取一個(gè)字節(jié)進(jìn)到A寄存器中
- 0010 Load_A
- 1110 要讀取的內(nèi)存地址
- 指令00101110 => 從11010這個(gè)地址中讀取一個(gè)字節(jié)進(jìn)到A寄存器中
執(zhí)行指令
然后, 程序計(jì)數(shù)器 進(jìn)行累加, 再去讀取下一條指令(針對單純的順序語句)
1.3.1.3 CPU如何執(zhí)行多條指令: “流水線”
負(fù)責(zé)讀指令的程序計(jì)數(shù)器讀完第一條, 緊接著讀第二條, 第三條…
負(fù)責(zé)解析指令的解析完第一條, 緊接著解析第二條, 第三條…
…
- 遇到條件判定, 循環(huán), 函數(shù)調(diào)用時(shí), 誰是第二條指令? 或 上一條指令還沒有解析完成時(shí), 負(fù)責(zé)執(zhí)行的已經(jīng)執(zhí)行完成, 怎樣執(zhí)行未知的下一條語句 能夠?qū)⒊绦蜻\(yùn)行效率最大化?
CPU有很多相關(guān)的運(yùn)算形式, 如: 分支預(yù)測…
1.3.1.3.1 分支預(yù)測
通俗來講, 就是CPU去猜測下一條指令, 如果猜中了, 流水線就繼續(xù)跑, 如果猜錯(cuò)了, 重新按照實(shí)際情況再讀一遍指令
即: 第N條指令還沒執(zhí)行完, 就要猜測第N+1條指令是什么, 并為其安排流水線
#問題 重讀一遍指的是繼續(xù)猜嗎? : 邊執(zhí)行邊猜, 猜不中就等其按照流程執(zhí)行完就行了
比如: 御魂計(jì)算器正在計(jì)算你的御魂需求, 然后你同時(shí)也亂配御魂, 如果你亂配的剛好滿足了你的御魂需求, 就不用繼續(xù)計(jì)算了. 但如果直到算完了也配不出來, 問題不大, 因?yàn)橐呀?jīng)算完了, 然后就可以接著算下一套御魂…
1.3.1.3.2 時(shí)鐘周期
流水線之間為了相互配合而確定, 每個(gè)指令的執(zhí)行都需要消耗幾個(gè)時(shí)鐘周期
- 1.9GHz CPU: 1s有19億個(gè)時(shí)鐘周期
CPU, 存儲(chǔ)器, 輸入設(shè)備, 輸出設(shè)備… 都是"硬件"設(shè)備, 普通用戶要和硬件打交道, 還是有點(diǎn)難度. 于是誕生了操作系統(tǒng)這個(gè)軟件, 用于管理各種硬件設(shè)備 并給各種軟件提供穩(wěn)定的運(yùn)行環(huán)境
Windows, MAC, 安卓…都是操作系統(tǒng), 廠商不同, 細(xì)節(jié)有差別, 但核心工作都是上面兩條
2 操作系統(tǒng)
2.1 結(jié)構(gòu)
2.1.1 應(yīng)用程序
2.1.2 系統(tǒng)調(diào)用
如果你想在控制臺打印一個(gè) “hello”, 這個(gè)過程中你必須調(diào)用庫函數(shù) printf, 其內(nèi)部就要調(diào)用 操作系統(tǒng)提供的系統(tǒng)調(diào)用write, 調(diào)用write時(shí)就會(huì)進(jìn)入到內(nèi)核來執(zhí)行, 內(nèi)核就要進(jìn)一步控制硬件, 完成輸出過程
2.1.3 操作系統(tǒng)的核心部分: 內(nèi)核
內(nèi)核是操作系統(tǒng)實(shí)現(xiàn)其主要功能 (管理各種硬件設(shè)備, 并給各種軟件提供穩(wěn)定的運(yùn)行環(huán)境) 的部分
當(dāng)我們使用操作系統(tǒng)進(jìn)入內(nèi)核時(shí), 涉及到 用戶態(tài) 到 內(nèi)核態(tài) 間的切換, 要運(yùn)行的程序有很多, 但內(nèi)核只有一個(gè), 就很可能要排隊(duì)等待
2.1.4 驅(qū)動(dòng)程序
是一個(gè)由 軟件廠商 提供的 軟件程序
直接和硬件設(shè)備打交道, 驅(qū)動(dòng)程序相當(dāng)于在 硬件 和 內(nèi)核 之間來了一層轉(zhuǎn)換
用軟件操作硬件一般都很簡單, 因?yàn)橛布话愣紩?huì)提供一些"寄存器"
2.1.5 硬件設(shè)備
- 操作系統(tǒng)結(jié)構(gòu)示意圖:
總結(jié)
以上是生活随笔為你收集整理的简单了解计算机组成原理 -- CPU与操作系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 足球射门
- 下一篇: 爱普生发布特殊3D眼镜:内建Google