文章目錄
- CPU執行指令過程
- 進程
- PCB
- “分時復用”
- ??結語
CPU執行指令過程
一個CPU能執行那些指令,可以認為是cpu最初設計的時候就已經寫死了。有一個“表格”描述了都有哪些指令。
以上的表格只是一個簡化版本,真實的cpu指令表要復雜很多。此處假設每個指令只有8bit(實際上更長)。
RAM
即內存,它的全稱叫做隨機訪問存儲器。
8 bit的指令可以分成兩個部分,前4個bit 是 操作碼,表示指令是干啥的,后4bit 是操作數。
CPU中存在了一個特殊的寄存器,“程序計數器”,它保存了接下來要從哪個內存位置來執行指令。隨著指令的執行,這里的值也會隨著更新,默認情況下就是+1自增過程(順序執行),如果遇到“跳轉類語句”(if、while、for、函數調用…)那么它就會設為其他的值。
執行指令的三個階段:
- 取指令,cup從內存中讀取到指令內容到cpu內部
- 解析指令,識別出這個指令是干啥的,以及對應的功能和操作數
- 執行指令
-
初始情況下,程序計數器的值是0
- 讀取指令
- 解析指令
把讀到的指令一分為二
左邊這里就是操作碼
右邊這里就是操作數
操作碼表示它是干啥的指令;操作數表示這個指令是對誰操作的。
我們可以去指令表中看這個操作碼是啥意思。這個指令是LOAD A指令,并且后面的 1110 表示了一個內存地址。這個指令的工作就是把 1110 這個地址的數據,讀取到寄存器 A 中。
3. 執行指令
把1110 (十進制的14) 地址的內存數據讀取出來,放到寄存器A中。第一條指令執行完畢,系統會自動把程序計數器中的值++ - 讀取指令
-
執行為1的指令
- 讀取指令
2. 解析指令
把指令拆成 0001(操作碼) 和 1111(操作數)。
這個指令是LOAD B,就要把1111(十進制的15)地址上的數據讀到寄存器B中。
3. 執行指令
找到15這個地址上的數據,讀到B寄存器中。之后程序計數器++(1 -> 2)。
- 讀取指令
-
…
進程
進程就是正在執行的應用程序。
談的一個應用程序,有兩種狀態
- 沒有運行的時候,是一個 exe 文件,躺在硬盤上。
- 運行的時候,exe 就會被加載到內存中,并且cup執行里面的指令了
執行進程里的指令,需要硬件資源。
進程是操作系統進行資源分配的基本單位。
由于一個系統上進程比較多,所以需要管理
- 描述:通過 結構體/類,把進程中的各種屬性表示出來
- 組織 :通過數據結構,把多個上面的結構體串起來,并進一步的進行各種增刪查改。
對于Linux操作系統來說,它使用“PCB(進程控制塊)”這樣的結構體來描述進程信息的。
我們可以簡單認為,通過鏈表的方式,把上述多個PCB串到一起。
創建新的進程,就相當于創建了一個PCB結構體,并且插入到鏈表中;銷毀進程,就是把PCB從鏈表上刪除掉,并且釋放這個PCB結構體;查看進程列表,就是中遍歷這個鏈表,依次顯示出對應的信息。
注意:以上只是簡化版本,方便理解,實踐的情況要更復雜,不只是一個鏈表...
PCB
PCB有啥信息?
PCB是一個非常復雜的結構體,里面包含了非常多的屬性。我們在這里只討論一些關鍵的信息~
- PID 進程的標識符
同一時刻,一個機器上的多個進程之間PID是唯一的,不會重復,系統內部的很多操作,都是通過PID找到對應的進程的。
2. 內存指針(一組)
它描述進程依賴的指令和數據都在內存的哪個區域
操作系統運行exe就會讀取exe中的指令和數據,并把它們加載到內存中(內存地址)。
(側面表示出,進程的執行需要一定的內存資源)
3. 文件描述符表(順序表/數組)
它描述了進程打開了那些文件(對于到硬盤上的數據),進程中打開了某個文件,就會在順序表中添加一項。
(側面表示出,進程的執行需要一定的硬盤資源)
4. 進程狀態
5. 進程的優先級
6. 進程的上下文
7. 進程的記賬信息
4、5、6、7這幾個屬性共同決定了進程調度。我們把他們放在一塊分析。
計算機上同時存在百八十個進程,這么多進程都是要執行的。
CPU負責執行,CPU每個核心可以執行一個進程。我這臺電腦CPU是6核12線程(6個物理核心,12個邏輯核心),只能同時執行12個進程呀~其他進程咋辦呢?
這就不得不提到操作系統進程調度的關鍵——“分時復用”了
“分時復用”
這個時刻CPU運行進程1,運行一會,CPU運行進程2,過一會運行進程3…
由于CPU運算速度非常快,使上述的切換速度也非常快,肉眼察覺不到,站在宏觀角度(人),就好像是同時執行了,這叫做“并發執行”。
現在有有了多核心CPU,每個核心和核心之間,微觀上也能同時執行不同的進程,這叫做“并行執行”。
并發/并行,都是操作系統內核統一調度的,程序員/普通用戶感知不到~
因此,平時也把并行和并發統稱為“并發”,對于的編程的手法也就稱為“并發執行”。
-
進程狀態
可以隨時被調度到CPU上執行指令的,稱為“就緒狀態”。
因為要做一些其他的工作,比如進行IO操作(讀寫硬盤/讀寫網卡…),無法調度到CPU上執行,這稱為“阻塞狀態”。
其實進程還有其他的狀態,此處就不展開了~ -
進程優先級
進程優先級就是來解決誰先來,誰后來,誰多執行,誰少執行的問題的。 -
進程的上下文
分時復用,一個進程執行一會之后,就要從CPU上調度走,過一段時間,還會調度回CPU,此時就要沿著上次執行的結果,繼續往后執行~
進程的上下文對于進程來說就是寄存器中的值,CPU有很多寄存器,這些寄存器共同描述了上下文。
PCB是內存的數據,把寄存器中的值都保存到PCB特定屬性中,下次調度PCB就可以從這里的屬性中把數據恢復到對應的寄存器中了。 -
進程的記賬信息
在優先級的加持之下,就會使不同的進程吃到的資源差異越來越大。
操作系統會去統計每一個進程在CPU上執行的時間,系統就會根據這個來進一步的調整調度的策略。
這幾個屬性相互配合,共同構成了進程調度的核心邏輯~
上述的調度過程,都是系統內核負責完成的,雖然是在系統內核完成的,但是我們寫程序的時候還是會受到影響的,因此還是需要了解上述的調度過程的!
本文到這里就結束啦~
??結語
山外青山樓外樓,莫把百尺當盡頭。
保持空杯心態加油努力吧!
都看到這里啦!真棒(*^▽^*)
可以給作者一個免費的贊贊嗎,這將會鼓勵我繼續創作,謝謝大家
如有紕漏或錯誤,歡迎指正