1、進程的基本概念算法
1 程序的順序執行與併發執行編程
(1)前驅圖數據結構
概念:前驅圖是一個有向無循環圖,記爲DAG,可用於描述進程之間執行的先後關係。無循環關係可實現順序執行。多線程
結點:一個程序段、進程或一條語句;
有向邊:兩個結點之間的前趨關係;
重量:結點所含有的程序量或執行時間;
直接前驅、直接後繼、開始結點、終止結點併發
以上前趨圖,存在的前趨關係:P1→P2,P1→P3,P1→P4,P2→P5,P3→P5,P4→P6,P4→P7,P5→P8,P6→P8,P7→P9,P8→P9;
或表示爲:P={P1,P2,P3,P4,P5,P6,P7,P8,P9} →={(P1,P2),(P1,P3),(P1,P4),(P2,P5),(P3,P5),(P4,P6),(P4,P7),(P5,P8),(P6,P8),(P7,P9),(P8,P9)} 異步
注意:前趨圖中必須不存在循環。以下圖不是前趨圖:函數
(2)程序的順序執行佈局
程序的順序執行如圖:性能
在計算機系統中只有一個程序在運行,這個程序獨佔系統中全部資源,其執行不受外界影響。一道程序執行完後另外一道才能開始。優化
特徵:順序性:一個程序開始執行必需要等到前一個程序已執行完成。
封閉性:程序運行時獨佔計算機資源,資源的狀態只能由本程序修改。程序一旦開始執行,其計算結果不受外界因素影響。
可再現性:程序的結果與它的執行速度無關(即與時間無關),只要給定相同的輸入,必定會獲得相同的結果。
程序順序執行處理器利用率舉例:
(3)程序的併發執行
概念:所謂程序的併發執行是指:若干個程序同時在系統中執行,這些程序的執行在時間上是重疊的,一個程序的執行還沒有結束,另外一個程序的執行已經開始。
特徵:間斷性
失去程序的封閉性:程序在併發執行時,是多個程序共享系統中的資源,所以這些資源的狀態將由多個程序來改變。
不可再現性
2 進程的定義
定義:進程是可併發執行的程序在一個數據集合上的運行過程。進程是指進程實體的運行過程。
性質:進程是一個程序與其數據一道經過處理機的執行所發生的活動。進程是指進程實體的運行過程,是系統進行資源分配和調度的獨立單位
進程同程序的比較:程序是指令的有序集合,其自己沒有任何運行的含義,是一個靜態的概念。而進程是程序在處理機上的一次執行過程,它是一個動態的概念。
程序是靜態的,進程是動態的;
程序能夠做爲一種軟件資料長期存在,而進程是有必定生命期的。程序是永久的,進程是暫時的;
進程更能真實地描述併發,而程序不能;
進程是由程序和數據、進程控制塊PCB三部分組成的;
進程具備建立其餘進程的功能,而程序沒有;
同一程序同時運行於若干個數據集合上,它將屬於若干個不一樣的進程。也就是說同一程序能夠對應多個進程 ;
3 進程的特徵
結構性:由程序(段)、數據(段)、進程控制塊(PCB)三部分組成;
動態性:進程是程序的執行過程;
併發性:多個進程可同存於內存中,能在一段時間內同時運行;
獨立性:獨立運行的基本單位,獨立得到資源和調度的基本單位;
異步性:各進程按各自獨立的不可預知的速度向前推動。
4 進程的狀態及轉換
概念:不一樣系統設置的進程狀態數目不一樣,進程有三種基本狀態,進程在生命消亡前處於且僅處於三種基本狀態之一。
進程的三種基本狀態:
就緒狀態(Ready):存在於處理機調度隊列中的全部進程,它們已經準備就緒,一旦獲得CPU,就當即能夠運行。這些進程所處的狀態爲就緒狀態。
就緒隊列:處於就緒狀態的進程按必定的策略排隊,同一時刻可有多個就緒隊列。
運行狀態(Running):正在運行的進程所處的狀態爲運行狀態。單處理機系統只有一個進程處於該狀態,多處理機系統有多個進程處於運行狀態
等待/阻塞/睡眠/封鎖狀態(Wait/Blocked):若一進程正在等待某一事件發生(如等待輸入輸出工做完成),
這時,即便給它CPU,它也沒法運行,稱該進程處於等待狀態(阻塞、 睡眠、封鎖狀態)。
阻塞隊列:根據阻塞緣由能夠設置多個隊列。
進程的狀態變遷圖:
若是系統中有N個進程,運行的進程最多1個,最少1個;就緒進程最多N-1個最少1個;等待進程最多N-2個,最少0個;
進程的五狀態模型
新建態:對應進程剛被建立的狀態。爲一個新進程建立必要的管理信息,它並無被提交執行,而是在等待操做系統完成建立進程的必要操做。
終止態:等待操做系統進行善後,而後,退出主存。
進入終止態的進程再也不執行,但依然臨時保留在系統中等待善後。一旦其餘進程完成了對終止態進程的信息抽取以後,系統將刪除該進程。
進程狀態轉換的具體緣由:NULL→新建態:建立一個子進程。
新建態→就緒態:系統完成了進程建立操做,且當前系統的性能和內存的容量均容許。
運行態→終止態:一個進程到達天然結束點,或出現了沒法克服的錯誤,或被操做系統所終結,或被其餘有終止權的進程所終結。
終止態→NULL:完成善後操做。
就緒態→終止態:某些操做系統容許父進程終結子進程。
等待態→終止態:某些操做系統容許父進程終結子進程。
進程的七狀態模型
掛起就緒態(ready suspend):進程具有運行條件但目前在二級存儲器中,當它被對換到主存才能被調度執行。
掛起等待態(blocked suspend):進程正在等待某一個事件且在二級存儲器中。
引入掛起狀態的緣由:終端用戶的請求:掛起某些可疑進程。
父進程請求:父進程需掛起某子進程。
負荷調節的須要:實時系統中掛起某些不重要的進程。
操做系統的須要:OS掛起某些進程,以便檢查資源的使用狀況等。
具備掛起狀態的狀態轉換:等待態→掛起等待態:當前不存在就緒進程,至少一個等待態進程將被對換出去成爲掛起等待態;
掛起等待態→掛起就緒態:引發進程等待的事件發生以後,相應的掛起等待態進程將轉換爲掛起就緒態。
掛起就緒態→就緒態:內存中沒有就緒態進程,或掛起就緒態進程具備比就緒態進程更高的優先級,將把掛起就緒態進程轉換成就緒態。
就緒態→掛起就緒態:系統根據當前資源情況和性能要求,決定把就緒態進程對換出去成爲掛起就緒態。
掛起進程具備以下特徵:該進程不能當即被執行。
掛起進程可能會等待事件,但所等待事件是獨立於掛起條件的,事件結束並不能致使進程具有執行條件。
進程進入掛起狀態是因爲操做系統、父進程或進程自己阻止它的運行。
結束進程掛起狀態的命令只能經過操做系統或父進程發出。
5 進程控制塊(PCB)
概念:爲了描述一個進程和其它進程以及系統資源的關係,爲了刻畫一個進程在各個不一樣時期所處的狀態,採用了一個與進程相聯繫的數據結構,稱爲進程控制塊。
PCB是OS中最重要的記錄型數據結構。
功能:將一個不能獨立運行的程序變成一個能夠獨立運行的基本單位,一個能與其餘進程併發執行的進程。
特徵:OS利用PCB來對併發執行的進程進行控制和管理,PCB是OS感知進程存在的惟一標誌。
進程與PCB是一一對應的。
PCB隨進程建立而創建,隨進程結束而回收。
PCB應常駐內存。
內容:
進程描述信息:進程標識符(process ID):惟一,一般是一個整數
進程名:一般基於可執行文件名(不惟一)
用戶標識符(user ID):進程組關係
進程控制信息:當前狀態
優先級(priority)
代碼執行入口地址
程序的外存地址
運行統計信息(執行時間、頁面調度)
進程間同步和通訊;阻塞緣由
進程的隊列指針
進程的消息隊列指針
所擁有的資源和使用狀況:虛擬地址空間的現狀、打開文件列表
CPU現場保護信息:寄存器值(通用、程序計數器PC、狀態字PSW,地址包括棧指針)、指向賦予該進程的段/頁表的指針
PCB表組織方式:系統把全部PCB組織在一塊兒,並把它們放在內存的固定區域,就構成了PCB表。
PCB表的大小決定了系統中最多可同時存在的進程個數,稱爲系統的併發度。
連接結構:相同狀態的進程PCB組成一個鏈表,不一樣狀態對應多個不一樣的鏈表。就緒鏈表、阻塞鏈表
索引結構:對具備相同狀態的進程,分別設置各自的PCB索引表,代表PCB在PCB表中的地址。
2、進程控制
1.概念:進程控制指對系統中的全部進程實施管理。
如:建立一個新進程;
終止一個已完成的進程;
終止一個因某事件而使其沒法運行下去的進程;
進程運行中狀態的轉換
…
進程控制通常由OS的內核來實現。
2.OS的內核的功能:不一樣OS的內核包括功能不一樣,但都包括:支撐功能
中斷處理:內核最基本的功能。如:系統調用 進程調度等
時鐘管理:
原語操做:實現進程通訊和控制。
資源管理功能:進程管理、存儲器管理、設備管理
3.原語
概念:由多條指令組成,是一種特殊的系統功能調用,它能夠完成一個特定的功能。
特色:執行時不可中斷
不可併發
在管態下執行,常駐內存
經常使用的進程控制原語:建立原語 Create
終止原語 Destroy
阻塞原語Block、喚醒原語Wakeup
掛起原語Suspend、激活原語Active
4.進程的建立流程:申請空白PCB
爲新進程分配資源 如內存
初始化PCB
將新進程插入就緒隊列
5.進程的終止流程:根據被終止進程的標識符,從PCB集合中檢索出該進程的PCB;
若被終止進程處於執行狀態,應當即終止執行,並置調度標誌爲真,調度其餘進程;
結束該進程全部子孫進程的執行,以防止成爲不可控進程;
將進程所擁有的資源交給父進程或系統進程;
釋放PCB 。
6.進程終止的事件:正常結束
異常結束:越界錯誤、保護錯、特權指令錯、非法指令錯、I/0故障、運行超時、等待超時、算術運算錯等
外界干預: 操做員或OS干預;父進程請求;父進程終止,子孫進程被終止。
7.進程的阻塞與喚醒:
阻塞:當一個進程所期待的某一事件還沒有出現時,該進程調用阻塞原語將本身阻塞。進程阻塞是進程自身的一種主動行爲。
喚醒:處於阻塞狀態的進程是毫不可能叫醒它本身的,必須由它的合做進程用喚醒原語喚醒它。
進程阻塞或喚醒的緣由:請求系統服務:如請求打印機
啓動某種操做:如I/O操做
新數據還未到達:合做進程之間須要數據傳遞
無新工做可作:如發送進程發送完數據後
8.進程的掛起與激活:
掛起:當出現了引發進程掛起的事件時,系統利用掛起原語將指定進程或處於阻塞狀態的進程掛起。
激活:當發生激活進程的事件時,系統利用激活原語將指定進程激活。
進程掛起的事件:用戶進程請求將本身掛起;
父進程請求掛起某個子進程;
系統利用掛起原語將指定進程或阻塞態進程掛起
進程激活的事件:父進程請求激活某進程;
用戶進程請求激活某進程;
3、線程
定義:是進程中的一個實體,是被系統獨立調度的基本單位。
1 引入線程概述
引入進程的目的是爲了使多個程序更好的併發執行,改善資源利用率、提升系統效率。
引入線程則是爲了減小併發執行時所付出的時空開銷,使併發粒度更細、併發性更好。
進程的兩個屬性:進程是一個資源分配的基本單位。進程是一個可獨立調度和分派的基本單位。
從進程方面解釋引入線程:進程做爲一個資源擁有者,在建立、撤消、切換中,系統必須爲之付出較大時空開銷。
因此係統中進程的數量不宜過多,進程切換的頻率不宜太高,但這也就限制了併發程度的進一步提升。
將進程的上述兩個屬性分開,線程做爲調度的基本單位,不一樣時做爲獨立分配資源的單位;
線程會被頻繁調度和切換。進程做爲擁有資源的單位,不進行頻繁切換。線程於是產生。
特徵:結構性:TCB:標識、現場信息(寄存器、PC、棧指針)、調度信息(狀態、優先級)
數據塊:過程參數、數據、系統與用戶堆棧
併發性:同一進程中的各線程在同一主存空間,能夠共享進程中的全部資源(數據、設備、文件),線程間通訊方便。
共享性:同一進程的各線程
動態性:有生命期,有狀態變化,可建立子線程
性質:在引入線程的OS中,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位。
線程本身基本不擁有系統資源,只擁有少許必不可少的資源:程序計數器PC、一組寄存器、棧。
線程可與同屬一個進程的其它線程共享進程所擁有的所有資源。
一個線程能夠建立和撤消另外一個線程;同一進程中的多個線程之間能夠併發執行。
系統調度的基本單位是線程而不是進程,每當建立一個進程時,至少要同時爲該進程建立一個線程,不然該進程沒法被調度執行。
單線程進程的內存佈局和運行:
管理和執行相分離的進程模型:
引入線程的好處:建立一個新線程花費時間少
線程的終止時間比進程短;
同進程內的線程切換時間比進程短;
由於同一進程內的線程共享內存和文件,所以它們之間相互通訊無須調用內核
適合多處理機系統
線程的屬性:輕型實體:基本不擁有資源
獨立調度的基本單位
能夠併發執行
共享進程資源
線程的狀態:線程狀態:運行、就緒和阻塞三種狀態。線程的狀態轉換相似於進程。
掛起狀態對線程是沒有意義的,若是進程掛起後被對換出主存,則它的全部線程因共享了進程的地址空間,也必須所有對換出去。
線程的兩種阻塞方式:阻塞進程方式:對某些線程實現機制,當線程被阻塞時,所在進程也轉換爲阻塞態,即便這個進程存在另外一個處於就緒態的線程。
阻塞線程方式:若是存在另一個處於就緒態的線程,則調度該線程進入運行狀態,不然進程才轉換爲阻塞態。
線程的管理:線程包:多線程技術利用線程包(庫)提供線程原語集來支持多線程運行
線程包(庫)可分紅兩種:用戶空間中運行的線程包(庫)
內核中運行的線程包(庫)
線程包(庫)提供一組API,支持應用程序建立、調度、撤銷和管理線程的運行。如:建立、撤銷、改變優先級等。
有的操做系統直接支持多線程,而有的操做系統不支持多線程。
2 線程與進程的比較
概述:線程具備進程的許多特徵,在引入線程的OS中,每一進程都擁有至少一個線程。
(1)調度:傳統OS中,擁有資源、獨立調度的基本單位是進程;引入線程的系統中,線程是調度和分派的基本單位,而進程是擁有資源的基本單位。
在同一個進程內線程切換不會產生進程切換,由一個進程內的線程切換到另外一個進程內的線程時,將會引發進程切換。
(2)併發性:在引入線程的系統中,進程之間可併發,同一進程內的各線程之間也能併發執行。於是系統具備更好的併發性。
(3)擁有資源:不管是傳統OS,仍是引入線程的OS,進程都是擁有資源的獨立單位,線程通常不擁有系統資源,但它能夠訪問隸屬進程的資源。
即一個進程的全部資源可供進程內的全部線程共享。
(4)系統開銷:進程建立和撤消的開銷遠大於線程建立和撤消的開銷,進程切換時,當前進程的CPU環境要保存,新進程的CPU環境要設置,
線程切換時只須保存和設置少許寄存器,並不涉及存儲管理方面的操做,所以進程切換的開銷遠大於線程切換的開銷。
同一進程內的各線程因爲它們擁有相同的地址空間,它們之間的同步和通訊的實現也比較容易。
進程與線程的關係:
3 用戶級線程和內核級線程
OS對線程的實現機制:從實現的角度看,線程可分爲三種:用戶級線程ULT(User Level Thread)如: JAVA,Informix
核心級線程KLT (Kernal Level Thread)如:Win2k/XP、OS/2
混合式線程 如:Solaris
內核級線程KLT:依賴於內核,即不管是用戶進程中的線程,仍是系統進程中的線程,它們的建立、撤消、切換都由內核實現。Windows NT和OS/2支持內核線程;
性質:全部線程管理由核心完成
核心維護進程和線程的上下文
線程之間的切換須要核心支持
以線程爲基礎進行調度
時間片分配給線程,因此多線程的進程得到更多CPU時間。
一個線程發起系統調用而阻塞,不會影響其餘線程的運行。
優勢:對多處理器,核心可同時調度同一進程的多個線程;
阻塞是在線程一級完成。即進程中的一個線程被阻塞了,內核能調度同一進程的其它線程佔有處理器運行。
缺點:應用程序線程在用戶態運行,線程管理與調度是在覈心態,同一進程內的線程頻繁切換時,調用內核,線程切換時要作模式切換,致使速度降低
用戶級線程ULT:這種線程的建立、撤消和切換,都不用系統調用來實現,ULT與內核無關。
應用進程利用線程庫提供建立、同步、調度和管理線程的函數來控制用戶線程。
性質:由應用程序完成全部線程的管理:經過線程庫(用戶空間):一組管理線程的函數
線程庫提供一個線程運行管理系統(運行系統)
核心不知道線程的存在
線程切換不須要核心態特權
調度是應用程序特定的
用戶線程調度算法可針對應用優化;
線程庫:線程包(庫)提供一組API,支持應用程序建立、調度、撤銷和管理線程的運行。
做用:建立、撤消線程
在線程之間傳遞消息和數據
調度線程執行
保護和恢復線程上下文
線程庫可分紅兩種:用戶空間中運行的線程包(庫)
內核中運行的線程包(庫)。
線程庫實質上是多線程應用程序的開發和運行支撐環境。每一個線程庫應提供給用戶級的API編程使用。
多線程的操做系統和語言都提供了線程庫,支持應用程序建立、調度、和管理用戶級線程的運行。
優勢:線程切換是線程庫在用戶態進行,不調用核心
調度是應用程序特定的:能夠選擇最好的算法
ULT可運行在任何操做系統上(只須要線程庫),可在一個不支持線程的OS上實現
缺點:線程執行系統調用時,不只該線程被阻塞,且進程內的全部線程會被阻塞(KLT不會)。
純ULT中,多線程應用不能利用多重處理的優勢。內核給一個進程僅分配一個CPU(不知道進程中有線程),進程中僅有一個線程能執行。
(即同一進程中的兩個線程不能同時運行於兩個處理器上)
用戶級和核心級線程區別圖: