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