Chapter2-進程的描述與控制

資源分配和獨立運行的基本單位


前趨圖
Pi->Pj 直接前趨,直接后繼
初始結(jié)點徘跪,終止結(jié)點
結(jié)點的重量->執(zhí)行時間


程序順序執(zhí)行的特征
順序性模软,封閉性雁仲,可再現(xiàn)性


程序的并發(fā)執(zhí)行
只有不存在前趨關(guān)系的程序之間才有可能并發(fā)執(zhí)行
特征:
間斷性,失去封閉性匙铡,不可再現(xiàn)性(運行環(huán)境會受到其它程序的影響)


進程
程序段图甜,相關(guān)數(shù)據(jù)段,PCB->進程實體->簡稱進程
PCB是進程存在的唯一標(biāo)志鳖眼。
但實際上進程是進程實體的運行過程(動態(tài)的概念),系統(tǒng)進行資源分配和調(diào)度的一個獨立單位嚼摩。
特征:
動態(tài)性钦讳,并發(fā)性,獨立性枕面,異步性


進程的狀態(tài)
就緒態(tài)愿卒,就緒隊列
執(zhí)行態(tài)
阻塞態(tài),正在執(zhí)行的進程由于發(fā)生某事件(I/O阻塞潮秘,申請緩沖區(qū)失敗等)琼开,根據(jù)阻塞原因不同會設(shè)置多個阻塞隊列。
創(chuàng)建態(tài)枕荞,申請空白PCB->填寫用于控制和管理進程的信息->分配運行時所必須的資源->轉(zhuǎn)入就緒狀態(tài)并插入就緒隊列
若資源尚未滿足就還是處于就緒態(tài)
終止態(tài)柜候,等待操作系統(tǒng)的善后處理(在操作系統(tǒng)中保留一個記錄,用于保存狀態(tài)碼和計時統(tǒng)計數(shù)據(jù)躏精,供其它進程收集渣刷,其它進程完成信息提取后,操作系統(tǒng)就刪除該進程)->將PCB清零矗烛,并將PCB空間返回系統(tǒng)
pic



用原語實現(xiàn)進程控制辅柴。
原語采用關(guān)中斷和開中斷指令來執(zhí)行。


掛起瞭吃,激活
靜止?fàn)顟B(tài)
引起掛起狀態(tài)的原因(掛起傾向于主動(不想讓它執(zhí)行)碌嘀,阻塞傾向與被動(它沒法執(zhí)行)):
終端用戶的需要,父進程請求歪架,負(fù)荷調(diào)節(jié)的需要股冗,操作系統(tǒng)的需要
pic


PCB的作用
1.作為獨立運行基本單位的標(biāo)志
2.能實現(xiàn)間斷性運行方式(CPU現(xiàn)場信息)
3.提供進程管理所需的信息(找到響應(yīng)的程序和數(shù)據(jù))
4.提供進程調(diào)度所需的信息(處于何種狀態(tài))
5.實現(xiàn)與其它進程的同步與通信


PCB中的信息
1.進程標(biāo)識符
外部標(biāo)識符(方便用戶(進程)對進程的訪問),內(nèi)部標(biāo)識符(方便系統(tǒng)對進程的使用牡拇,序號)魁瞪,
2.處理機狀態(tài)
也稱為處理機的上下文,主要由處理機的各種寄存器中的內(nèi)容組成
通用寄存器(用戶可視寄存器)惠呼,指令計數(shù)器导俘,程序狀態(tài)字,用戶棧指針
3.進程調(diào)度信息
進程狀態(tài)剔蹋,進程優(yōu)先級旅薄,進程調(diào)度所需的其它信息(與調(diào)度算法有關(guān),如進程已執(zhí)行的時間),事件(阻塞原因)
4.進程控制信息
程序和數(shù)據(jù)的地址少梁,進程同步和通信的機制(消息隊列指針洛口,信號量等),資源清單凯沪,鏈接指針(下一個進程的PCB的首地址)


PCB的組織方式
線性方式
鏈接方式
(執(zhí)行指針第焰,就緒隊列指針,阻塞隊列指針妨马,空閑隊列指令)
索引方式
(執(zhí)行指針挺举,就緒表指針->就緒索引表,阻塞表指針)


進程的創(chuàng)建
父進程烘跺,子進程湘纵,進程家族
子進程可以繼承父進程所擁有的資源
子進程被撤銷時要歸還資源
父進程撤銷時其子進程也全部撤銷
PCB中設(shè)置了家族關(guān)系表項
(Windows中不存在這樣的層次關(guān)系,而是用句柄來指示進程間的控制關(guān)系)

引起進程創(chuàng)建的事件
1.用戶登錄2.作業(yè)調(diào)度3.提供服務(wù)(前三個都是系統(tǒng)內(nèi)核創(chuàng)建)4.應(yīng)用請求(由用戶程序自己創(chuàng)建)

進程創(chuàng)建原語Create
申請空白PCB-》為新進程分配所需資源-》初始化PCB-》將PCB插入就緒隊列滤淳。


進程的終止
引起進程終止的事件
1.正常結(jié)束
2.異常結(jié)束
越界錯梧喷,保護錯,非法指令脖咐,特權(quán)指令錯铺敌,運行超時,等待超時文搂,算術(shù)運算錯适刀,I/O故障
3.外界干預(yù)
操作員或操作系統(tǒng)干預(yù),父進程請求煤蹭,父進程終止
撤銷原語
從PCB集合中找到終止進程的PCB-》若進程正在運行則剝奪CPU分配給其它進程-》終止其所有子進程-》歸還資源給父進程或系統(tǒng)-》刪除PCB


進程的阻塞與喚醒
向系統(tǒng)請求共享資源失敗笔喉,等待某種操作完成,新數(shù)據(jù)尚未到達(dá)硝皂,等待新任務(wù)的到達(dá)

進程常挚!調(diào)用阻塞原語block將自己阻塞
阻塞是進程自身的一種主動行為

有關(guān)進程調(diào)用喚醒原語wakeup


掛起
OS!調(diào)用掛起原語suspend
OS稽物!調(diào)用激活原語active



進程的同步
進程間的制約關(guān)系
1.間接相互制約關(guān)系(共享系統(tǒng)資源)——進程互斥問題(對臨界資源的訪問需要互斥的進行)
2.直接相互制約關(guān)系(相互合作)——進程同步問題


臨界資源
進入?yún)^(qū)->臨界區(qū)->退出區(qū)->剩余區(qū)
進程互斥地進入自己的臨界區(qū)


同步機制應(yīng)遵循的規(guī)則
空閑讓進奄毡,忙則等待,有限等待贝或,讓權(quán)等待(當(dāng)進程不能進入自己的臨界區(qū)時吼过,應(yīng)立即釋放處理機)


硬件同步機制
1.關(guān)中斷
簡單高效,不適用多處理機咪奖,只適用于操作系統(tǒng)內(nèi)核進程(因為關(guān)中斷開中斷只能在內(nèi)核態(tài)執(zhí)行)
2.Test-and-Set指令實現(xiàn)互斥
該指令使用硬件實現(xiàn)的盗忱,下面只是它的C語言描述

boolean TS(boolean *lock){
      boolean old;
      old=*lock;
      *lock=TURE;
      return old;
}
do{
  ...
  while TS(&lock); //當(dāng)lock為false時,說明空閑羊赵,才能跳出這個循
                   //環(huán)趟佃,并且被設(shè)置為Ture
  critical section;
  lock=FALSE; //退出區(qū)
  remainder section;
}while(TRUE);

不滿足讓權(quán)等待


3.Swap指令實現(xiàn)進程互斥
和上一個差不多,弄了個key代替old

void swap(boolean *a,boolean *b)
{
   boolean temp;
   temp=*a;
   *a=*b;
   *b=temp;
}
do{
  key=TRUE;
  do{
      swap(&lock,&key);
  }while(key!=FALSE);
  critical section;
  lock=FALSE;
  remainder section;
}while(TURE);

不滿足讓權(quán)等待


以上的方法,當(dāng)資源忙碌時闲昭,其它訪問進程必須不斷進行測試罐寨,處于“忙等”狀態(tài),不符合讓權(quán)等待原則序矩。


信號量機制
1.整型信號量 忙等
表示資源數(shù)目的整型量S
除了初始化外鸯绿,僅能通過兩個標(biāo)準(zhǔn)的原子操作P,V來訪問

wait(S){
     while(S<=0);
     S--;
}
signal(S){
     S++;
}

2.記錄型信號量 不用忙等
value表示資源數(shù)目簸淀,list表示用于鏈接所有等待訪問該資源的進程的鏈表指針

typedef struct{
   int value;
   struct process_control_block *list;
}semaphore;

