(1)進程的概念(Dijkstra)
進程是可並發執行的程序在某個數據集合上的一次計算活動,也是操作系統進行資源分配和調度的基本單位。
(2)進程與程序的聯系與區別
① 程序是指令的有序集合,其本身沒有任何運行的含義,是一個靜態的概念。而進程是程序在處理機上的一次執行過程,它是一個動態的概念。
② 程序可以作為一種軟件資料長期存在,而進程是有一定生命期的。程序是永久的,進程是暫時的。
注:程序可看作一個菜譜,而進程則是按照菜譜進行烹調的過程。
③ 進程和程序組成不同:進程是由程序、數據和進程控制塊三部分組成的。
④ 進程與程序的對應關系:通過多次執行,一個程序可對應多個進程;通過調用關系,一個進程可包括多個程序。
(3)進程的特征
動態性:進程是程序的執行,同時進程有生命周期。
並發性:多個進程可同存於內存中,能在一段時間內同時執行。
獨立性:資源分配和調度的基本單位。
制約性:並發進程間存在制約關系,造成程序執行速度不可預測性,必須對進程的並發執行次序、相對執行速度加以協調。
結構特征:進程由程序塊 、數據塊、進程控制塊三部分組成。
進程的三種基本狀態:
(1)運行態(running)
當進程得到處理機,其執行程序正在處理機上運行時的狀態稱為運行狀態。
在單CPU系統中,任何時刻最多只有一個進程處於運行狀態。在多CPU系統中,處於運行狀態的進程數最多為處理機的數目。
(2)就緒狀態(ready)
當一個進程已經准備就緒,一旦得到CPU,就可立即運行,這時進程所處的狀態稱為就緒狀態。系統中有一個就緒進程隊列,處於就緒狀態進程按某種調度策略存在於該隊列中。
(3)等待態(阻塞態)(Wait / Blocked )
若一個進程正等待着某一事件發生(如等待輸入輸出操作的完成)而暫時停止執行的狀態稱為等待狀態。 處於等待狀態的進程不具備運行的條件,即使給它CPU,也無法執行。系統中有幾個等待進程隊列(按等待的事件組成相應的等待隊列)。
運行到等待:等待某事件的發生(如等待I/O完成)
等待到就緒:事件已經發生(如I/O完成)
運行到就緒:時間片到(例如,兩節課時間到,下課)或出現更高優先級進程,當前進程被迫讓出處理器。
就緒到運行:當處理機空閉時,由調度(分派)程序從就緒進程隊列中選擇一個進程占用CPU。
上述三種狀態是進程最基本的狀態,在實際的操作系統實現中,進程遠不止這三種狀態。
由於系統不斷創建進程,系統資源特別是主存已不能滿足進程運行要求,此時必須將某些進程掛起(suspend),置於磁盤對換區,釋放其所占資源,暫時不啟用低級調度,起到平滑負載的目的。
進程內容及其狀態集合稱為進程映像。包括:
進程控制塊:每個進程有一進程控制塊,用來存儲進程的標識信息、現場信息和控制信息。
程序塊:
核心棧:每個進程捆綁一個核心棧,進程在核心態工作時,用來保存中斷/異常現場等。
數據塊:存放程序私有數據,用戶棧也在數據塊中開辟。
進程上下文
操作系統中把進程物理實體和支持進程運行的環境合稱為進程上下文。
進程在其當前上下文中運行,當系統調度新進程占有處理器時,新老進程隨之發生上下文切換。即保存老進程狀態而裝入被保護了的新進程的狀態,以便新進程運行
進程上下文組成
用戶級上下文:由正文(程序)、數據、共享存儲區、用戶棧組成,占用進程的虛地址空間。
存器上下文:由程序狀態字寄存器、指令計數器、棧指針、控制寄存器、通用寄存器等組成。
系統級上下文:由進程控制塊、主存管理信息(頁表或段表)、核心棧等組成。
進程控制塊(Process Control Block,PCB)
每個進程有且僅有一個進程控制塊
PCB是操作系統用於記錄和刻划進程狀態及有關信息的數據結構,是操作系統掌握進程的唯一資料結構。
系統利用PCB來控制和管理進程,所以PCB是系統感知進程存在的唯一標志
進程與PCB是一一對應的,在創建進程時,建立PCB,並伴隨進程運行的全過程,直到進程撤消而撤消。PCB就象我們的戶口。
PCB的內容
①標識信息
進程標識ID:唯一,通常是一個整數
進程組標識ID
用戶進程名
用戶組名
②現場信息
寄存器內容(通用寄存器內容、控制寄存器內容、棧指針等)
③控制信息
進程調度信息:如進程狀態、等待時間、等待原因、進程優先級、隊列指針等
進程組成信息:如正文段指針、數據段指針、進程族系信息
進程間通信信息:如消息隊列指針、所使用的信號量和鎖
進程段、頁表指針、進程映像在輔存地址
CPU的占用和使用信息:如時間片剩余量、已占用CPU時間、已執行時間總和、定時器信息、記賬信息
進程特權信息:如主存訪問權限、處理器特權
資源清單:所需全部資源、已分得資源
進程隊列及其管理
處於同一狀態的所有PCB組織在一起的數據結構稱為進程隊列。例如運行隊列、就緒隊列、等待隊列。
同一狀態進程的PCB既可按先來先到的原則排成隊列;也可按優先數或其它原則排成隊列。
通用隊列組織方式:
線性方式
鏈接方式
索引方式
(1)線性方式
OS根據進程的最大數目,靜態分配主存中某塊空間,所有進程的PCB都組織在一個線性表中。
優點:簡單易行;
缺點:限定了系統中進程最大數,
經常要掃描整個線性表,調度效率較低。
(2)鏈接方式
相同狀態的進程PCB通過鏈接指針鏈接成一個隊列。
不同狀態的進程可排成不同的隊列,如運行隊列、就緒隊列、等待隊列。等待隊列按等待原因不同可排成多個等待隊列。
(3)索引方式
對具有相同狀態的進程,分別設置各自的PCB索引表,如就緒索引表、等待索引表,記錄PCB在PCB表中的地址.
進程切換
一個進程讓出處理器,由另一個進程占用處理器的過程稱為進程切換。
進程的切換使系統中的各進程均有機會占用CPU。
進程切換的步驟
保存被中斷進程的處理器現場信息
修改被中斷進程的進程控制塊的有關信息,如進程狀態等
把被中斷進程的進程控制塊加入有關隊列
選擇下一個占有處理器運行的進程
修改被選中進程的進程控制塊的有關信息
根據被選中進程設置操作系統用到的地址轉換和存儲保護信息
根據被選中進程恢復處理器現場
進程的控制和管理
進程是有生命周期的:產生、運行、暫停、終止。進程生命周期的動態變化過程由進程管理程序來控制。
進程的控制和管理包括:
進程創建
進程撤消
進程阻塞
進程喚醒
進程掛起
進程激活
這些控制和管理功能由操作系統中的原語實現。
原語是在核心態執行、完成系統特定功能的不可分割的過程。
原語的特點是執行過程中不允許被中斷,是一個不可分割的基本單位,原語的執行是順序的而不可能是並發的。
1.進程創建
進程創建類似於人出生后要到派出所報戶口。
進程創建過程:
(1)在進程列表中增加一項,從PCB池中申請一個空閑PCB,為新進程分配惟一的進程標識符;
(2)為新進程的進程映像分配地址空間。進程管理程序確定加載到進程地址空間中的程序;
(3)為新進程分配除主存空間外的其他各種所需資源;
(4)初始化PCB,如進程標識符、處理器初始狀態、進程優先級等;
(5)把新進程狀態置為就緒態,並移入就緒進程隊列;
(6)通知操作系統的某些模塊,如記賬程序、性能監控程序。
2.進程撤銷
進程完成其任務或出現嚴重錯誤后,操作系統調用進程撤消原語撤消進程。相當於一個人死亡后,家人要去派出所消戶口。
進程撤銷過程:
(1)根據撤銷進程標識號,從相應隊列中找到並移出它;
(2)將該進程擁有的資源歸還給父進程或操作系統;
(3)若該進程擁有子進程,先撤銷它的所有子進程,以防它們脫離控制;
(4)回收PCB,並歸還到PCB池。
3.進程阻塞和喚醒
當一個處在運行狀態的進程,因等待某個事件的發生(如等待打印機)而不能繼續運行時,進程將調用阻塞原語來阻塞自己,進程的狀態由運行態轉換為等待態(阻塞態)。
當等待事件完成時,會產生一個中斷,激活操作系統,在系統控制下將被阻塞的進程喚醒,這個進程將由阻塞狀態轉換成就緒狀態。
進程阻塞步驟:
(1)停止進程執行,保存現場信息到PCB
(2)修改進程PCB有關內容,如進程狀態由運行態改為等待態等,並把修改狀態后的進程移入相應事件的等待隊列中;
(3)轉入進程調度程序去調度其他進程運行。
進程喚醒步驟:
(1)從相應的等待隊列中移出進程;
(2)修改進程PCB的有關信息,如進程狀態改為就緒態,並移入就緒隊列;
(3)若被喚醒進程比當前運行進程優先級高,重新設置調度標志。
線程及其實現
一、引入多線程的動機
引入進程的目的是為了使多個程序並發執行,以改善資源使用率、提高系統效率。
再引入線程,則是為了減少程序並發執行時所付出的時空開銷,使得並發粒度更細、並發性更好。
進程的兩項功能
1. 進程是資源分配和保護基本單位。
2.進程同時又是一個可獨立調度和分派的基本單位。
進程作為一個資源擁有者,在創建、撤消、切換中,系統必須為之付出較大時空開銷。所以系統中進程的數量不宜過多,進程切換的頻率不宜過高,但這也就限制了並發程度的進一步提高。
為解決此問題,人們想到將進程的上述兩個功能分開,即對作為調度和分派的基本單位,不同時作為獨立分配資源的單位;對擁有資源的單位,不對之進行頻繁切換,線程因而產生。
多線程環境中進程的定義
進程是操作系統中除處理器外進行的資源分配和保護的基本單位,它有一個獨立的虛擬地址空間,用來容納進程映像(如與進程關聯的程序與數據),並以進程為單位對各種資源實施保護,如受保護地訪問處理器、文件、外部設備及其他進程(進程間通信)。
1.多線程環境中的線程概念
線程是操作系統進程中能夠並發執行的實體,是處理器調度和分派的基本單位。
每個進程內可包含多個可並發執行的線程。
線程自己基本不擁有系統資源,只擁有少量必不可少的資源:程序計數器、一組寄存器、棧。
同屬一個進程的線程共享進程所擁有的主存空間和資源。
2.引入線程的好處
創建一個新線程花費時間少(結束亦如此)
兩個線程的切換花費時間少
因為同一進程內的線程共享內存和文件,因此它們之間相互通信無須調用內核
3. 線程與進程的比較
線程具有進程的許多特征,故又稱輕型進程,傳統進程稱重型進程。
在引入線程的OS中,每一進程都擁有多個線程,至少一個。
(1)調度
在傳統OS中,擁有資源、獨立調度和分派的基本單位都是進程,在引入線程的系統中,線程是調度和分派的基本單位,而進程是擁有資源的基本單位。
在同一個進程內線程切換不會產生進程切換,由一個進程內的線程切換到另一個進程內的線程時,將會引起進程切換。
(2)並發性
在引入線程的系統中,進程之間可並發,同一進程內的各線程之間也能並發執行。因而系統具有更好的並發性。
(3)擁有資源
無論是傳統OS,還是引入線程的OS,進程都是擁有資源的獨立單位,線程一般不擁有系統資源,但它可以訪問隸屬進程的資源。即一個進程的所有資源可供進程內的所有線程共享。
(4)系統開銷
進程的創建和撤消的開銷要遠大於線程創建和撤消的開銷,進程切換時,當前進程的CPU環境要保存,新進程的CPU環境要設置,線程切換時只須保存和設置少量寄存器,並不涉及存儲管理方面的操作,可見,進程切換的開銷遠大於線程切換的開銷。
同時,同一進程內的各線程由於它們擁有相同的地址空間,它們之間的同步和通信的實現也變得比較容易。
線程的實現
多線程的實現分為三類:
用戶級線程(User Level Thread,ULT):對於這種線程的創建、撤消、和切換,由用戶程序來實現,內核並不知道用戶級線程的存在。
內核級線程(Kernel Level Thread ,KLT):它們是依賴於內核的,即無論是用戶進程中的線程,還是系統進程中的線程,它們的創建、撤消、切換都由內核實現。
混合式線程:同時支持ULT和KLT兩種線程。
1.用戶級線程(ULT)
由應用程序完成所有線程的管理
通過用戶空間中的線程庫來完成
內核並不知道線程的存在。
線程庫
提供線程運行管理系統:
創建、撤消線程
在線程之間傳遞消息和數據
調度線程執行
保護和恢復線程上下文
用戶級線程的優點和缺點
優點:
線程切換不調用核心
調度是應用程序特定的:可以按需要選擇好的算法
ULT可運行在任何操作系統上(只需要線程庫),可以在一個不支持線程的OS上實現
缺點:
由於大多數系統調用是阻塞的,因此一個用戶級線程的阻塞會引起整個進程的阻塞。
核心只將處理器分配給進程,同一進程中的兩個線程不能同時運行於兩個處理器上
2.核心級線程(KLT)
所有線程管理由核心完成
沒有線程庫,但核心提供線程API來使用線程
核心維護進程和線程的上下文
線程之間的切換需要核心支持
以線程為基礎進行調度
核心級線程的優點和缺點
優點:
對多處理器,核心可以同時調度同一進程的多個線程
阻塞是在線程一級完成
缺點:
在同一進程內的線程切換調用內核,系統開銷較大
3.混合式線程
既支持用戶級線程,又支持內核級線程。
例子:Solaris
處理器調度
處理機是計算機系統中的重要資源。
處理機調度算法對整個計算機系統的綜合性能指標有重要影響。
可把處理機調度分成三個層次:
高級調度
中級調度
低級調度
1.高級調度
也稱為作業調度或長程調度。
作業調度的主要功能是根據作業調度算法選擇外存上處於后備隊列中的某些作業調入內存,並為他們分配必要的資源、創建作業相應的進程,在作業完成后還要做結束階段的善后工作。
2.低級調度
也稱進程/線程調度、短程調度。
進程調度的主要功能是根據一定的調度算法從就緒隊列中選中一個進程/內核級線程獲得處理器,讓它使用。
低級調度是操作系統最核心部分,執行十分頻繁,其調度策略的好壞直接影響整個系統的性能。
低級調度的調度方式:
(1)非剝奪式(非搶先式)
調度程序一旦把cpu分配給某一進程/線程后,便讓他一直運行下去,直到進程完成或發生某事件不能運行時,才將cpu分配給其他進程。
這種調度方式通常用於批處理系統中。
優點:簡單,系統開銷小
缺點:難以滿足緊急任務的要求,實時系統不宜采用
(2)剝奪式(搶先式)
當一個進程/線程正在處理器上執行時,調度程序可根據某種原則剝奪cpu分配給其他進程/線程。
這種調度方式通常用於分時系統和實時系統中。
剝奪的原則:
優先權原則
短作業(進程)優先原則
時間片原則
3.中級調度
又稱平衡調度,中程調度
涉及進程在內外存間的交換,當主存資源緊缺時將暫不運行的進程從內存調至外存,此時這個進程處於“掛起”狀態;當進程又具備運行條件且主存資源有空閑時,再將進城從外存調至內存。
中級調度的主要目的是提高內存利用率和系統吞吐量。
低級調度是各類操作系統必備的,在純粹的分時系統或實時系統中,通常不需高級調度。一般系統都有高級調度和低級調度;功能完善的系統引入了中級調度。
選擇調度算法的原則
l .資源利用率(特別是CPU利用率)
CPU利用率=CPU有效工作時間/CPU總的運行時間,
CPU總的運行時間=CPU有效工作時間+CPU空閑等待時間。
2.吞吐率
單位時間內處理的作業數。
評價批處理系統性能的另一個重要指標。
3.公平性
確保每個用戶每個進程獲得合理的CPU份額或其他資源份額,不會出現餓死情況。
4.響應時間
交互式進程從提交一個請求(命令)到接收到響應之間的時間間隔稱響應時間。
響應時間包括:請求傳送到CPU時間、CPU處理請求的時間、響應回送到終端顯示器的時間。
使交互式用戶的響應時間盡可能短,或盡快處理實時任務,這是分時系統和實時系統衡量調度性能的一個重要指標。
5.周轉時間
批處理用戶從作業提交給系統開始,到作業完成為止的時間間隔稱作業周轉時間。
包括四部分時間:在外存后備隊列上等待作業調度的時間,相應進程在就緒隊列中等待進程調度的時間,進程在cpu上執行的時間、進程等待I/O操作完成的時間。
應使作業周轉時間或平均作業周轉時間盡可能短,這是批處理系統衡量調度性能的一個重要指標。
6.周轉時間ti
作業i提交給系統的時刻是ts,完成時刻是tf,該作業的周轉時間ti為:ti = tf – ts。
周轉時間=作業等待時間+作業運行時間。
為了提高系統的性能,要讓若干個用戶的平均作業周轉時間和平均帶權周轉時間最小。
平均作業周轉時間 T
T = (Σti) / n
帶權周轉時間 wi
如果作業i的周轉時間為ti,所需運行時間為tk,則
wi=ti /tk
平均作業帶權周轉時間 W
W = (Σwi) / n
作業與進程的關系
1. 作業的基本概念
(1)作業(job)
用戶提交給操作系統計算的一個獨立任務。
(2)作業步(job step)
一個作業可划分成若干加工步驟,稱為一個作業步。
典型的作業控制過程:
“編譯”、“鏈接” “裝入”、“運行”
(3)作業控制塊( Job Control Block ,JCB)
為有效地管理作業,必須為進入系統的每個作業建立作業控制塊。JCB是在批作業進入系統時,由Spooling系統建立的,它是作業存在於系統的標志,作業撤離時,JCB也被撤銷。
JCB保存有系統對於作業進行管理所需要的全部信息。
批處理作業的組織和管理
一個作業從進入系統到運行結束經歷四個不同的狀態:
輸入狀態:
后備狀態:
執行狀態:
完成狀態:
作業是任務實體,進程是完成任務的執行實體;沒有作業任務,進程無事可干,沒有進程,作業任務沒法完成。
作業概念更多地用在批處理操作系統,而進程則可以用在各種多道程序設計系統。
處理器調度算法
一、先來先服務(First Come First Served,FCFS )
最簡單的調度算法,即可用於作業調度,也可用於進程調度。
按作業(進程)來到的先后次序進行調度。
優點:易於實現
缺點:調度程序每次選擇的作業是等待時間最久的,而不管作業的運行時間的長短,此算法效率低;
有利於長作業,不利於短作業
二、最短作業(進程)優先算法
SJF:Shortest Job First
SPF:Shortest Process First
可用於作業調度和進程調度。
估計作業(進程)的CPU運行時間,選取估計時間最短的作業(進程)投入運行。
優點:
(1)易於實現。
(2)在一般情況下這種調度算法比先來先服務調度算法的調度性能比FCFS好。
缺點:
(1)作業(進程)的執行時間是用戶估計的,不一定准確,所以實現時不一定真正做到短作業優先調度。
(2)對長作業不利
若系統不斷接受新作業,就有可能使長作業長時間得不到調度。出現飢餓現象
(3)缺少剝奪機制,對分時、實時系統仍不理想
三、響應比最高者優先算法
(HRRF:Highest Response Ratio First)
FCFS與SJF是片面的調度算法。FCFS只考慮作業等候時間而忽視了作業的計算時問,SJF只考慮用戶估計的作業計算時間而忽視了作業等待時間。
HRRF是介乎這兩者之間的折衷算法,既考慮作業等待時間,又考慮作業的運行時間,既照顧短作業又不使長作業的等待時間過長,改進了調度性能。
響應比R = 作業周轉時間 / 作業處理時間
=(作業處理時間+作業等待時間)/ 作業處理時間
= 1 +(作業等待時間 / 作業處理時間)
響應比最高者優先算法:每次調度時,計算所有作業的響應比,選擇響應比最高的調度。
短作業容易得到較高響應比,
長作業等待時間足夠長后,也將獲得足夠高的響應比,飢餓現象不會發生。
計算響應比導致一定的時間開銷,此算法性能介於FCFS和SJF之間。
四、優先級調度算法
為作業或進程確定優先級,選擇優先級最高的作業或進程調度。
1.兩種方式
非剝奪式:某一進程被調度運行后,除非由於它自身的原因不能運行,否則一直運行下去。
剝奪式:當有比正在運行的進程優先級更高的進程就緒時,系統可強行剝奪正在運行進程的CPU,提供給具有更高優先級的進程使用。
采用這種調度算法的關鍵是如何確定進程的優先級、一個進程的優先級確定之后是固定的,還是隨着該進程運行的情況的變化而變化。
2.優先級類型
(1)靜態優先級
在進程創建時確定優先級,在進程運行時保持不變。
確定優先級方法:
系統確定(內部優先級) :考慮進程運行時間、使用資源,進程類型。
用戶確定(外部優先級) :考慮進程緊迫程度,計費與進程優先級有關。
(2)動態優先級
在進程創建時創立一個優先級,系統在運行的過程中,根據系統的設計目標,不斷地調整進程的優先級,這種方法的優點是能比較客觀地反映進程的實際情況和保證達到系統設計目標。
如等待時間長優先級可改變 。
五、時間片輪轉調度算法(Round Robin,RR)
分時系統中常用時間片輪轉法。
把CPU划分成若干時間片,並且按順序分配給就緒隊列中的每一個進程,進程輪流占有CPU,當時間片用完時,即使進程未執行完畢,系統也剝奪該進程的CPU,將該進程排在就緒隊列末尾,等候下一輪調度。
1.時間片大小的確定
時間片大小對系統性能有很大影響。時間片太小,會導致頻繁切換,增大系統開銷;時間片太大,輪轉一次時間加長,進程在一個時間片內完成,時間片輪轉算法退化為FCFS算法,無法滿足交互式用戶需求。
確定時間片長度要從進程數目、切換開銷、系統效率和響應時間等多方面加以考慮。
2.RR改進
RR由於采用固定時間片和僅有一個就緒隊列,所以服務質量不夠理想,進一步改進沿兩個方向:
(1)將固定時間片改為可變時間片
引入可變時間片輪轉調度算法
(2)將單就緒隊列改為多就緒隊列
引入多級反饋隊列調度算法
六、多級反饋隊列調度算法
(MLFQ:Multi-level Feedback Queue)
設置多個就緒隊列,並為各個隊列賦予不同的優先級,第一個隊列最高,第二個次之……;各個隊列時間片大小也不同,在優先級越高的隊列中,為每個進程分配的時間片越小。
處理器調度先從第一個就緒進程隊列中選取進程,同一隊列中的進程按FCFS算法進行排隊。只有在未選到時,才從較低級的就緒進程隊列中選取。
當新進程進入內存后,首先放在第一個隊列末尾,到輪到該進程執行時,如在該時間片完成,便可撤離系統;若未完成,則將該進程轉入第二個隊列末尾…
該算法具有較好的性能,能滿足各類應用的需要。
分時交互型短作業:通常在第一隊列規定的時間片完成,可使終端型用戶滿意。
短批處理作業:通常在第一隊列和第二隊列各執行一個時間片就能完成,周轉時間仍很短。
長批處理作業:它將一次在第1,2,3…n個隊列中運行。