進程的典型定義:進程是程序的一次動態執行html
進程在傳統OS中的定義: 進程是進程實體的運行過程,是系統進行資源分配和調度的獨立單位.數據結構
通常狀況下,咱們所說的進程實體(也叫進程映像)簡稱進程,進程實體包括程序段,數據段和進程控制塊(PCB).多線程
建立進程的實質就是建立PCB,撤銷進程實質也是撤銷PCB.併發
PCB做用:做爲獨立運行的基本標誌, 實現間斷性運行方式, 提供進程管理須要的信息,提供進程調度須要的信息, 與其餘進程通訊異步
PCB包含的信息模塊化
1.進程標識符:外部標識符,內部標識符函數
2.處理機狀態:通用寄存器, 指令計數器, 程序狀態字, 用戶棧指針this
3.進程調度信息:進程狀態, 進程優先級, 進程調度的其餘信息, 事件spa
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); }
一次性所有分配
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.堆棧指針