前言
本文主要講的是操作系統(tǒng)的一些核心概念, 主要講解進(jìn)程管理和進(jìn)程調(diào)度的問(wèn)題, 當(dāng)然學(xué)習(xí)完本篇并不會(huì)讓你能從零打造一個(gè)操作系統(tǒng), 而只是讓讀者有了對(duì)操作系統(tǒng)核心概念的基本認(rèn)識(shí).
關(guān)注收藏, 開始學(xué)習(xí)吧??
1. 什么是操作系統(tǒng)
操作系統(tǒng)是一組做計(jì)算機(jī)資源管理的軟件的統(tǒng)稱, 其本質(zhì)上也是一個(gè)軟件, 目前常見(jiàn)的操作系統(tǒng)有: Windows系列, Unix系列, Linux系列, OSX系列, Android系列, iOS系列, 鴻蒙等等.
2. 操作系統(tǒng)的定位
操作系統(tǒng), 對(duì)下要管理好各種硬件設(shè)備, 對(duì)上要給各個(gè)軟件提供穩(wěn)定的運(yùn)行環(huán)境.
比如某個(gè)軟件程序, 想要操作某個(gè)硬件設(shè)備, 此時(shí)就需要通過(guò)操作系統(tǒng)來(lái)完成.
操作系統(tǒng)有兩個(gè)基本功能:
- 防止硬件被時(shí)空的應(yīng)用程序?yàn)E用.
- 向應(yīng)用程序提供簡(jiǎn)單一致的機(jī)制來(lái)控制復(fù)雜而又通常大相徑庭的低級(jí)硬件設(shè)備.
操作系統(tǒng)本身是一個(gè)很大的話題, 是一個(gè)十分復(fù)雜的軟件, 其功能是非常多的, 其中有一個(gè)對(duì)于我們來(lái)講十分重要的功能模塊, 那就是進(jìn)程管理.
3. 進(jìn)程管理
3.1 什么是進(jìn)程/任務(wù) (Process/Task)
每個(gè)應(yīng)用程序運(yùn)行于現(xiàn)代操作系統(tǒng)之上時(shí), 操作系統(tǒng)會(huì)提供一種抽象, 好像系統(tǒng)上只有這個(gè)程序在運(yùn)行, 所有的硬件資源都被這個(gè)程序在使用. 這種假象是通過(guò)抽象了一個(gè)進(jìn)程的概念來(lái)完成的, 進(jìn)程可以說(shuō)是計(jì)算機(jī)科學(xué)中最重要和最成功的概念之一.
進(jìn)程是操作系統(tǒng)對(duì)一個(gè)正在運(yùn)行的程序的一種抽象, 換言之, 可以把進(jìn)程看做程序的一次運(yùn)行過(guò)程. 同時(shí), 在操作系統(tǒng)內(nèi)部, 進(jìn)程又是操作系統(tǒng)進(jìn)行資源分配的基本單位.
簡(jiǎn)單來(lái)說(shuō), 一個(gè)運(yùn)行起來(lái)的程序, 就是進(jìn)程.
.exe
的是一種可執(zhí)行文件(程序), 當(dāng)雙擊這個(gè)文件, 程序就會(huì)跑起來(lái), 我們就會(huì)打開QQ, 從而就在操作系統(tǒng)中形成了一個(gè)進(jìn)程.
我們也可以打開任務(wù)管理器Ctrl + Alt + Delete
來(lái)查看系統(tǒng)中都在進(jìn)行哪些進(jìn)程.
可以看到, 系統(tǒng)中有這么多進(jìn)程都在同時(shí)運(yùn)行. 就是由于進(jìn)程多了, 所以操作系統(tǒng)才需要去管理進(jìn)程, 否則這么多進(jìn)程, 會(huì)導(dǎo)致操作系統(tǒng)卡死的.
3.2 進(jìn)程管理怎么做的
所謂的管理, 其實(shí)就是分兩步:
- 描述一個(gè)進(jìn)程: 使用結(jié)構(gòu)體或者對(duì)象, 把一個(gè)進(jìn)程有哪些信息都表示出來(lái).
- 組織這些進(jìn)程: 使用一定的數(shù)據(jù)結(jié)構(gòu), 把這些結(jié)構(gòu)體或?qū)ο蠖挤诺揭黄?
在Java中就是對(duì)象的概念, 在C++中就是結(jié)構(gòu)體的概念
3.3 進(jìn)程控制塊抽象PCB (Process Control Block)
計(jì)算機(jī)內(nèi)部要管理任何現(xiàn)實(shí)事物, 需要將其抽象成一組有關(guān)聯(lián)的, 互為一體的數(shù)據(jù). 在 Java 語(yǔ)言中, 我們可以通過(guò)類/對(duì)象來(lái)描述這一特征. 而在操作系統(tǒng)中是用PCB來(lái)描述的.注: 操作系統(tǒng)往往使用 雙向鏈表 這樣的數(shù)據(jù)結(jié)構(gòu)來(lái)組織 PCB.
// 以下代碼是 Java 代碼的偽碼形式,重在說(shuō)明,無(wú)法直接運(yùn)行
class PCB {
// 進(jìn)程的唯一標(biāo)識(shí) —— pid
// 內(nèi)存指針
// 文件描述符表
// 進(jìn)度調(diào)度屬性
}
PCB的核心屬性:
-
pid
每個(gè)進(jìn)程需要有一個(gè)唯一的標(biāo)識(shí)符, 有點(diǎn)類似于數(shù)據(jù)庫(kù)中的主鍵. -
內(nèi)存指針
描述當(dāng)前這個(gè)進(jìn)程使用的是哪一部分內(nèi)存.
進(jìn)程要跑起來(lái), 就需要消耗一定的硬件資源, 比如內(nèi)存. 而內(nèi)存指針就是用來(lái)描述進(jìn)程運(yùn)行的時(shí)候, 使用了哪些內(nèi)存上的資源. -
文件描述符表
硬盤上存儲(chǔ)的數(shù)據(jù), 往往是以文件為單位來(lái)進(jìn)行整理的.
進(jìn)程每打開一個(gè)文件, 就會(huì)產(chǎn)生一個(gè) “文件描述符” (用來(lái)標(biāo)識(shí)這個(gè)被打開文件), 一個(gè)進(jìn)程可能打開很多文件, 對(duì)應(yīng)了一組文件描述符. 把這些文件描述符放到一個(gè)順序表這樣的結(jié)構(gòu)里, 就構(gòu)成了文件描述符表. -
進(jìn)程調(diào)度屬性
在講進(jìn)程調(diào)度屬性前, 我們先引入一個(gè) CPU 的概念, 計(jì)算機(jī)中的程序能運(yùn)行, 全得依靠 CPU, 每個(gè)程序相當(dāng)于一組 “二進(jìn)制指令” 的集合, 在CPU 中有一個(gè)概念, 核心數(shù).
這個(gè)截圖是我計(jì)算機(jī)的核心數(shù), 8核16線程表示, CPU 中有8個(gè)核心, 但是每個(gè)核心一個(gè)頂兩, 8個(gè)人就可以干16個(gè)人的活, 即8個(gè)物理核心, 16個(gè)邏輯核心.
而我們計(jì)算機(jī)中通常會(huì)有很多進(jìn)程需要同時(shí)處理.
那么計(jì)算機(jī)是如何用少數(shù)人來(lái)完成多數(shù)人的工作的呢? 下面我再介紹一下并行和并發(fā)的概念.
并行: 同一時(shí)刻, 兩個(gè)核心, 同時(shí)執(zhí)行兩個(gè)進(jìn)程, 此時(shí)這兩進(jìn)程就是并行執(zhí)行的.
并發(fā): 一個(gè)核心, 先執(zhí)行進(jìn)程1, 執(zhí)行一會(huì)兒后, 再去執(zhí)行進(jìn)程2, 再執(zhí)行一會(huì)兒后, 又去執(zhí)行進(jìn)程3… 此時(shí)只要這里的切換速度足夠的快, 進(jìn)程123看起來(lái)就像是 “同時(shí)” 執(zhí)行的一樣.
此時(shí), 雖然我的計(jì)算機(jī)只有16個(gè)核心, 也可以同時(shí)執(zhí)行這137個(gè)進(jìn)程了, 就是通過(guò) 并行 和 并發(fā) 的方式來(lái)完成的.
接下來(lái)這一組屬性, 都是用來(lái)描述和 CPU 資源相關(guān)的屬性, 這些屬性來(lái)輔助進(jìn)行進(jìn)程調(diào)度.
3.3.1 進(jìn)程調(diào)度屬性
-
進(jìn)程的狀態(tài)
簡(jiǎn)單認(rèn)為, 進(jìn)程主要有兩種狀態(tài):- 就緒態(tài): 表示該進(jìn)程已經(jīng)準(zhǔn)備好, 隨時(shí)可以上 CPU 執(zhí)行.
- 阻塞態(tài): 表示該進(jìn)程還未準(zhǔn)備好, 暫時(shí)無(wú)法上 CPU 執(zhí)行.
-
進(jìn)程的優(yōu)先級(jí)
進(jìn)程之間的調(diào)度不是完全公平的, 有的進(jìn)程要優(yōu)先調(diào)度. -
進(jìn)程的上下文
上下文, 就是描述當(dāng)前進(jìn)程執(zhí)行到哪里, 當(dāng)進(jìn)程離開 CPU 時(shí), 就要把當(dāng)前運(yùn)行的中間結(jié)果 “存檔記錄”, 等到下次進(jìn)程回來(lái) CPU 上的時(shí)候, 再恢復(fù)之前的 “存檔”, 也就是進(jìn)行 “讀檔”, 從上次的結(jié)果繼續(xù)往后執(zhí)行.
如果進(jìn)程結(jié)束了, 就不必進(jìn)行存檔, 如果是暫時(shí)離開, 就得存.
而讀檔存檔在進(jìn)程中, 是靠 CPU 內(nèi)部的一系列寄存器來(lái)實(shí)現(xiàn)的. 寄存器有很多種, 其中最典型的作用, 就是保存當(dāng)前進(jìn)程執(zhí)行的中間結(jié)果, 包括進(jìn)程運(yùn)行到哪一條指令.- 存檔: 進(jìn)程離開 CPU, 就需要把這些寄存器的值, 保存到 PCB 的上下文字段中.
- 讀檔: 進(jìn)程回來(lái) CPU, 再把 PCB 中的值給恢復(fù)到寄存器中.
-
進(jìn)程的記賬信息
用來(lái)統(tǒng)計(jì)每個(gè)進(jìn)程, 在 CPU 上執(zhí)行了多久, 可以作為進(jìn)程調(diào)度的參考依據(jù).
4. 內(nèi)存分配 ---- 內(nèi)存管理 (Memory Manage)
我們?cè)倭私庖幌聝?nèi)存管理的概念: 操作系統(tǒng)對(duì)內(nèi)存資源的分配, 采用的是空間模式 ---- 不同進(jìn)程使用內(nèi)存的不同區(qū)域, 互相之間不會(huì)干擾.
簡(jiǎn)單來(lái)說(shuō), 就是操作系統(tǒng)給進(jìn)程分配的內(nèi)存, 是以 “虛擬地址空間” 的方式來(lái)進(jìn)行分配的, 每個(gè)進(jìn)程訪問(wèn)的內(nèi)存地址, 都不是真實(shí)的物理內(nèi)存地址.
站在左邊這兩進(jìn)程的角度看, 他們代碼中操作的內(nèi)存地址, 都是 0x00 - 0xff 這一段, 但是這里訪問(wèn)的內(nèi)存就會(huì)被操作系統(tǒng)自動(dòng)映射到真實(shí)的物理內(nèi)存上, 但是進(jìn)程本身感知不到實(shí)際的物理地址是啥.
5. 進(jìn)程間通信 (Inter Process Communication)
如上所述, 進(jìn)程是操作系統(tǒng)進(jìn)行資源分配的最小單位, 這意味著各個(gè)進(jìn)程互相之間是無(wú)法感受到對(duì)方存在的, 這就是操作系統(tǒng)抽象出進(jìn)程這一概念的初衷, 這樣便帶來(lái)了進(jìn)程之間互相具備 “隔離性(Isolation)”.
但現(xiàn)代的應(yīng)用, 要完成一個(gè)復(fù)雜的業(yè)務(wù)需求, 往往無(wú)法通過(guò)一個(gè)進(jìn)程獨(dú)立完成, 總是需要進(jìn)程和進(jìn)程進(jìn)行配合地達(dá)到應(yīng)用的目的, 如此, 進(jìn)程之間就需要有進(jìn)行“信息交換“的需求. 而進(jìn)程間通信的需求就應(yīng)運(yùn)而生.
目前, 主流操作系統(tǒng)提供的進(jìn)程通信機(jī)制有如下:
- 管道
- 共享內(nèi)存
- 文件
- 網(wǎng)絡(luò)
- 信號(hào)量
- 信號(hào)
其中, 網(wǎng)絡(luò)是一種相對(duì)特殊的 IPC 機(jī)制, 它除了支持同主機(jī)兩個(gè)進(jìn)程間通信, 還支持同一網(wǎng)絡(luò)內(nèi)部非同一主機(jī)上的進(jìn)程間進(jìn)行通信.
簡(jiǎn)單來(lái)說(shuō), 所謂進(jìn)程間通信, 就是在隔離性的前提下, 找一個(gè)公共的區(qū)域, 讓兩個(gè)進(jìn)程借助這個(gè)區(qū)域來(lái)完成數(shù)據(jù)交換.
總結(jié)
? 感謝你們的耐心閱讀, 博主本人也是一名學(xué)生, 也還有需要很多學(xué)習(xí)的東西. 寫這篇文章是以本人所學(xué)內(nèi)容為基礎(chǔ), 日后也會(huì)不斷更新自己的學(xué)習(xí)記錄, 我們一起努力進(jìn)步, 變得優(yōu)秀, 小小菜鳥, 也能有大大夢(mèng)想, 關(guān)注我, 一起學(xué)習(xí)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-519423.html
感謝你們的閱讀, 你們的鼓勵(lì)是我創(chuàng)作的最大動(dòng)力!!!!!
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-519423.html
到了這里,關(guān)于【操作系統(tǒng)核心概念】進(jìn)程管理和進(jìn)程調(diào)度的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!