程序同步
一、程序同步的基本概念
1.臨界資源
一次僅允許乙個程序使用的資源稱為臨界資源。
臨界資源的訪問:
dowhile(true)
2.同步同步亦稱直接制約關係,是指為完成某種任務而建立的兩個或多個程序,這些程序因為需要 在某些位置上協調它們的工作次序而等待、傳遞資訊所產生的制約關係。程序間的直接制約關係源於它們之間的相互合作。
3.互斥互斥也稱間接制約關係。當乙個程序進入臨界區使用臨界資源時,另乙個程序必須等待,當 占用臨界資源的程序退出臨界區後,另一程序才允許去訪問此臨界資源
同步機制應遵循的準則空閒讓進
忙則等待
有限等待:對於請求訪問的程序,應保證能在有限的時間內進入臨界區。
讓權等待:程序不能進入臨界區時,應立即釋放處理器,防止程序忙等待。
忙等狀態:
當乙個程序正處在某臨界區內,任何試圖進入其臨界區的程序都必須進入**連續迴圈,陷入忙等狀態。連續測試乙個變數直到某個值出現為止,稱為忙等。
讓權等待:
當程序不能進入自己的臨界區時,應立即釋放處理機,以免程序陷入「忙等」狀態~(受惠的是其他程序)
二、實現臨界區互斥的基本方法
1.軟體實現方法
1)單標誌法
用公共變數turn標誌該誰進入臨界區
//p0程序
while(trun != 0);
critical section;
turn=1;
remainder section;
//p1程序
while(turn != 1);
critical section;
turn=0;
remainder section;
這個方法的缺點是兩個程序必須交替進去臨界區,如果乙個程序不進入的話,turn就無法再被改變了,就會導致另乙個程序一直等待下去。
2)雙標誌法先檢查:
設定了兩個標誌,分別表示兩個程序的狀態,可以不用交替執行,可以連續使用。
//pi程序
while(flag[j]);//1
flag[i]=true;//3
critical section;
flag[i]=false;
remainder section;
//pj程序
while(flag[i]);//2
flag[j]=true;//4
critical section;
flag[i]=false;
remainder section;
但是也有缺點,比如程序 i 執行語句1,先判斷程序 j 沒有要進入臨界區。同時 j 也在執行語句2,它覺得 i 也沒有去臨界區的意思。於是 i 把自己的flag置為了ture,此時 j 在判斷時 i 還沒來得及置標誌,所以 j 也把自己置成了true,然後此時有兩個程序都在臨界區,違背了基本原則。
3)雙標誌法後檢查
//pi程序
flag[i]=true;
while(flag[j]);
critical section;
flag[i]=false;
remainder section;
//pj程序
flag[j]=true;
while(flag[i]);
critical section;
flag[i]=false;
remainder section;
這個類似先檢查,如果 j i 都同時上來把自己置為了true,則會相互無線等待下去,造飢餓現象。
4)peterson's algotithm
//pi程序
flag[i]=true;
turn=j;
while(flag[i]&&turn==j)
critical section,
flag[i]=false;
remainder section;
//pj程序
flag[i]=true;
turn=j;
while(flag[i]&&turn==j);
critical section;
flag[i]=false;
remainder section;
乙個標誌自己的狀態(申明),乙個標誌該誰使用臨界區(鑰匙)。
也就是只有一把鑰匙。就是雙方想執行的時候都要把鑰匙先給對方,所以無論是誰先申明還是同時申明,最後鑰匙是在乙個人手裡的,然後在進入臨界區之前判斷,如果對方想要進入而且擁有鑰匙,我就等待。如果對方沒有鑰匙或者不想進入,那我就進入。不可能出現兩個人都有想進入兩個人都有鑰匙的情況(鑰匙只有一把),解決了死等的問題。
如果此時 j 執行完了,不再執行了。while 就會放開 i ,i 可以繼續執行。即使後 j 都不再執行力,i 也不會再次被 while 捕捉。解決了交替執行的問題。
2.硬體實現的方法
1)中斷遮蔽法
進入臨界區後禁止一切中斷發生。這種方法限制了處理機交替執行程式的能力,因此執行的效率會明顯降低。對核心來說,在 它執行更新變數或列表的幾條指令期間,關中斷是很方便的,但將關中斷的權力交給使用者則很不明智,若乙個程序關中斷後不再開中斷,則系統可能會因此終止。
2)硬體指令的方法
testandset指令:原子操作,執行過程不允許被中斷,其功能是讀出某標誌後置為真。
boolean testandset(boolean *lock) semaphone
void wait(semaphore s){
s.value- -;//申請乙個資源,老闆我要乙個小熊餅乾
if(s.value<0){//如果該類資源不夠,老闆說小熊餅乾賣完了
add this process to s.l;//加入等待佇列,老闆說幫你預定乙個你明天來拿
block(s.l);//block原語,自我阻塞,釋放處理器資源,回家去等
void signal(semaphonre s){
s.value++;//釋放乙個資源,有個顧客退回了乙個小熊餅乾
if(s.value<==0){//老闆發現還有人在等
remove a process p from s.l;//打**叫他來拿了
wakeup(p);//喚醒程序,來店裡了
3.利用訊號量實現同步
semahore s=0;//初始化訊號量
p1(){
x;//語句x
v(s);//告訴p2語句x已經完成
p2(){
p(s);//看看x是不是已經完成
y;//無誤,執行y
4.利用訊號量實現互斥
semaphore s=1;//初始化訊號量
p1(){
..p(s);//上鎖
程序p1臨界區
v(s);//開鎖
p2(){
p(s);//上鎖
程序p2的臨界區;
v(s);//開鎖
5.實現前驅關係
semaphore a1=a2=b1=b2=c=d=e=0;
s1(){
v(a1);
v(a2);
s2(){
p(a1);
v(b1);
v(b2);
s3(){
p(a2);
v(c);
s4(){
p(b1);
v(d);
s5(){
p(b2);
v(e);
s6(){
p(c);
p(d);
p(e);
6.分析程序同步和互斥問題的方法步驟
1)分析關係
2)整理思路
3)設定訊號量
四、管程
1.定義代表共享資源的資料結構 ,以及由對該共享資料結構實施操作的一組過程所組成的資源管理程式,稱為管程( monitor )。
管程由四個部分組成:
1)名稱
2)區域性於管程內部的共享資料結構資料說明
3)對該資料結構進行操作的一組過程
4)對區域性於管程內部的共享資料設定初始值的語句
例如monitor demo{
//定義共享資料結構
共享資料結構s;
//初始化資料結構
init_code(){
s=5;//初始資源
take_away(){
對共享資料結構x的一系列處理;
s--;
give_back(){
對共享資料結構x的一些系列處理;
s++;
2.條件變數
當乙個程序進入管程後被阻塞,如果一直阻塞的原因沒有解除,則不會釋放管程則其他程序不能進入管程。
monitor demo{
共享資料結構;
condition x;
init_code(){
take_away(){
if(s<=0) x.wait();//資源不夠,在x上阻塞等待
資源足夠,分配資源,處理;
give_back(){
歸還資源,做處理;
if(有程序在等待)x.signal;//喚醒乙個阻塞程序
作業系統飢餓現象 作業系統面試題目總結
程序和執行緒的關係 程序與執行緒的區別 為什麼程序上下文切換比執行緒上下文切換代價高?程序切換分兩步 對於linux來說,執行緒和程序的最大區別就在於位址空間,對於執行緒切換,第1步是不需要做的,第2是程序和執行緒切換都要做的 切換的效能消耗 執行緒和程序的區別是什麼?www.zhihu.com 同...
作業系統複習 作業系統介面
1 作業系統為了方便使用者方便的使用向使用者提供了兩類介面 使用者介面 聯機使用者介面與離線使用者介面 和程式介面 2 程式介面是os專門為使用者程式設定的,它是使用者程式取得os服務的唯一介面。3 系統呼叫提供了使用者程式和作業系統之間的介面,應用程式通過系統呼叫實現與os的通訊並取得服務。由此可...
作業系統複習
l 計算機系統把資源管理和控制程式執行的功能集中組成一種軟體,稱為 作業系統 是系統軟體 l作業系統的兩個設計目標 1 使計算機系統使用方便 2 使計算機系統能高效地工作 擴充硬體的功能,使硬體的功能發揮得更好 使使用者合理共享資源,防止相互干擾 以檔案形式管理軟體資源,保證資訊的安全和快速訪問。l...