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