wait(semaphore *S){
   S->value--;
   if(S->value<0) block(S->list);
   //S->value的絕對值表示該信號鏈表中已阻塞的進程的數(shù)目
}
signal(semaphore *S){
   S->value++;
   if(S->value<=0) wakeup(S->list);
}

可以用記錄型信號量實現(xiàn)系統(tǒng)資源的申請和釋放楞慈,進程互斥,進程同步啃擦。
S->value的初值為1則轉(zhuǎn)化為互斥信號量

互斥

semaphore mutex=1;
P1(){
     ...
     P(mutex);
     臨界區(qū)
     V(mutex);
     ...
}
P2(){
     ...
     P(mutex);
     臨界區(qū)
     V(mutex);
     ...
}

對于不同的臨界資源需要設(shè)置不同的互斥信號量。

同步
設(shè)置同步信號量S饿悬,初值為0
在前操作后面執(zhí)行V(S)
在后操作之前執(zhí)行P(S)

3.AND型信號量
需要獲得兩個或更多的共享資源
對若干個臨界資源的分配采取原子操作方式令蛉,要么全給,要么一個也不給


4.信號量集
資源分配下限值ti(Si<ti時就不分配了)狡恬,資源需求值di

Swait(S1,t1,d1,...,Sn,tn,dn);
Ssignal(S1,d1,...,Sn,dn);

幾種特殊情況
Swait(S,d,d)
Swait(S,1,1)記錄型信號量 S=1互斥信號量
Swait(S,1,0)相當(dāng)于一個開關(guān)珠叔,當(dāng)S>=1時允許多個進程進入,當(dāng)S=0時組織任何進程進入

信號量的應(yīng)用
1.利用信號量實現(xiàn)進程互斥

wait(mutex);
臨界區(qū)弟劲;
signal(mutex);

2利用信號量實現(xiàn)前趨關(guān)系



管程機制
信號量機制中祷安,大量的同步操作分散在各個進程中,不僅給系統(tǒng)管理帶來麻煩兔乞,還會因為同步操作的使用不當(dāng)造成死鎖汇鞭。
管程:(代表共享資源的數(shù)據(jù)結(jié)構(gòu))以及(由對該共享數(shù)據(jù)結(jié)構(gòu)實施操作的一組過程所組成的資源管理程序)共同構(gòu)成了一個操作系統(tǒng)的資源管理模塊。
確保每次僅有一個進程進入管程庸追,執(zhí)行這組過程霍骄,使用共享資源
特性:模塊化,抽象數(shù)據(jù)類型淡溯,信息掩蔽

進程在使用管程時可能會被阻塞或掛起读整,引入條件變量來指示其被阻塞或掛起的原因
x.wait:正在調(diào)用管程的進程因x條件需要被阻塞或掛起,調(diào)用x.wait將自己插入到x條件的等待隊列上咱娶,并釋放管程米间,直到x條件發(fā)生變化
x.signal:正在調(diào)用管程的進程發(fā)現(xiàn)x條件發(fā)生了變化,調(diào)用x.signal膘侮,重新啟動一個因x條件而阻塞或掛起的進程(重新啟動的這個進程可以等待當(dāng)且進程完成或阻塞屈糊,也可以換當(dāng)前進程等待)


經(jīng)典進程同步問題
p60


進程通信
1.共享存儲器系統(tǒng)
互斥訪問共享空間
(1)基于共享數(shù)據(jù)結(jié)構(gòu)的通信方式
如生產(chǎn)者-消費者中的有界緩沖區(qū)
僅適合傳遞少量數(shù)據(jù),屬于低級通信
(2)基于共享存儲區(qū)的通信方式
向系統(tǒng)申請獲得共享存儲區(qū)中的一個分區(qū)喻喳,然后附加到自己的地址空間另玖,讀寫完成后,再歸還給共享存儲區(qū)。高級通信谦去。

2.管道通信系統(tǒng)
pipe文件:連接一個讀進程和一個寫進程以實現(xiàn)它們之間通信的一個共享文件
字符流
互斥慷丽,同步,確定對方是否存在
某一時間段內(nèi)只能實現(xiàn)單向傳輸
沒寫滿就不允許讀鳄哭,沒讀空就不允許寫
一旦數(shù)據(jù)被讀出要糊,該數(shù)據(jù)就被管道拋棄了,這意味著讀進程只能有一個妆丘。

