文章目錄 一、馮諾依曼體系二、CPU的基本工作流程1.邏輯門2.門電路(Gate Circuit)1.非門2.與門3.或門4.異或門 3.算術(shù)邏輯單元 ALU(Arithmetic & Logic Unit)1.算術(shù)單元2.邏輯單元 三、存儲器四、操作系統(tǒng)(OS)1,進(jìn)程2.進(jìn)程管理(重點)并發(fā)式執(zhí)行并行式執(zhí)行 3. 進(jìn)程的屬性(1) 進(jìn)程的狀態(tài)(2) 進(jìn)程的優(yōu)先級(3) 進(jìn)程的上下文(4) 進(jìn)程的記賬信息 4. 虛擬地址空間 總結(jié)
一、馮諾依曼體系
清爽的鑰匙,可以說是計算機(jī)的祖師爺。被后人成為“現(xiàn)代計算機(jī)之父”
它提出了計算機(jī)制造的三個基本原則,即采用二進(jìn)制邏輯、程序存儲執(zhí)行以及計算機(jī)由五個部分組成(運(yùn)算器、控制器、存儲器、輸入設(shè)備、輸出設(shè)備),這套理論被稱為lhdrg體系結(jié)構(gòu)。
CPU 中央處理器: 進(jìn)行算術(shù)運(yùn)算和邏輯判斷.存儲器: 分為外存和內(nèi)存, 用于存儲數(shù)據(jù)(使用二進(jìn)制方式存儲)輸入設(shè)備:用戶給計算機(jī)發(fā)號施令的設(shè)備.輸出設(shè)備: 計算機(jī)個用戶匯報結(jié)果的設(shè)備
如果對于存儲空間
磁盤 > 內(nèi)存 > CPU
如果對于訪問速度
CPU > 內(nèi)存 > 磁盤
CPU想必都不陌生,現(xiàn)在的電腦CPU已經(jīng)到了 11 代了,這個 2.40GHz是什么意思呢。這其實是CPU的主頻
粗略的說:CPU的主頻就是時鐘的震蕩的每秒次數(shù),可近似的看作每秒執(zhí)行的指令數(shù)。簡單的說就是主頻決定了CPU的運(yùn)算速度。
接下來,我們用一個從無到有的過程,一步步搭建一個 CPU 出來,希望大家可以借助這個過程,理解CPU、內(nèi)存等計算機(jī)主要部件的工作原理。
1.邏輯門電子開關(guān) —— 機(jī)械繼電器(Mechanical Relay)
通過電子開關(guān),我們可以實現(xiàn) 1 位(bit) 的看似無用的邏輯運(yùn)算。
接下來,我們學(xué)習(xí)如何使用電子開關(guān)構(gòu)建一些有用的部件 —— 門電路??梢詫崿F(xiàn) 1 位(bit) 的基本邏輯運(yùn)算。其實幾個門電路非常好理解,Java的邏輯運(yùn)算差不多。
1.非門非門非常好理解,輸入為 true 輸出 false,輸入false 則輸出 true
兩個都為 true才輸出true,否則輸出false
一個為 1則為1,兩個為 false 則為false
通過非門與門和或門相結(jié)合就形成了異或門,相同為 false,不相同則為 true
這里的 true 和 false 在計算機(jī)里其實就是 1 和 0
3.算術(shù)邏輯單元 ALU(Arithmetic & Logic Unit)ALU 是計算機(jī)中進(jìn)行算數(shù)、邏輯運(yùn)算的核心部件,是計算機(jī)的數(shù)學(xué)大腦.
說到運(yùn)算我們首先想到二進(jìn)制的運(yùn)算,這個想必大家都了解,逢二進(jìn)一嘛。
算數(shù)單元,負(fù)責(zé)計算機(jī)里的所有數(shù)字操作,比如四則運(yùn)算,當(dāng)然它能做的遠(yuǎn)遠(yuǎn)不止這些。
半加器:
半加器就是通過一個與門和異或門,來計算兩個 1位(bit)數(shù)的相加,既要考慮到和也要考慮到進(jìn)位。
全加器:
全加器是通過兩個半加器進(jìn)行 3個1位(bit)的數(shù) 進(jìn)行運(yùn)算,同樣要考慮計算出來的和是否要進(jìn)位
加法器
通過1個半加器和7個全加器就能組成一個能計算 8個位 1位(bit) 的全加器。
圖中的A和B就是輸入的兩個數(shù)的第幾個bit位,同理 S 就是輸出數(shù)的 bit 位
算術(shù)單元支持的操作當(dāng)然遠(yuǎn)不止這些,通過繼續(xù)組合邏輯門,算數(shù)單元可以做到加減乘除甚至更多的算術(shù)運(yùn)算,但一個加法器作為演示已經(jīng)足夠了。
其實計算機(jī)只能做加法運(yùn)算,都是通過加法器來實現(xiàn)的,因為計算機(jī)里存的都是補(bǔ)碼,就是為了通過加法器來計算加減乘除運(yùn)算,只不過更復(fù)雜,這里就不深究。
邏輯單元主要用來進(jìn)行邏輯操作,最基本的操作就是 與、或、非操作,但不只是一位(bit)數(shù)的比較
三、存儲器
存儲器分為內(nèi)存和外存
內(nèi)存:就是平時所說的電腦內(nèi)存,也就相當(dāng)于手機(jī)的運(yùn)存。
外存:磁盤、U盤等。
內(nèi)存比較而且貴,外存比較大但比較便宜。
內(nèi)存有一個特點:它可以隨機(jī)訪問內(nèi)存中任意地址的數(shù)據(jù)。
外存其實也有隨機(jī)訪問的能力,但開銷較大,所以外存更適合順序訪問。
內(nèi)存的訪問速度非??欤獯娴脑L問速度非常慢。
CPU上其實也能存儲,CPU上的寄存器,內(nèi)存更小速度非常的快,也更加的貴!
四、操作系統(tǒng)(OS)操作系統(tǒng)是一個"搞管理" 的軟件
1.管理硬件設(shè)備
2.管理軟件資源(文件、進(jìn)程)
所謂的”管理“一般值的是兩個方面:描述+組織
進(jìn)程是操作系統(tǒng)中非常核心的一個概念,進(jìn)程其實是計算機(jī)完成工作的一個"過程"
如圖所示:進(jìn)程就是一個正在運(yùn)行的程序,要想讓進(jìn)程跑起來,就得給這個進(jìn)程分配一定的系統(tǒng)硬件資源(CPU,內(nèi)存,磁盤,網(wǎng)絡(luò)帶寬…)
關(guān)于進(jìn)程,最核心的問題就是進(jìn)程在系統(tǒng)中是如何被管理的,
管理 = 描述(PCB) + 組織
PCB:進(jìn)程的控制塊,這是一個C語言的結(jié)構(gòu)體類似于Java中的類,一個結(jié)構(gòu)體對象就對應(yīng)一個進(jìn)程
組織:使用一定的數(shù)據(jù)結(jié)構(gòu)來組織,常見的作法就是使用雙向鏈表
查看進(jìn)程列表,本質(zhì)上就是遍歷操作系統(tǒng)內(nèi)核中的這個鏈表,并顯示其中的屬性;
創(chuàng)建一個進(jìn)程:本質(zhì)上就是創(chuàng)建一個PDB對象,加入到內(nèi)核的鏈表中
銷毀一個進(jìn)程,本質(zhì)上就是把這個PCB對象從內(nèi)核鏈表中刪除掉
PCB中大概有那些屬性呢?
pid:一個進(jìn)程的身份標(biāo)識,一個機(jī)器同一時刻,不可能有兩個進(jìn)程的 pid 相同
內(nèi)存指針:描述了這個進(jìn)程使用的內(nèi)存空間是哪個范圍(虛擬地址空間)
文件描述符表:描述了這個進(jìn)程都打開了那些文件
系統(tǒng)中打開一個文件,其實就得到了一個"文件描述符",這個文件描述符就像一個遙控器一樣,文件數(shù)據(jù)是存放在磁盤上的,代碼中操作磁盤數(shù)據(jù)不像操作內(nèi)存數(shù)據(jù)那么方便,所以往往是借助這種遙控器的方式來操作
2.進(jìn)程管理(重點)我們電腦上有幾百個進(jìn)程在運(yùn)行,但電腦只有1個CPU,而且一般都是4核或者8核的CPU,8核心相當(dāng)于CPU有8個分身,那么這么多進(jìn)程是怎么運(yùn)行的呢?
進(jìn)程這么多,CPU就那么幾個分身。那么就涉及到進(jìn)程調(diào)度了,電腦上的多任務(wù)系統(tǒng)其實就是基于進(jìn)程調(diào)度這樣的機(jī)制來完成的。
并發(fā)式執(zhí)行并發(fā)式執(zhí)行:1個CPU運(yùn)行多個進(jìn)程,
由于CPU的運(yùn)行速度極快,雖然CPU在一直進(jìn)行切換,但是咱們坐在電腦前的用戶,是感知不到這個切換的過程的。
并行式執(zhí)行:多個CPU,運(yùn)行多個進(jìn)程
CPU1運(yùn)行進(jìn)程1,CPU2運(yùn)行進(jìn)程2.
進(jìn)程1和進(jìn)程2無論是微觀還是宏觀,都是同時執(zhí)行的。
真實的計算機(jī),真實的操作系統(tǒng)在進(jìn)行進(jìn)程調(diào)度的時候,是并發(fā)并行兩種策略綜合使用的。
3. 進(jìn)程的屬性 (1) 進(jìn)程的狀態(tài)運(yùn)行狀態(tài):進(jìn)程正在運(yùn)行
就緒狀態(tài):進(jìn)程已經(jīng)做好準(zhǔn)備,隨時準(zhǔn)備被CPU調(diào)度執(zhí)行
阻塞狀態(tài):進(jìn)程在此狀態(tài)不能執(zhí)行,只有等阻塞該進(jìn)程的事件完成后才能執(zhí)行,比如編程時等待我們輸入
(2) 進(jìn)程的優(yōu)先級給進(jìn)程安排不同的優(yōu)先級,優(yōu)先級越高的進(jìn)程,更容易被CPU調(diào)度執(zhí)行。
(3) 進(jìn)程的上下文記住進(jìn)程上次運(yùn)行到哪個指令了,方便下次調(diào)度的時候能夠繼續(xù)從這個位置來運(yùn)行。
進(jìn)程的上下文,主要是存儲調(diào)度出CPU之前,寄存器中的信息(把寄存器信息保存到內(nèi)存中)
等到這個進(jìn)程下次恢復(fù)到CPU上執(zhí)行的時候,就把內(nèi)存保存好的數(shù)據(jù)恢復(fù)到寄存器中。(進(jìn)程本身是感知不到自己啥時候被調(diào)度出CPU的)
記錄進(jìn)程在CPU上執(zhí)行了多久了,用來輔助決定這個進(jìn)程是繼續(xù)執(zhí)行,還是要調(diào)度出CPU了。
4. 虛擬地址空間一個進(jìn)程想要運(yùn)行,就需要給它分配一些系統(tǒng)資源,其中內(nèi)存就是一個最核心的資源。
物理地址:真實的內(nèi)存的地址
假設(shè):
0x100 - 0x700 這個內(nèi)存分給 進(jìn)程1
0x100 - 0x700 這個內(nèi)存分給 進(jìn)程2
0x100 - 0x800 這個內(nèi)存分給 進(jìn)程3
這里的地址都是操作系統(tǒng)抽象出來的虛擬地址
系統(tǒng)會自動的把這個虛擬地址轉(zhuǎn)換成真實的物理地址
為什么要有虛擬地址空間?而不直接訪問真實的物理地址?
目的就是為了一定程度的減少內(nèi)存訪問越界,帶來的后果
比如:
進(jìn)程1 的內(nèi)存范圍 0x100 - 0x700,如果我的代碼嘗試修改 0x701的地址的數(shù)據(jù),這個操作就是越界訪問(錯誤的操作)
如果這是一個真實的物理地址,這個修改就真的把 0x701給修改了,
恰好 0x701是進(jìn)程2 要使用的內(nèi)存地址,此時進(jìn)程2 可能就出 bug 了,就會直接奔潰
但如果進(jìn)程訪問的是虛擬地址,也嘗試修改0x701
此時系統(tǒng)就要針對 0x701 來查詢頁表,找到對應(yīng)的物理地址
由于 0x701 已經(jīng)是非法地址,在 頁表中查不到了,系統(tǒng)就會明白,是在越界訪問,于是就直接讓這個進(jìn)程出現(xiàn)崩潰(系統(tǒng)就會發(fā)送一個型號,這個信號通常會導(dǎo)致進(jìn)程奔潰),防止影響到其它線程。
這樣做,就讓進(jìn)程和進(jìn)程之間相互影響的可能性變小了,隔離性增加了,進(jìn)程也就更加穩(wěn)定了。
虛擬地址空間:好處就是讓進(jìn)程之間獨立性提高了,不至于相互影響,整個系統(tǒng)更加穩(wěn)定。
缺點:兩個進(jìn)程需要相互配合的時候,溝通起來就困難了(進(jìn)程間通信)
進(jìn)程1 和 進(jìn)程2 由于虛擬地址空間(進(jìn)程的獨立性),導(dǎo)致很難相互進(jìn)行訪問對方的內(nèi)存。
如果要想相互交流溝通,就需要使用一些特殊的手段,比如:文件,管道(是內(nèi)核中提供的一個隊列),消息隊列,信號量等
總結(jié)
進(jìn)程的幾個重要屬性:
進(jìn)程的狀態(tài)進(jìn)程的優(yōu)先級進(jìn)程的上下文進(jìn)程的記賬信息