操作系统:第二章 进程管理1 - 进程、线程
本文已收錄至 Github(MD-Notes),若博客中圖片打不開,可以來我的 Github 倉庫,包含了完整圖文:https://github.com/HanquanHq/MD-Notes,涵蓋了互聯(lián)網(wǎng)大廠面試必問的知識點,講解透徹,長期更新中,歡迎一起學(xué)習(xí)探討 ~ 另外:
面試必會系列專欄:https://blog.csdn.net/sinat_42483341/category_10300357.html
操作系統(tǒng)系列專欄:https://blog.csdn.net/sinat_42483341/category_10519484.html
第二章 進程管理 - 進程、線程
目錄
- 第二章 進程管理 - 進程、線程
- 進程的概念
- 進程的創(chuàng)建
- PCB
- 程序是如何運行的?
- 進程的特征
- 進程的5種狀態(tài)
- 創(chuàng)建態(tài)
- 就緒態(tài)
- 運行態(tài)
- 阻塞態(tài)
- 終止態(tài)
- 進程狀態(tài)的轉(zhuǎn)換
- 進程的組織方式
- 進程控制
- 如何實現(xiàn)原語的原子性?
- 進程控制相關(guān)的原語
- 進程通信
- 1、共享存儲
- 2、管道通信
- 3、消息傳遞
- 線程
- 為什么引入線程?
- 線程的屬性
- 線程的實現(xiàn)方式
- 1、用戶級線程
- 2、內(nèi)核級線程
- 3、多線程模型
- 一對一模型
- 多對一模型
- 多對多模型
進程的概念
進程是進程實體的運行過程,是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位。(線程是調(diào)度的基本單位)
程序:是靜態(tài)的,是一個存放在磁盤里的可執(zhí)行文件,是一系列指令的集合
進程:是動態(tài)的,是程序的一次執(zhí)行過程
例如,同時掛三個QQ號,會對應(yīng)三個QQ進程,它們的PCB、數(shù)據(jù)段各不相同,但程序段的內(nèi)容都是相同的(都是運行著相同的QQ程序)
進程的創(chuàng)建
當(dāng)進程被創(chuàng)建時,操作系統(tǒng)會為該進程分配一個唯一的、不重復(fù)的“身份證號”—— PID(Process ID,進程ID)
PCB
進程相關(guān)的信息都被保存在一個數(shù)據(jù)結(jié)構(gòu)PCB (Process Control Block)中,即進程控制塊
操作系統(tǒng)需要對各個并發(fā)運行的進程進行管理,但凡管理時所需要的信息,都會被放在PCB中
程序是如何運行的?
一個進程實體(進程映像)由 PCB、程序段、數(shù)據(jù)段 組成。
進程是動態(tài)的,進程實體(進程映像,類似于快照的概念)是靜態(tài)的。
進程實體反應(yīng)了進程在某一時刻的狀態(tài)(如:x++后,x=2)
- PCB 是給操作系統(tǒng)用的
- 程序段、數(shù)據(jù)段是給進程自己用的。
進程的特征
進程的5種狀態(tài)
創(chuàng)建態(tài)
進程正在被創(chuàng)建時,它的狀態(tài)是“創(chuàng)建態(tài)”,在這個階段操作系統(tǒng)會為進程分配資源、初始化PCB
就緒態(tài)
當(dāng)進程創(chuàng)建完成后,進入“就緒態(tài)”,處于就緒態(tài)的進程已經(jīng)具備運行條件,但由于沒有空閑CPU,就暫時不能運行。當(dāng)CPU空閑時,操作系統(tǒng)就會選擇一個就緒進程,讓它上處理機運行
運行態(tài)
如果一個進程此時在CPU上運行,那么這個進程處于“運行態(tài)”,CPU會執(zhí)行該進程對應(yīng)的程序(執(zhí)行指令序列)
阻塞態(tài)
在進程運行的過程中,可能會請求等待某個事件的發(fā)生(如等待某種系統(tǒng)資源的分配,或者等待其他進程的響應(yīng))。在這個事件發(fā)生之前,進程無法繼續(xù)往下執(zhí)行,此時操作系統(tǒng)會讓這個進程下CPU,并讓它進入“阻塞態(tài)”,當(dāng)CPU空閑時,又會選擇另一個“就緒態(tài)”進程上CPU運行
終止態(tài)
一個進程可以執(zhí)行 exit 系統(tǒng)調(diào)用,請求操作系統(tǒng)終止該進程。此時該進程會進入“終止態(tài)”,操作系統(tǒng)會讓該進程下CPU,并回收內(nèi)存空間等資源,最后還要回收該進程的PCB。當(dāng)終止進程的工作完成之后,這個進程就徹底消失了。
進程狀態(tài)的轉(zhuǎn)換
進程PCB中,會有一個變量state 來表示進程的當(dāng)前狀態(tài)。如:1表示創(chuàng)建態(tài)、2表示就緒態(tài)、3表示運行態(tài)…
為了對同一個狀態(tài)下的各個進程進行統(tǒng)一的管理,操作系統(tǒng)會將各個進程的PCB組織起來。
進程的組織方式
大多數(shù)操作系統(tǒng)采用鏈接方式。
進程控制
進程控制的過程要一氣呵成,不可以被打斷,用原語來實現(xiàn)。
例如,“將PCB的state設(shè)為1” “將PCB從阻塞隊列放入就緒隊列” 這兩個步驟,不能被打斷
如何實現(xiàn)原語的原子性?
原語的執(zhí)行具有原子性,即執(zhí)行過程只能一氣呵成,期間不允許被中斷。
可以用“關(guān)中斷指令”和“開中斷指令”這兩個特權(quán)指令實現(xiàn)原子性。
正常情況下,CPU每執(zhí)行完一條指令,都會例行檢查是否有中斷信號需要處理,如果有,則暫停運行當(dāng)前這段程序,轉(zhuǎn)而執(zhí)行相應(yīng)的中斷處理程序。
而 CPU 執(zhí)行了關(guān)中斷指令之后,就不再例行檢查中斷信號,直到執(zhí)行開中斷指令之后才會恢復(fù)檢查。
這樣,關(guān)中斷、開中斷之間的這些指令序列就是不可被中斷的,這就實現(xiàn)了“原子性”
進程控制相關(guān)的原語
理解即可,不需要記憶
進程通信
顧名思義,進程通信就是指進程之間的信息交換。
進程是分配系統(tǒng)資源的單位(包括內(nèi)存地址空間),因此各進程擁有的內(nèi)存地址空間相互獨立。
為了保證安全,一個進程不能直接訪問另一個進程的地址空間。但是進程之間的信息交換又是必須實現(xiàn)的。為了保證進程間的安全通信,操作系統(tǒng)提供了一些方法。
1、共享存儲
-
基于數(shù)據(jù)結(jié)構(gòu)的共享:比如共享空間里只能放一個長度為10的數(shù)組。這種共享方式速度慢、限制多,是一種低級通信方式
-
基于存儲區(qū)的共享:在內(nèi)存中畫出一塊共享存儲區(qū),數(shù)據(jù)的形式、存放位置都由進程控制,而不是操作系統(tǒng)。相比之下,這種共享方式速度更快,是一種高級通信方式。
2、管道通信
“管道”是指用于連接讀寫進程的一個共享文件,又名pipe文件。其實就是在內(nèi)存中開辟一個大小固定的緩沖區(qū)。
兩個管道。
取走。當(dāng)讀進程將數(shù)據(jù)全部取走后,管道變空,此時讀進程的 read() 系統(tǒng)調(diào)用將被阻塞。
況。
3、消息傳遞
進程間的數(shù)據(jù)交換以格式化的消息(Message)為單位。進程通過操作系統(tǒng)提供的“發(fā)送消息/接收消息”兩個原語進行數(shù)據(jù)交換。
線程
為什么引入線程?
有的進程可能需要“同時”做很多事,而傳統(tǒng)的進程只能串行地執(zhí)行一系列程序。為此,引入了“線程”,來增加并發(fā)度。
可以把線程理解為“輕量級進程”。線程是一個基本的CPU執(zhí)行單元,也是程序執(zhí)行流的最小單位。引入線程之后,不僅是進程之間可以并發(fā),進程內(nèi)的各線程之間也可以并發(fā),從而進一步提升了系統(tǒng)的并發(fā)度,使得一個進程內(nèi)也可以并發(fā)處理各種任務(wù)(如QQ視頻、文字聊天、傳文件)
引入線程后,進程只作為除CPU之外的系統(tǒng)資源的分配單元(如打印機、內(nèi)存地址空間等都是分配給進程的)。線程則作為處理機的分配單元。
線程的屬性
線程的實現(xiàn)方式
1、用戶級線程
- 優(yōu)點:用戶級線程的切換在用戶空間即可完成,不需要切換到核心態(tài),線程管理的系統(tǒng)開銷小
- 缺點:當(dāng)一個用戶級線程被阻塞后,整個進程都會被阻塞,并發(fā)度不高。多個線程不可在多核處理機上并行運行。
2、內(nèi)核級線程
優(yōu)點:當(dāng)一個線程被阻塞后,別的線程還可以繼續(xù)執(zhí)行,并發(fā)能力強。多線程可在多核處理機上并行執(zhí)行。
缺點:一個用戶進程會占用多個內(nèi)核級線程,線程切換由操作系統(tǒng)內(nèi)核完成,需要切換到核心態(tài),因此線程管理的成本高,開銷大。
操作系統(tǒng)只“看得見”內(nèi)核級線程,因此只有內(nèi)核級線程才是處理機分配的單位。
3、多線程模型
一對一模型
一個用戶級線程映射到一個內(nèi)核級線程。每個用戶進程有與用戶級線程同數(shù)量的內(nèi)核級線程。
- 優(yōu)點:當(dāng)一個線程被阻塞后,別的線程還可以繼續(xù)執(zhí)行,并發(fā)能力強。多線程可在多核處理機上并行執(zhí)行。
- 缺點:一個用戶進程會占用多個內(nèi)核級線程,線程切換由操作系統(tǒng)內(nèi)核完成,需要切換到核心態(tài),因此線程管理的成本高,開銷大。
多對一模型
多個用戶級線程映射到一個內(nèi)核級線程。且一個進程只被分配一個內(nèi)核級線程。
- 優(yōu)點:用戶級線程的切換在用戶空間即可完成,不需要切換到核心態(tài),線程管理的系統(tǒng)開銷小,效率高
- 缺點:當(dāng)一個用戶級線程被阻塞后,整個進程都會被阻塞,并發(fā)度不高。多個線程不可在多核處理機上并行運行
多對多模型
n 個用戶級線程映射到m 個內(nèi)核級線程(n >= m)
- 優(yōu)點:克服了多對一模型并發(fā)度不高的缺點(一個阻塞全體阻塞),又克服了一對一模型中一個用
戶線程庫 進程占用太多內(nèi)核級線程,開銷太大的缺點。
總結(jié)
以上是生活随笔為你收集整理的操作系统:第二章 进程管理1 - 进程、线程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试必会系列 - 1.6 Java 垃圾
- 下一篇: 操作系统:第二章 进程管理2 - 处理机