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