【操作系統】之進程管理
定義
進程的典型定義:進程是程序的一次動態執行
進程在傳統OS中的定義: 進程是進程實體的運行過程,是系統進行資源分配和調度的獨立單位.
一般情況下,我們所說的進程實體(也叫進程映像)簡稱進程,進程實體包括程序段,數據段和進程控制塊(PCB).
PCB
創建進程的實質就是創建PCB,撤銷進程實質也是撤銷PCB.
PCB作用:作為獨立運行的基本標誌, 實現間斷性運行方式, 提供進程管理需要的信息,提供進程調度需要的信息, 與其他進程通信
PCB包含的信息
1.進程標識符:外部標識符,內部標識符
2.處理機狀態:通用寄存器, 指令計數器, 程序狀態字, 用戶棧指針
3.進程調度信息
:進程狀態, 進程優先級, 進程調度的其他信息, 事件4.進程控制信息:程序和數據地址, 進程同步和通信機制, 資源清單,鏈接指針
進程控制塊的組織方式:線性方式, 鏈接方式, 索引方式
線性方式:所有的PCB都組織在一張線性表中
鏈接方式:具有相同狀態的PCB通過PCB中的鏈接字鏈接成一個隊列.
索引方式:系統根據進程狀態建立幾張索引表.
進程的特征
動態性:有創建而產生,由調度而執行,由撤銷而消亡.程序只是一組有序指令的集合
並發性:多個進程實體在內存中,且在一段時間內同時運行.程序沒有建立PCB所以不能並發執行,只能順序執行
獨立性:進程是一個能獨立運行
,獨立獲得資源和獨立就收調度的進本單位.異步性:進程按各自獨立的, 不可預知的速度運行.
進程的狀態與轉換
三個基本狀態:
就緒狀態:只要獲得cpu就可以立即執行
執行狀態:已獲得cpu正在執行
阻塞狀態:因發生某些事件(I/O請求等)放棄cpu而暫停執行.
引入掛起
原因:終端用戶的需要, 父進程請求, 負荷調節, 操作系統的需要
狀態轉換:
進程控制
引起創建進程的事件:用戶登錄, 作業調度, 提供服務, 應用請求
創建進程
1.申請空白PCB
2.為新進程分配所需資源
3.初始化進程控制塊PCB
4.新進程插入就緒隊列
引起進程終止的事件:正常結束, 異常結束(越界錯, 保護錯, 非法指令, 運行超時等), 外界幹預
終止進程
1.找到該進程的PCB
2.終止進程及其子孫進程
3.回收該進程所占資源
4.移出進程所在隊列
引起進程阻塞和喚醒的事件:向系統請求共享資源失敗, 等待某種操作的完成, 新數據尚未到達, 等待新任務的到達.
阻塞進程
1.停止執行進程(失去cpu)
2.改變進程狀態
3.插入阻塞隊列
喚醒進程:
1.移除阻塞隊列
2.檢查並改變進程狀態
3.插入就緒隊列
掛起進程:
1.改變進程轉態
2.賦值進程PCB到指定內存
3.若掛起進程正在執行則重新調度
激活進程:
1.將進程從外存調入內存
2.檢查並改變進程狀態
進程同步
並發進程在執行次序上的協調,以達到有效的資源共享和相互合作,使程序執行有可再現性
進程間可能存在的制約關系:間接制約(並發進程互斥的訪問臨界資源), 直接制約(進程需相互合作執行)
臨界資源:一次只允許一個進程訪問
臨界區:進程中訪問臨界資源的代碼稱為臨界區
進入區:檢查臨界資源是否正被訪問的代碼
退出去:檢查臨界資源是否訪問完畢的代碼
實現臨界區互斥的基本方法
軟件方法:信號量,管程(遵循原則:空閑讓進, 忙則等待, 有限等待, 讓權等待)
硬件方法:關閉中斷,硬件指令(TS, Swap)
信號量機制
整型信號量
wait(S){ while(S<=0); S--; } signal(S){ S++; }
記錄型信號量
typedef struct{ int value; struct process_control_block *list; }semaphore; wait(semaphore *S){ S->value--; if(S->value<0)block(S->list); } signal(semapohre *S){ S->value++; if(S->value<=0)wakeup(S->list); }
AND型信號量
一次性全部分配
Swait(S1, S2, …, Sn) if Si≥1 and … and Sn≥1 then for i∶ =1 to n do Si∶=Si-1; endfor else place the process in the waiting queue associated with the first Si found with Si<1, and set the program count of this process to the beginning of Swait operation endif Ssignal(S1, S2, …, Sn) for i∶ = 1 to n do Si=Si+1; Remove all the process waiting in the queue associated with Si into the ready queue. endfor;
信號量集
(S:信號量, d:需求值, t:下限值, t>=d)
Swait(S1, t1, d1, …, Sn, tn, dn) if Si≥t1 and … and Sn≥tn then for i∶=1 to n do Si∶=Si-di; endfor else Place the executing process in the waiting queue of the first Si with Si<ti and set its program counter to the beginning of the Swait Operation. endif
signal(S1, d1, …, Sn, dn) for i∶=1 to n do Si ∶=Si+di; Remove all the process waiting in the queue associated with Si into the ready queue endfor;
經典的進程同步問題
由進程同步而引起的一些經典的進程同步問題(生產者消費者問題, 哲學家進餐問題, 讀寫問題)可以在我的另一篇文章中查看.
管程
管程 (英語:Monitors,也稱為監視器) 是一種程序結構,結構內的多個子程序(對象或模塊)形成的多個工作線程互斥訪問共享資源。這些共享資源一般是硬件設備或一群變量.
代表共享資源的數據結構以及由對該共享數據結構實施操作的一組過程所組成的資源管理程序共同構成了一個操作系統的資源管理模塊,我們稱之為管程.
由定義, 管程由四部分組成:
1.管程的名稱;
2.局部於管程內部的共享數據結構說明;
3.對該數據結構進行操作的一組過程;
4.對局部於管程內部的共享數據設置初始值的語句
(維基百科)一個管程包含:
多個彼此可以交互並共用資源的線程
多個與資源使用有關的變量
一個互斥鎖
一個用來避免競態條件的不變量
管程特性:
1.模塊化, 管程是一個基本程序單位,可以單獨編譯
2.抽象數據類型, 管程中不僅有數據, 還有對數據的操作
3.信息掩蔽, 管程中的數據結構只能被管程的過程訪問, 這些過程也是在管程內部定義的, 共管程外的進程調用, 而管程中的數據結構及過程(函數)的具體實現外部不可見.
管程與進程的對比:
1.管程定義的是公共數據結構, 進程定義的是私有數據結構PCB
2.管程對數據結構進行同步和初始化, 進程則對數據結構進行順序程序執行
3.管程用於解決共享資源互斥, 進程用於實現系統的並發性
4.管程是被動工作, 進程是主動工作
條件變量
管程的條件變量:條件變量是在管程內部的數據結構,且只有在管程內才能被訪問,它對管程內所有過程是全局的,只能通過x.wait(),x.signal()兩個操作訪問.
x.wait():正在調用的管程因x條件需要被阻塞或掛起, 則調用x.wait()將自己插入到x條件的等待隊列上, 並釋放管程, 知道x條件變化.
xsignal():正在調用管程的進程發現x發生了變化, 則調用x.siganl(), 重新啟動一個因x條件而阻塞或掛起的進程, 如果存在多個這樣的進程, 則選擇其中的一個, 如果沒有則繼續執行原進程, 而不產生任何結果.
線程-調度和分派的基本單位
由來:
自古以來熊和魚掌不可兼得, 同樣對於進程來講, 作為調度和分派的基本單位同時又擁有資源這會加重系統開銷. 那麽能否將它們分開呢? 對於擁有資源的單位, 並不頻繁的進行上下文切換, 於是線程便誕生了.進程作為擁有資源的單位, 線程作為獨立調度和分派的單位. 一個進程可擁有多個線程. 在多線程中, 可將每個線程稱為一個任務. 宏觀上, 進程也是任務.
線程, 有時被稱為輕量級進程(Lightweight Process, LWP), 是程序執行流的最小單元.相對的, 傳統的進程叫做重型進程.
線程與進程的比較
調度的基本單位:傳統OS中, 進程是獨立調度和分派的基本單位, 占有資源獨立運行, 但是在引入線程的OS中, 線程是調度的基本單位, 可以獨立運行的, 此時進程已不是可以獨立運行的實體.
並發性:一個進程中擁有多個線程, 稱為多線程. 這多個線程可以並發運行.不同進程間的線程也可並發運行.
擁有資源:進程是系統中擁有資源的基本單位, 而線程只有一點必不可少的, 能保證獨立運行的資源, 這大大減少了系統的開銷.
獨立性:每個進程擁有一個獨立的地址空間和資源, 除了共享全局變量以外不允許其他進程訪問.同一進程中的線程除了只擁有自身必須的少量資源, 它們共享進程的內存地址空間和資源
系統開銷:進程因為擁有資源, 每次調度進程時必定要對其分配回收, 系統開銷大.線程只占有極少的資源, 其系統開銷遠低於進程.
線程的三個基本轉態
就緒狀態: 只要活得cpu就可執行
執行狀態: 活得cpu正在執行
阻塞狀體: 線程因某種原因受阻而暫停執行
線程控制塊TCB
系統為每個進程配置了一個進程控制塊PCB用於管理進程.同樣, 也有一個線程控制塊TCP用戶控制和管理線程.它包括:
1.線程標識符: 線程ID
2.寄存器:程序計數器, 狀態寄存器, 通用寄存器
3.線程運行狀態
4.優先級: 線程的優先級
5.線程專有存儲區
6.信號屏蔽
7.堆棧指針
【操作系統】之進程管理