2-1-程序的基本概念
2-1-1關于程式執行順序
1)引入前趨圖:描述程序執行前後關系的圖
有向無循環圖(DAG)
Pi結點:描述一個程式段、程序、或一條語句。
有向邊“→”:結點之間的偏序或前序關系
Pi→Pk,則Pi是Pk的直接前趨,Pk是Pi的直接後繼。

2)程式順序執行時的特征
順序性 處理機的操作嚴格按程式規定順序執行
封閉性 程式一旦開始執行,其計算結果不受外界因素影響。
可再現性 程式執行隻要初始條件一樣,不論如何停頓,重複執行多少次結果都一樣
3)程式的并發執行分析
-
List item要符合前趨關系:
Ii->Ci; Ci->Pi;
Ii->Ii+1;Ci->Ci+1;
Pi->Pi+1;
-
并發不是随意的
如C1,C2無法交替執行,隻能順序執行;但C2和P1則沒有嚴格時間關系
多道程式運作,走走停停的可能順序有很多種,符合前趨圖的關系才是合理并發
4)并發程式執行時的特征
-
間斷性(運作表現)
多道 -> 程式并發執行-> 要共享系統的資源 -> 形成互相制約的關系
-> 互相制約導緻并發程式具有“執行——暫停——執行”這種間斷性的活動規律。
-
失去封閉性
共享資源,資源狀态由多道程式改變,程式運作失去封閉性。即程式運作受其他程式的影響
-
不可再現性
結果不确定,程式執行将沒有任何意義
第二章 程式管理2-1-程式的基本概念2-2-程式控制2-3-程式同步2.4 程式通信2.5 線程
2-1-2程序
OS利用“程序實體”控制程式執行就産生了“程序”,程序就是用于描述、控制程式在記憶體中并發運作的一個東東
1)程序的定義
程序是程序實體的運作過程,是系統進行資源配置設定和排程的一個獨立機關
2)程序的特征
- 結構性特征,程序的根本——PCB
-
動态性
程序實質上是程序實體的一次有生命期的執行過程。程式隻是靜态的一組有序指令。
程序最基本特征
-
并發性
多個程序實體同存于記憶體中,在一段時間内同時運作。
有PCB的程式才能并發
- 獨立性
- 異步性
差別程序與程式
動與靜:
程序是動态的,程式是靜态的:程式是有序代碼的集合;程序是程式的執行。
永久與暫時:
程序是暫時的,程式是永久的:程序是一個狀态變化的過程,程式可長久儲存。
結構:
程序的組成包括程式、資料和程序控制塊(程序各種控制資訊)。
程序與程式的對應關系:
都可1對n。通過多次執行,一個程式可對應多個程序;通過調用關系,一個程序可包括多個程式。
3)程序的基本狀态
-
就緒狀态Ready
程序獲得除CPU之外的所有必需資源,一旦得到CPU控制權,可立即運作
-
運作狀态Running
程序已獲得所有運作必需的資源,正在處理機上執行
-
阻塞狀态Blocked
正在執行的程序由于發生某事件(請求I/O、申請緩沖、時間片到)而暫時無法執行時,便放棄CPU後暫停
第二章 程式管理2-1-程式的基本概念2-2-程式控制2-3-程式同步2.4 程式通信2.5 線程 -
挂起狀态*:就緒的、但不會被排程執行
産生原因
使用者自己請求暫停
父程序檢查、協調子程序時挂起子程序
調節負荷的需要,負載過重,為保證明時任 務的控制,挂起一些不重要的程序
作業系統的檢查和記錄需要挂起程序。
第二章 程式管理2-1-程式的基本概念2-2-程式控制2-3-程式同步2.4 程式通信2.5 線程
各種狀态下的程序隊列
單處理機系統,執行态的程序隻有一個;
就緒态、阻塞态的程序可有多個。一般講它們分别排稱一個隊列,稱就緒隊列、阻塞隊列。
阻塞隊列有的會根據不同原因再排成多個隊列。
Linux的程序狀态*
建立狀态:
Pcb已建立,
但資源配置設定還未完成
終止狀态:
不可再執行,
歸還資源,保留一份狀态碼好計時統計資料。
增加了作業系統管理程序的靈活性。如os可根據性能和記憶體容量限制,推遲建立态轉入就緒态
2-1-3程序控制塊PCB
程序實體:代碼段+資料段+PCB
程序控制塊是程序存在的唯一标志
程序控制塊定義 Process Control Block
存放程序的管理和控制資訊的資料結構稱為程序控制塊。
1)程序控制塊中的資訊
-
程序辨別符資訊
每個程序都必須有一個唯一的辨別符
内部标示符:唯一的數字序号,友善系統使用
外部标示符:友善使用者使用,使用者程序通路某程序時使用
-
處理機狀态資訊
主要由處理機的各種寄存器中的内容組成,被中斷時這些資訊要存放到PCB。
通用寄存器:使用者程式通路的,暫存資訊
指令計數器:下一條指令位址
程式狀态字PSW:一些狀态資訊
使用者棧指針:每個使用者程序都有的存放過程和系統調用參數及調用位址的一組系統棧。
-
程序排程資訊
程序狀态
程序優先級
程序排程所需的其他資訊:排程算法相關資訊
事件:狀态轉換有關的事件
-
程序控制資訊
程式和資料的位址(單個程序):資料所在的内外存位址
程序同步和通信機制(多程序間):同步和通信機制的信号量、消息隊列指針等
資源清單
連結指針(PCB的組織):本PCB所在隊列的下一個程序PCB首位址。
2)pcb資訊的存放
系統運作中有若幹個程式的PCB,它們常駐記憶體的PCB區。
采用的資料結構:PCB結構體,PCB連結清單或隊列
3)pcb的組織方式?
-
連結方式
同一狀态的PCB,依靠連結指針連結成隊列。就緒隊列;若幹個阻塞隊列;空白隊列(PCB區的空PCB塊)
第二章 程式管理2-1-程式的基本概念2-2-程式控制2-3-程式同步2.4 程式通信2.5 線程 -
索引方式
同狀态的PCB同樣集中記錄,但以索引表的方式記錄PCB的位址。用專門的單元記錄各索引表的首位址。
第二章 程式管理2-1-程式的基本概念2-2-程式控制2-3-程式同步2.4 程式通信2.5 線程
2-2-程序控制
程序圖
可用 “程序圖”描述一個程序的家族關系,該圖實際就是一種有向樹
系統中運作的程序并不都是孤立的,有的程序運作後,會調用其他程序來執行,這樣就組成了程序間的父子關系
2-2-1 程序控制
- 一個程序建立另一程序的事件(原因)
使用者登入:分時情況下使用者的請求
作業排程:批進行中
提供服務:運作中的使用者程式提出功能請求,要建立服務程序(如列印服務)
應用請求:應用程式自己建立程序,完成特定功能的新程序。(木馬程式)
-
建立過程
(1) 申請空白PCB
(2) 為新程序配置設定資源
主要是記憶體資源的處理
(3) 初始化程序控制塊
辨別符(包括父程序的)、程式計數器指向程式入口位址,就緒态、優先級等資訊的填寫。
(4) 将新程序插入就緒隊列
OS通過調用程序建立原語Creat()建立新程序
原語是由若幹指令構成的原子操作過程,作為整體實作功能,不可被打斷
其他各控制工作也都是由OS核心以“原語”的方式實作,以保證不被打斷
2-2-2 程序終止
引起程序終止的事件
- 正常結束
-
異常結束
記憶體越界錯誤
保護錯(權限錯,如修改隻讀檔案等)
非法指令(不存在的指令,程式異常轉向而把資料當指令)
特權指令錯(使用者态程式試圖執行隻有OS可執行的指令)
運作逾時、運算錯、i/o故障等
-
外界幹預
操作員或作業系統幹預(死鎖時,可人為結束)
父程序請求終止子程序
父程序終止,子孫程序也跟着終止
終止程序
對上述事件,OS調用核心終止原語,執行下列過程:
-
(1) 根據程序标示符,檢索出該程序PCB,讀其狀态。
*IF 執行态,立即終止該程序,置排程标志為真,訓示重新進行排程。
*IF 有子孫程序,亦應予以終止,以防成為不可控程序。
- (2) 歸還全部資源至其父程序或系統。
- (3) 将該程序PCB從所在隊列或連結清單中移出
2-2-3 程序的阻塞與喚醒
引起程序阻塞和喚醒的事件
請求系統服務的滿足情況
啟動某種需等待(I/O)操作
合作需要的新資料尚未到達
執行某功能的程序暫時無新工作可做(如發送資料程序)
阻塞和喚醒過程
由程序調用阻塞原語阻塞自己,是主動行為:
(阻塞與喚醒原語作用相反,成對使用)
(1)将PCB中的狀态改為阻塞
(2)該PCB加入到阻塞隊列中
(3)轉程序排程,将處理機配置設定給另一程序
(4)進行程序切換,即根據兩切換程序的PCB,保護與重新設定處理機狀态。
2-2-4 程序的挂起和激活
挂起原語将指定程序或阻塞程序挂起。
(1)檢查被挂起程序的狀态,活動就緒則改為靜止就緒,活動阻塞則改為靜止阻塞
(2)将該PCB複制到記憶體(友善檢查)/外存(對換)指定區域
(3)*若挂起的程序是執行态,則需重新進行程序排程。
注意:程序隻能挂起自己或其子孫程序。
激活原語的執行過程
若挂起程序在外存上,将其調入記憶體
檢查程序狀态,若處于靜止就緒,則改為活動就緒,若處于靜止阻塞,則改為活動阻塞
2-3-程序同步
關鍵:“判斷”和“修改标志”
兩種制約關系
- 間接互相制約關系:主要源于資源共享,表現為 程序A—列印機資源—程序B(互斥)
- 直接互相制約關系:主要源于程序合作,表現為 程序A寫緩沖—程序B讀緩沖(有序)
2-3-1了解同步的含義
1.程序同步的主要任務
使并發執行的諸程序之間能有效地共享資源和互相合作,進而使程式的執行具有可再現性。
2.臨界資源:一次僅允許一個程序使用的資源
- 互斥:在作業系統中,當一個程序進入臨界區使用臨界資源時,另一個程序必須等待,直到占用臨界資源的程序退出臨界區,我們稱程序之間的這種互相制約關系為“互斥”。
- 同步:多個互相合作的程序,在一些關鍵點上可能需要互相等待或互相交換資訊,這種互相制約關系稱為程序同步關系。可了解為“有序”
3.臨界區
每個程序中通路臨界資源的那段代碼叫臨界區。
為了正确同步,對臨界區的代碼要增加控制
進入區:對欲通路的臨界資源進行檢。若此刻未被通路,設正在通路的标志
臨界區:通路臨界資源的代碼。
退出區:将正在通路的标志恢複為未被通路的标志
剩餘區:其餘部分
4.同步機制應遵循的規則
實作互斥的方法應符合如下每條原則
空閑讓進:資源使用最基本原則
忙則等待:保證互斥
有限等待:合适時被喚醒防止死等
讓權等待:能主動釋放CPU防止忙等
硬體同步機制*
-
關中斷
進入鎖測試前關閉中斷,直到完成鎖測試并上鎖後才能打開中斷。程序在臨界區執行期間,系統不響應中斷,進而不引發排程。
缺點:
濫用風險
關中斷時間過長會影響效率,限制CPU交叉執行能力
- Test-and-Set指令
boolean TS(boolean *lock) { Boolean old; old=*lock; *lock=TRUE; return old; }
*一個不可分割的原語
不适用于多CPU系統
-
利用Swap指令實作程序互斥
對換指令(intel 80x86中稱XCHG指令),用于交換兩個位元組的内容
void swap(boolean *a, boolean *b) {boolean temp; temp=*a; *a=*b; *b=temp; }
為臨界資源設定一個全局布爾變量lock=false。每個程序一個局部布爾變量key。
do{
key=TRUE;
do{
swap(&lock,&key);
}while(key!=FALSE);
臨界區操作;
lock=FALSE;
剩餘區;
}while(TRUE);
完全利用軟體方法,有很大局限性,也不适于多程序,現在已很少采用。
硬體指令機械操作可保證鎖開、關操作不被打斷;适用于任意數目的程序。但等待要耗費CPU時間,不能實作“讓權等待”,從等待程序中随機選擇一個進入臨界區,有的程序可能一直選不上,難以實作較為複雜的程序同步問題。
2-3-2信号量機制控制程序同步
1.整型信号量
信号量定義為一個整型量;
根據初始情況賦相應的值;
僅能通過兩個原子操作來通路
2.記錄型信号量
-
整型信号量符合“有限等待”原則
signal釋放資源後,當CPU被配置設定給等待程序後,等待程序仍可繼續執行,可以符合“有限等待”。
-
但整型信号量不符合“讓權等待”原則
整型信号量的wait操作,當s ≤0時,目前程序會占着CPU不斷測試;
信号量原語不能被打斷,這個占有CPU的程序會一直不斷的占據CPU循環下去,陷入忙等。
- 改進:條件不符時應能夠主動放棄CPU
- 新問題:放棄CPU的程序進入阻塞隊列:因等待某信号量而放棄CPU的等待程序會有“若幹”個,需将它們組織管理起來,并在合适的時候喚醒。
Value>0,表示目前可用資源的數量;
Value≤0,其絕對值表示等待使用該資源的程序數,即在該信号量隊列上排隊的PCB的個數。
-
定義信号量semaphore代表可用資源實體的數量。又叫信号燈。 當≥0,代表可供并發程序使用的資源實體數
當<0,表示正在等待使用該資源的程序數。
- 建立一個信号量必須經過說明,包括 信号量所代表的意義 賦初值 建立相應的資料結構,以便指向等待使用臨界區的程序。
除初值外,信号量的值僅能由标準原子操作P、V操作來改變。 PV操作是荷蘭語通過和釋放的意思。
3.信号量的基本應用
(1)實作程序互斥
互斥信号量注意點:
- 互斥信号量mutex初值為1;
- 每個程序中将臨界區代碼置于P(mutex)和V(mutex)原語之間
-
必須成對使用P和V原語(在同一程序中),不能次序錯誤、重複或遺漏:
遺漏P原語則不能保證互斥通路
遺漏V原語則不能在使用臨界資源之後将其釋放(給其他等待的程序);
(2)實作程序間的前趨關系(有序)
前趨關系:
并發執行的程序P1和P2中,分别有代碼C1和C2,要求C1要在C2開始前完成;
為每對前趨關系設定一個同步信号量S12,并賦初值為0。則隻有V操作所在程序獲得cpu時能運作
- 信号量值為0的點是限制的關鍵所在;
- 成對使用P和V原語(在有先後關系的兩個程序中),不能次序錯誤、重複或遺漏,否則同步順序出錯。
例子:
4.AND型信号量
出現原因:一些應用往往需要兩個或多個共享資源,而不是前述的一個資源。程序同時要求的共享資源越多,發生死鎖可能性越大。
解決思想:
一次性配置設定給程序所需資源,用完一起釋放。Wait操作時對它所有需要的資源都要判斷,有AND條件,故稱“AND同步”、“同時wait”。
5.信号量集
引入原因:
每次隻能獲得或釋放一個機關的資源,低效;
某些時候資源配置設定有下限的限制;
修改:在大于可配置設定設定的下界值t前提下,每次可配置設定d個。
隻有一個信号量S的幾種特殊情況:
- Swait(S, d, d),,允許每次申請d個資源,若現有資源數少于d,不予配置設定。
- Swait(S, 1, 1),蛻化為一般的記錄型信号量,一次申請一個,至多配置設定一個(S>1時可計數,或S=1時可控制互斥)。
-
Swait(S, 1,
0),當S>=1時,允許多個程序進入某特定區,當S變為0後,阻止任何程序進入特定區,相當于可控開關。并不對S資源的數量産生影響。
信号量題目做題一般方法:
分析問題,找出同步、互斥關系
根據資源設定信号量變量
寫出代碼過程,并注意P、V操作的位置
檢查代碼,模拟機器運作,體驗信号量的變化和程式運作過程是否正确。
2-3-3管程
信号量機制的不足:
信号量的控制分布在多個程序中
正确性分析困難;
分散的P、V操作:易出錯,使用不當可能導緻死鎖。
修改、維護困難:易讀性差,任一修改都可能影響全局;測試期間發現錯誤困難,即使發現錯誤也不容易定位出錯位置。
1.管程的組成
2.管程的特點
-
任何程序隻能通過調用管程提供的過程入口才能進入管程通路共享資料;
就如同使用臨界資源,就要先通過其信号量的申請。
- 任何時刻,僅允許一個程序在管程中執行某個内部過程。
管程如何實作同步?
對共享變量互斥操作:
管程的特點直接實作了該要求,程序一次一個進入管程調用内部過程操作共享變量。
管程的互斥通路完全由編譯程式在編譯時自動添上,無須程式員關心,能保證正确。
操作的同步控制:
靠條件變量的操作管理實作。
進入管程但不能擷取資源操作的過程将阻塞,并在滿足條件時被喚醒執行。
3.管程的同步控制(條件變量)
(主要作用就是程序同步的阻塞和喚醒控制)
局部于管程的變量有兩種:
- 普通變量
-
條件變量(用于控制程序阻塞和喚醒)
類似信号量變量,但不取具體值;相當于每個阻塞隊列的隊列指針。
對條件變量的操作需結合對普通變量的條件判斷,進而控制程序狀态。
*關于條件變量的操作
x.wait将執行程序挂到x對應的等待隊列上;
x.signal喚醒x相應的等待隊列上的一個程序。
signal操作,是重新啟動一個被阻塞的程序,但如果沒有程序被阻塞,則不産生任何效果
而信号量機制中的signal操作,若沒有需要喚醒的程序,必須要做的還有修改信号量變量的值。
4.管程的優缺點
優點
- 保證程序互斥地通路共享變量,并友善地阻塞和喚醒程序。管程可以以函數庫的形式實作。相比之下,管程比信号量好控制。
- 管程可增強子產品的獨立性:系統按資源管理的觀點分解成若幹子產品,用資料表示抽象系統資源,使同步操作相對集中,進而增加了子產品的相對獨立性
-
引入管程可提高代碼的可讀性,便于修改和維護,正确性易于保證:采用集中式同步機制。一個作業系統或并發程式由若幹個這樣的子產品所構成,一個子產品通常較短,子產品之間關系清晰。
缺點
- 大多數常用的程式設計語言中沒有實作管程,如果某種語言本身不支援管程,那麼加入管程是很困難的。
- 雖然大多數程式設計語言也沒有實作信号量,但可将P、V操作作為一個獨立的子例程或作業系統的管理程式調用加入
2.4 程序通信
程序通信是指程序之間的資訊交換。
- 一、低級通信——程序之間的互斥和同步
信号量機制是有效的同步工具,但作為通信工具缺點如下:
(1)效率低(通信量少)
(2)通信對使用者不透明(程式員實作,作業系統隻提供共享存儲器供代碼操作)
- 二、進階程序通信
使用者直接利用作業系統提供的一組通信指令,高效地傳送大量資料的通信方式。
作業系統隐藏了程序通信的細節,對使用者透明,減少了通信程式編制上的複雜性。
1.程序通信的類型
進階通信機制可歸結為四大類
-
共享存儲器系統(操作存儲區方式)
互相通信的程序共享某些資料結構或共享存儲區,程序之間能夠通過這些空間進行通信。
基于共享資料結構的通信方式(低級)
諸程序公用某些資料結構,借以實作諸程序間的資訊交換。
如生産消費問題,定義共享的資料結構:n個長度的有界緩沖區。
程式員:提供對公用資料結構的設定及對程序間同步的處理。
作業系統:提供共享存儲器。
特點:複雜、低效率,還隻适合傳遞相對少量的資料。
基于共享存儲區的通信方式(進階)
在存儲器中劃出了一塊共享存儲區,諸程序可通過對共享存儲區中資料的讀或寫來實作通信。
程序通信前先向系統申請獲得共享存儲區中的一個分區,并指定該分區的關鍵字;
若系統已經分給了其他程序,則将該分區的描述符傳回給申請者,申請者把獲得的共享存儲分區連接配接到本程序上;此後,便可像讀、寫普通存儲器一樣地讀、寫該公用存儲分區。多程序借助該區通信。
-
消息傳遞系統(發–收方式)
最廣泛使用的一種,程序間的資料交換,以格式化的消息為機關。屏蔽底層複雜操作。
單機:作業系統底層程式設計中的消息傳遞系統調用;
計算機網絡:消息稱為封包。程式員直接利用系統提供的一組通信指令(原語)進行通信。(④客戶機-伺服器系統)
如socket程式設計,利用函數庫的send、receive等指令即可實作網絡通信
-
管道通信(中間檔案方式)
所謂“管道”,是指用于連接配接一讀程序和一寫程序以實作通信的一個共享檔案,又名pipe檔案。
向共享檔案輸入的寫程序以字元流形式将大量的資料送入管道;而接收管道輸出的讀程序則從管道中接收(讀)資料。
首創于UNIX系統。其管道機制需提供三方面的協調能力:互斥、同步、确定對方是否存在。
-
Client-Server system
套接字(Socket)
一個套接字就是一個通信辨別類型的資料結構,包含了通信目的的位址,端口号,傳輸層協定、程序所在的網絡位址,以及針對C\S程式提供的不同系統調用(API函數)等。
系統中所有的連接配接都持有唯一的一對套接字及端口連接配接,進而友善地區分來自不同應用程式程序或網絡連接配接的通信,確定通信雙方間邏輯鍊路的唯一性。
遠端過程調用(遠端方法調用)
RPC 有很多正面的應用,比如網絡檔案系統NFS、Web Service等,也是網絡安全中容易被攻擊的技術。
Remote Procedure Call,遠端過程調用。也就是說,調用過程代碼并不是在調用者本地運作,而是要實作調用者與被調用者二地之間的連接配接與通信。
RPC的基本通信模型是基于Client/Server程序間互相通信模型的一種同步通信形式;它對Client提供了遠端服務的過程抽象,其底層消息傳遞操作對Client是透明的。
RPC應用開發步驟
對于RPC通信協定的生成,最簡單的方法是利用協定編譯工具:生成實作RPC協定的生成器rpcgen( C程式) ,Remotetea( java程式)。1.定義用戶端、伺服器端的通信協定(定義服務過程的名稱、調用參數的資料類型、傳回參數的資料類型、底層傳輸類型(UDP/TCP)等。 2.開發用戶端程式。 3.開發伺服器端程式。
2.消息傳遞通信的實作方法
1)直接通信方式
發送程序利用OS所提供的發送指令(原語),直接把消息發送給目标程序。此時,發送程序和接收程序都以顯式方式提供對方的辨別符。通常利用系統通信指令(原語):
Send(Receiver, message);
Receive(Sender, message);
2)間接通信方式
基于共享資料結構的實體用來暫存發送給目标程序的消息;接收程序則從該實體中,取出對方發送給自己的消息。通常把這種實體稱為信箱。
消息在信箱中可以安全地儲存,隻允許核準的目标使用者随時讀取。既可實時通信,又可非實時通信。
3.消息傳遞系統的實作
單機和網絡環境下的進階程序通信廣泛采用“消息傳遞”方式,需要考慮的問題:
-
通信鍊路的建立
計算機網絡環境下,用原語顯式建立/拆除鍊路
單機系統隻須利用系統原語,程序間鍊路由系統自動管理。
-
消息格式
單機系統,發送與接收程序在同一台機器,環境相同故格式簡單;
網絡環境下,受不同目标機器的環境和長距離資訊傳輸等因素的影響,消息格式較複雜,消息常是“大頭+正文”
-
同步方式(如何控制發送和接收的狀态)
即考慮平時閑着,還是平時忙碌?
發送程序阻塞、接收程序阻塞(無緩沖緊密同步)
發送程序不阻塞、接收程序阻塞(伺服器程式)
發送程序和接收程序均不阻塞(緩沖隊列)
4.消息緩沖隊列通信機制
美國Hansan提出,在RC 4000系統上實作。後被廣泛應用于本地程序通信
- 不需管理鍊路
- 定義簡單資料結構(亦即消息格式)
第二章 程式管理2-1-程式的基本概念2-2-程式控制2-3-程式同步2.4 程式通信2.5 線程
-
實作發送和接收的操作原語
發送原語:
接收原語第二章 程式管理2-1-程式的基本概念2-2-程式控制2-3-程式同步2.4 程式通信2.5 線程 第二章 程式管理2-1-程式的基本概念2-2-程式控制2-3-程式同步2.4 程式通信2.5 線程
2.5 線程
-
線程的屬性
多線程OS中,一個程序包括多個線程,每個線程都是利用CPU的基本機關。
輕型實體:隻需一點必不可少的、能保證獨立運作的資源。(TCB)
獨立排程和分派的基本機關:排程切換迅速且開銷小。
可并發執行
共享程序資源:同程序中的線程可共享相同的程序位址空間、已打開檔案、信号量機構等。
-
線程的資訊
狀态參數
辨別符、運作狀态、優先級、寄存器狀态、堆棧、專有存儲器、信号屏蔽等。
運作狀态
執行、就緒、阻塞
-
*多線程的應用
一個應用程式有多個任務或功能需要同時進行處理,就最适合多線程機制。
應用情況舉例:
網絡軟體,需要同時進行使用者界面響應、收資料、發資料。
網絡下載下傳工具:多線程下載下傳的下載下傳工具
-
*程式設計舉例
多線程程式設計過程是類似的:
可用win32 API編寫C風格程式
C的main既是規定了主線程的代碼。啟動程式時,系統根據main位址,啟動主線程。
在主線程代碼某處利用線程建立函數即可建立線程;給建立函數編寫線程功能代碼;
利用其他一系列函數使系統管理多個線程。
也可用封裝好的類庫,如JAVA,MFC
netgameserver.java public class netgameserver //主類 { static int usercount=1; public static void main(String args[])//main函數 {Socket client=null; ... new Serthread(client).start();}//啟動新線程 …} } class Serthread extends Thread //自定義的線程類 { String url="jdbc:odbc:userInfo"; Connection con; Statement stmt; Socket thclient; DataInputStream in=null; … public void run()//線程執行run函數-----> {System.out.println("a server thread started !"); boolean userlistfirshow=false; while(true)//開始監聽 { if(!userlistfirshow) ……} } }
-
*線程與程序的比較
排程:線程作為CPU排程的基本機關,而程序隻作為其它資源配置設定機關。
并發性:程序之間可以并發,實質上是不同程序中的兩個線程并發。一個程序的多個線程之間亦可并發。
擁有資源:程序間資源互相獨立;同一程序的各線程間共享。某程序内的線程在其它程序不可見
系統開銷:線程上下文切換在同程序環境下上下文切換要快得多。因為同程序内線程間共享記憶體位址和打開的檔案資源;
-
線程的管理
同步和通信機制
1)互斥鎖
比較簡單的,控制線程互斥通路資源;
适用于高頻度使用的關鍵共享資料和程式段;
unlock和lock兩個鎖操作原語;
2)條件變量
與互斥鎖一起使用
鎖保證互斥進入臨界區,但利用條件變量使線程阻塞
注意不滿足條件時,wait條件變量:
釋放互斥鎖
程序阻塞在條件變量指向隊列中
被喚醒後要重新再設互斥鎖
3)信号量
私用信号量(private samephore)
用于同程序的線程間同步,資料結構存放在應用程式的位址空間。屬于特定程序,OS感覺不到其存在。
公用信号量(public samephore)
用于不同程序間或不同程序中線程的同步,資料結構由OS管理,存放在受保護的系統存儲區。
線程的實作方式
-
1.核心線程KST(kernel-level thread)
依賴于核心,利用系統調用由OS核心在核心空間完成建立、撤消、切換等線程工作。
時間片配置設定給線程,是以多線程的程序獲得更多CPU時間。
優點
多處理器系統下可實作多線程并行
一個線程發起系統調用而阻塞,不會影響其它線程的運作
線程切換開銷遠小于程序切換
核心本身也采用多線程技術可提高系統執行速度和效率
缺點
使用者态運作線程,排程和管理線程則是核心态。模式的切換開銷大
-
2.使用者線程ULT(user-level thread)
無須利用系統調用,不依賴于OS核心。程序利用線程庫函數建立、同步、排程和管理控制使用者線程。
排程由應用軟體内部進行,通常采用非搶先式和更簡單的規則,也無需使用者态/核心态切換,速度比kst快。
優點
使用者線程的維護由應用程序完成;核心不了解使用者線程的存在;線程切換不需要核心特權;
使用者線程排程算法可針對應用優化;
多線程的實作與平台無關
缺點
一旦系統調用引起程序阻塞,則整個程序的所有線程都不能執行
以程序為機關配置設定cpu,所有在多處理器系統中沒有優勢
-
3.組合方式
核心支援多KST線程的管理,同時也允許使用者應用程式級的線程管理。