3.消息傳遞系統(tǒng)
以格式化的消息為單位
將通信的數(shù)據(jù)封裝在消息中
利用操作系統(tǒng)提供的一組通信命令(原語)
屬于高級通信方式
直接通信方式
1)對稱尋址方式 顯式提供雙方的標(biāo)識符
send(receiver, message);
receive(sender, message);
2)非對稱尋址方式
send(P, message);
receive(id, message);接收來自任何進程的消息锄俄,id變量作為完成通信后的返回值指示發(fā)送方的id或名字

定長消息格式/變長消息格式
單向/雙向通信鏈路(建立連接)

間接通信方式(郵箱)
send(mailbox, message);
receive(mailbox, message);
私用/公用/共享郵箱

直接消息傳遞系統(tǒng)實例
消息緩沖隊列機制
消息緩沖區(qū)

typedef struct message_buffer{
   int sender;
   int size;
   char *text;
   struct message_buffer *next; //指向下一個消息緩沖區(qū)
}

在PCB中增加

struct message_buffer *mq; //消息隊列隊首指針(放要接收的消息緩沖區(qū))
semaphore mutex; //消息隊列互斥信號量
semaphore sm; //消息隊列資源信號量

發(fā)送原語

void send(receiver, a){  //receiver為接收進程標(biāo)識符,a為發(fā)送區(qū)首址
   getbuf(a.size, i);  //根據(jù)a.size申請消息緩沖區(qū)
   i.sender=a.sender;
   i.size=a.size;
   copy(i.text, a.text);
   i.next=0;
   getid(PCBset, receiver.j);  //獲得接收進程內(nèi)部的標(biāo)識符
   wait(j.mutex);
   insert(&j.mq, i); //掛到消息隊列上去
   signal(j.mutex);
   signal(j.sm); //sm標(biāo)識隊列中有沒有消息
}

接收原語

void receive(b){
    j=internal name;
    wait(j.sm);   //沒有消息就等著
    wait(j.mutex);
    remove(j.mq, i);
    signal(j.mutex);
    b.sender=i.sender;
    b.size=i.size;
    copy(b.text, i.text);
    releasebuf(i);  //釋放消息緩沖區(qū)
}

4.客戶機-服務(wù)器系統(tǒng)


線程
比進程更小的基本單位
減少程序在并發(fā)執(zhí)行時所付出的時空開銷勺拣,使OS具有更好的并發(fā)性奶赠。
進程的兩個特征
1調(diào)度和分配的基本單位
2擁有資源的基本單位
現(xiàn)在將這兩個特征分開,作為擁有資源的基本單位的進程不再作為調(diào)度和分派的基本單位药有,因為擁有資源會導(dǎo)致調(diào)度和分配開銷很大
線程作為調(diào)度和分派的基本單位
線程控制塊TCB
還可以將一個進程的多個線程分配到不同處理機上
執(zhí)行狀態(tài)毅戈,就緒狀態(tài),阻塞狀態(tài)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愤惰,一起剝皮案震驚了整個濱河市苇经,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宦言,老刑警劉巖扇单,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奠旺,居然都是意外死亡蜘澜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門凉倚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兼都,“玉大人,你說我怎么就攤上這事稽寒“绫蹋” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵杏糙,是天一觀的道長慎王。 經(jīng)常有香客問我,道長宏侍,這世上最難降的妖魔是什么赖淤? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮谅河,結(jié)果婚禮上咱旱,老公的妹妹穿的比我還像新娘确丢。我一直安慰自己,他們只是感情好吐限,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布鲜侥。 她就那樣靜靜地躺著,像睡著了一般诸典。 火紅的嫁衣襯著肌膚如雪描函。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天狐粱,我揣著相機與錄音舀寓,去河邊找鬼。 笑死肌蜻,一個胖子當(dāng)著我的面吹牛互墓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒋搜,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼轰豆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了齿诞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骂租,失蹤者是張志新(化名)和其女友劉穎祷杈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渗饮,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡但汞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了互站。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片私蕾。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胡桃,靈堂內(nèi)的尸體忽然破棺而出踩叭,到底是詐尸還是另有隱情,我是刑警寧澤翠胰,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布容贝,位于F島的核電站,受9級特大地震影響之景,放射性物質(zhì)發(fā)生泄漏斤富。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一锻狗、第九天 我趴在偏房一處隱蔽的房頂上張望满力。 院中可真熱鬧焕参,春花似錦、人聲如沸油额。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悔耘。三九已至讲岁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衬以,已是汗流浹背缓艳。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留看峻,地道東北人阶淘。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像互妓,于是被迫代替她去往敵國和親溪窒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容