11.1進程的概念
進程的定義
進程是指一個具有一定獨立功能的程序在一個數據集合上的一次動態執行過程
精髓:正在執行的程序。
? ? ? ? ? ?正在計算機上執行的程序實例。
? ? ? ? ? ?能分配給處理器并由處理器執行的實體。
? ? ? ? ? ?具有以下特征的活動單元:一組指令序列的執行、一個當前狀態和相關的系統資源集。
也可以把進程當成由一組元素組成的實體,進程的兩個基本的元素是程序代碼(可能被執行相同程序的其他進程共享)和代碼相關聯的數據集。假設處理器開始執行這個程序代碼,且我們把這個執行實體叫做進程。在進程執行時,任意給定一個時間,進程都可以唯一地被表征為以下元素:
標識符:跟這個進程相關的唯一標識符,用來區別其他進程。
狀態:如果進程正在執行,那么進程處于運行態。
優先級:相對于其他進程的優先級。
程序計數器:程序中即將被執行的下一條指令的地址。
內存指針:包括程序代碼和進程相關數據的指針,還有和其
他進程共享內存塊的指針。
上下文數據:進程執行時處理器的寄存器中的數據。
IO狀態信息:包括顯式的IO請求、分配給進程的IO設備
(例如磁帶驅動器)和被進程使用的文件列表等。
記賬信息:可能包括處理器時間總和、使用的時鐘數總和、時間限制、記賬號等。
進程的組成
進程包含了正在運行的一個程序的所有狀態信息
代碼數據狀態寄存器
CPU狀態CR0、指令指針IP
通用寄存器
AX、BX、CX…
進程占用系統資源
打開文件、已分配內存…
以上所有的構成一個進程控制塊
進程的特點
動態性
可動態地創建、結束進程
并發性
進程可以被獨立調度并占用處理機運行
制約性
因訪問共享數據/資源或進程間同步而產生制約
獨立性
不同進程的工作不相互影響
進程與程序的聯系
■進程是操作系統處于執行狀態程序的抽象
程序=文件(靜態的可執行文件)
進程=執行中的程序=程序+執行狀態
■同一個程序的多次執行過程對應為不同進程
內存:保存代碼和數據
CPU:執行指令
■進程執行需要的資源
如命令“ls”的多次執行對應多個進程
進程與程序的區別
■進程是動態的,程序是靜態的
程序是有序代碼的集合
進程是程序的執行,進程有核心態/用戶態
■進程是暫時的,程序的永久的
進程是一個狀態變化的過程
程序可長久保存
■進程與程序的組成不同
進程的組成包括程序、數據和進程控制塊
11.2進程控制塊(PCB,Process Control Block)
操作系統管理控制進程運行所用的信息集合
■操作系統用PCB來描述進程的基本情況以及運行變化的過程(例如ID,哪個程序,進程的狀態)
■PCB是進程存在的唯一標志
每個進程都在操作系統中有一個對應的PCB
進程控制塊的使用
■進程創建
生成該進程的PCB
■進程終止
回收它的PCB
■進程的組織管理
通過對PCB的組織管理來實現
對進程的所有操作都是通過進程控制塊來實現的
進程控制信息
■調度和狀態信息
調度進程和處理機使用情況
■進程間通信信息
進程間通信相關的各種標識
■存儲管理信息
指向進程映像存儲空間數據結構(占了那些內存,打開哪些文件,進程結束后操作系統要對其進行回收)
■進程所用資源
進程使用的系統資源,如打開文件等
■有關數據結構連接信息
與PCB相關的進程隊列
程序、數據、棧和屬性的集合稱為進程映像。
進程控制塊的組織
■鏈表
·同一狀態的進程其PCB成一鏈表,多個狀態對應多個不同的鏈表
各狀態的進程形成不同的鏈表:就緒鏈表、阻塞鏈表
■索引表
·同一狀態的進程歸入一個索引表(由索引指向PCB),多個狀態對應多個不同的索引表
各狀態的進行形成不同的索引表:就緒索引表、阻塞索引表
注:通過指針指向進程控制塊的指針放到索引表內,不同的狀態構成不同的索引表
11.3進程狀態
一個程序執行,啟動過程中就會導致一個新的進程的創建。創建完了之后它就會是程序進入執行的狀態,它會占用CPU來執行。在執行的過程當中由于等待某個資源或者等待某個數據而進入等待狀態,就導致進程進行等待。一個優先級低的進程正在執行,有一個高優先級的進程等待狀態結束,就是它等待的條件已經成熟了,要馬上開始投入運行,當前這個進程是會搶先,先進入就緒狀態這個進程叫搶先,而當前正在執行這個進程叫做被搶占。處于等待狀態的進程會碰到被喚醒的情況,外界條件滿足的時候它會被喚醒,喚醒之后又排到這個就緒隊列里頭,它等待占用CPU來繼續執行。那等最后回到CPU上執行,執行到最后的某種狀態,整個程序的工作全部執行完,那就有可能進到進程結束的狀態,那這時候到達結束。
進程創建
一個程序執行,啟動過程中就會導致一個新的進程的創建。
引起進程創建的情況
系統初始化時
用戶請求創建一個新進程
正在運行的進程執行了創建進程的系統調用
注:每一個進程有一個進程控制塊,這些相關的它要占用內存,把代碼和數據都拷進去,這些資源的準備過程,就對應到進程創建
進程執行
創建完了之后它就會是程序進入執行的狀態,它會占用CPU來執行。
內核選擇一個就緒的進程,讓它占用處理機并執行
■如何選擇?
根據處理機調度算法來選擇,不同的算法特征不一樣
進程等待
在執行的過程當中由于等待某個資源或者等待某個數據而進入等待狀態,就導致進程進行等待。
■進程進入等待(阻塞)的情況:
請求并等待系統服務,無法馬上完成
啟動某種操作,無法馬上完成(例如讀寫操作)
需要的數據沒有到達
■只有進程自身才能知道何時需要等待某種事件的發生(等待事件的進入一定是正在運行這個進程本身內部的原因所導致的,它不是由于外部原因所導致的)
進程搶占
一個優先級低的進程正在執行,有一個高優先級的進程等待狀態結束,就是它等待的條件已經成熟了,要馬上開始投入運行,當前這個進程是會搶先,先進入就緒狀態這個進程叫搶先,而當前正在執行這個進程叫做被搶占。
■進程會被搶占的情況
高優先級進程就緒
進程執行當前時間用完(操作系統分配的運行時間(時間片)用完了)
進程喚醒
處于等待狀態的進程會碰到被喚醒的情況,外界條件滿足的時候它會被喚醒,喚醒之后又排到這個就緒隊列里頭,它等待占用CPU來繼續執行。
■喚醒進程的情況:
被阻塞進程需要的資源可被滿足
被阻塞進程等待的事件到達
■進程只能被別的進程或操作系統喚醒
進程結束
那等最后回到CPU上執行,執行到最后的某種狀態,整個程序的工作全部執行完,那就有可能進到進程結束的狀態,那這時候到達結束
■進程結束的情況:
正常退出(自愿的)
錯誤退出(自愿的)
致命錯誤(強制性的)
被其他進程所殺(強制性的)
注:要把進程執行所占用的所有資源還給操作系統以便于它能把它分配給
新的進程使用
精髓:導致進程終止的原因
11.4三狀態進程模型
進程在整個生命周期分為三種基本狀態:就緒,運行,等待。
運行狀態(Running)
進程正在處理機上運行
注:一次只有一個進程在處理器上運行。
就緒狀態(Ready)
進程獲得了除處理機之外的所需資源,得到處理機即可運行。
當進程分配到CPU并執行時,可能發生以下幾種事件:
1進程可能發出一個I/O請求,并被放到I/O隊列中 .
2進程可能創建一個新的子進程,并等待其結束。
3進程可能會由于中斷而強制釋放CPU,并被放回到就緒隊列中。
等待狀態(又稱阻塞狀態Blocked )
進程正在等待某一事件的出現而暫停運行
創建狀態(New)
一個進程正在被創建,還沒被轉到就緒狀態之前的狀態
結束狀態(Exit)
一個進程正在從系統中消失時的狀態,這是因為進程結束或由于其他原因所導致
過程解讀
■NULL→創建
一個新進程被產生出來執行一個程序
■創建→就緒
當進程被創建完成并初始化后,一切就緒準備運行時,變為就緒狀態
■就緒→運行
處于就緒狀態的進程被進程調度程序選中后,就分配到處理機上來運行
■運行→結束
當進程表示它已經完成或者因出錯,當前運行進程會由操作系統作結束處理
■運行→就緒
處于運行狀態的進程在其運行過程中,由于分配給它的處理機時間片用完而讓出處理機
■運行→等待
當進程請求某資源且必須等待時
■等待→就緒
當進程要等待某事件到來時,它從阻塞狀態變到就緒狀態
11.5掛起進程模型
處在掛起狀態的進程映像在磁盤上,目的是減少進程占用內存
掛起狀態
■等待掛起狀態(Blocked-suspend)
進程在外存并等待某事件的出現
■就緒掛起狀態(Ready-suspend)
進程在外存,但只要進入內存,即可運行
注:進不到內存里的原因是內存的空間不夠或者說它的優先級不夠高
與掛起相關的狀態轉換
掛起(Suspend):把一個進程從內存轉到外存
■等待->等待掛起
沒有進程處于就緒狀態或就緒進程要求更多內存資源
■就緒->就緒掛起
當有高優先級等待(系統認為會很快就緒的)進程和低優先級就緒進程
■運行->就緒掛起
對搶先式分時系統,當有高優先級等待掛起進程因事件出現而進入就緒掛起
注:比如說有高優先級等待的進程因事件的出現而進入就緒,而這時候呢沒有足夠的內存空間,就會把當前正在運行的這個進程搶先并且把它變成掛起就緒的狀態
與掛起相關的狀態轉換
在外存時的狀態轉換
■等待掛起->就緒掛起
當有等待掛起進程因相關事件出現
激活(Activate):把一個進程從外存轉到內存
■就緒掛起->就緒
沒有就緒進程或掛起就緒進程優先級高于就緒進程
■等待掛起->等待
當一個進程釋放足夠內存,并有高優先級等待掛起進程
狀態隊列
■由操作系統來維護一組隊列,表示系統中所有進程的當前狀態
■不同隊列表示不同狀態
就緒隊列、各種等待隊列
■根據進程狀態不同,進程PCB加入相應隊列
進程狀態變化時,它所在的PCB會從一個隊列
換到另一個
精髓:掛起的一些總結
掛起態進程的特點:
1)進程不能立即執行。
2)進程可能是或不是正在等待一個事件。如果是,阻塞條件不依賴于掛起條件,阻塞事件 的發生不會使進程立即被執行。
3)為阻止進程執行,可以通過代理把這個進程置于掛起狀態,代理可以是進程自己,也可以是父進程或操作系統。
4)除非代理顯式地命令系統進行狀態轉換,否則進程無法從這個狀態中轉移。
導致掛起的原因
11.6線程的概念
為什么引入線程
每個進程內部它的指令執行是有一個叫指令指針的寄存器來描述當前這個進程執行到什么地方,但是在實際使用的時候,在一個進程內部希望它有更好的并發性,那這就是引入線程的原因。
多線程的解決思路
在進程內部增加一類實體,滿足以下特性:
(1)實體之間可以并發執行
(2)實體之間共享相同的地址空間
這種實體就是線程(Thread)
線程的概念
線程是進程的一部分,描述指令流執行狀態。它是進程中的指令執行流的最小單元,是CPU調度的基本單位。
■進程的資源分配角色:進程由一組相關資源構成,包括地址空間(代碼段、數據段)、打開的文件等各種資源
■線程的處理機調度角色:線程描述在進程資源環境中的指令流執行狀態
注:把相關的關于執行流的狀態的信息變成是線程控制塊,線程控制塊也從屬于進程控制塊,用指針指向它.此時就可以有多個指令指針,多個堆棧和多個CPU里的寄存器的現場保護,這個現場保護是和執行流相關的。
線程是CPU使用的基本單元,它由線程ID,程序計數器、寄存器集合和棧組成。它與屬于同一進程的其他線程共享代碼段、數據段和其他操作系統資源。
進程和線程的關系
線程= 進程 - 共享資源
線程的優點:
一個進程中可以同時存在多個線程
各個線程之間可以并發地執行
各個線程之間可以共享地址空間和文件等資源
線程的缺點:
一個線程崩潰,會導致其所屬進程的所有線程崩潰
不同操作系統對線程的支持
線程與進程的比較
■進程是資源分配單位,線程是CPU調度單位
■進程擁有一個完整的資源平臺,而線程只獨享指令流執行的必要資源,如寄存■器和棧(相互需要保存的信息就少了,執行就快了)
■線程具有就緒、等待和運行三種基本狀態和狀態間的轉換關系
■線程能減少并發執行的時間和空間開銷
線程的創建時間比進程短
線程的終止時間比進程短
同一進程內的線程切換時間比進程短
由于同一進程的各線程間共享內存和文件資源,可不通過內核進行直接通信
11.7用戶進程
線程的三種實現方式
■用戶線程:在用戶空間實現
POSIX Pthreads,Mach C-threads,Solaris threads
■內核線程:在內核中實現
Windows,Solaris,Linux
■輕量級進程:在內核中實現,支持用戶線程
Solaris ??????(LightWeight Process)
用戶線程
由一組用戶級的線程庫函數來完成線程的管理,包括線程的創建、終止、同步和調度等
注:線程控制塊是在用戶態的,由用戶應用程序自己來維護
用戶線程的特征
■不依賴于操作系統的內核
內核不了解用戶線程的存在
可用于不支持線程的多進程操作系統
■在用戶空間實現的線程機制
每個進程有私有的線程控制塊(TCB)列表
TCB由線程庫函數維護
■同一進程內的用戶線程切換速度快
無需用戶態/核心態切換
■允許每個進程擁有自已的線程調度算法
用戶線程的不足
■線程發起系統調用而阻塞時,則整個進程進入等待
■不支持基于線程的處理機搶占
除非當前運行線程主動放棄,它所在進程的其他線程無法搶占CPU
■只能按進程分配CPU時間
多個線程進程中,每個線程的時間片較少
11.8內核線程
由內核通過系統調用實現的線程機制,由內核完成線程的創建、終止和管理
內核線程的特征
■由內核維護PCB和TCB
■線程執行系統調用而被阻塞不影響其他線程
■線程的創建、終止和切換開銷相對較大
通過系統調用/內核函數,在內核實現
■以線程為單位進行CPU時間分配
多線程的進程可獲得更多CPU時間
精髓:
■主要缺點:在把控制從一個線程傳送到同一個進程內的另一個線程時,需要到內核的狀態切換。
輕權進程(LightWeight Process)
內核支持的用戶線程。一個進程可有一個或多個輕量級進程,每個輕權進程由一個單獨的內核線程來支持。(Solaris/Linux)
用戶線程與內核線程的對應關系
線程與進程關系組合的其他方案