操作系统课件第6章-进程同步-教案提纲.docx
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第6章进程互斥与同步
多道程序系统中进程是并发执行的,这些进程之间存在着不同的相互制约关系,为了协调进程之间的相互制约关系,就需要实现进程的同步。
而互斥则是同步的一种特殊情况。
6.1进程互斥
1 •临界资源与临界区
(1)临界资源:把一次仅允许一个进程使用的资源称为临界资源。
许多物理设备都属于临界资源,如打印机,绘图机等。
述有许多共享变量,共享数据等也屈于临界资源。
(2)临界区:在每个进程中,访问临界资源的那段程序称为临界区。
2.互斥
在操作系统中,当一个进程进入临界区使用临界资源时,另一个进程必须等
待,当占用临界资源的进程退出临界区后,另一个进程才允许进入它的临界区
去访问此临界资源。
互斥:进程间的这种相互制约关系称为互斥。
为禁止两个进程同时进入临界区,可采用软件解决办法或者一个同步机构来协
调它们。
不论是软件还是同步机构都应遵循下述准则:
•当有若干个进程欲进入它的临界区时,应在有限时间内使进程进入临界区。
换言之,它们不应该相互阻塞而致使彼此都不能进入临界区;
•每次至多有一个进程处于临界区;
•进程在临界区内仅停留有限时间。
3.互斥的实现方法
(1)利用“锁”机制实现互斥
在同步机构屮,常用一个变量来代表临界资源的状态,并称它为锁。
通常用0表示资源可用,用1表示资源己被占用。
进程在使用临界资源之前,必须完成下列动作(即关锁操作):
(R考察锁位的值(是0还是1);
(b)如果原来的值为0,将锁值置成1 (表示占用资源);
(c)如果原来的值为1 (即资源己被占用),则返回(°)再考察。
当进程使用完资源后,应将锁值置成0,即称为开锁操作。
注:在测试锁的值和置锁的值为1这两步之间,锁值不得被其他进程所改变, 这是应该绝对保证的。
系统可提供在一个锁w 上的两个原语操作lock (w)和unlock (w)o 其算法描述如下:
算法lock 输入:锁变量w 输出:无
test : if (w= = l) goto test ; else w= 1 ;
算法unlock
输入:锁变量w 输出:无 {
w 二 0;
利用上锁原语和开锁原语,可以解决并发进程对临界资源访问的互斥问题。 下面给岀并发进程pl 和p2互斥使用临界资源的描述:
进程pl
进程p2
lock (w) 临界区 uniock(w) (2)利用P 、V 操作实现互斥
信号量的概念
♦信号量是一个确定的二元组(s, q);
♦其中S 是一个具有非负初值的整形变量,q 是一个初始状态为空的队 列; ♦整形变量s 表示系统中某类资源的数目:
•当其值大于0时,表示系统中当前可用资源的数目;
•当其值小于0时,其绝对值表示系统中因请求该类资源而被阻塞 的进程
数目。
♦除信号量的初值外,信号量的值仅能由P 操作和V 操作改变,操作 系统利用它
的状态对进程和资源进行管理。
P 、V 操作(有的书上叫Wait 操作与Signal 操作)
P 、V 操作为两条原语,信号量的值仅能由这两条原语来改变。 P 、V 操作成对出现。
lock(w) 临
界区
uniock(w)
p 、V 操作的定义:
P 操作:P 操作记为p (S),其中S 为一信号量,它执行时,主要完成以 下动作:
■ s=s -i ;
■若S20,则进程继续执行;
■否则若S 〈0,则进程被阻塞,并将该进程插入到信号量S 的等待
队列中。
说明:实际上,P 操作可以理解为分配资源的计数器;
或是使进程处于等待状态的控制指令。
V 操作:V 操作记为V (S),其中S 为一信号量,它执行时,主耍完成以 下动作:
■ S = S+1;
■ 若S>0,则进程继续执行;
■若SWO,则从信号量S 的等待队列屮移出第一个进程, 使其变为
就绪状态,然后返回原进程继续执行。
说明:实际上,V 操作可以理解为归还资源的计数器;
或是唤醒进程使其处于就绪状态的控制指令。
利用信号量及其P 、V 操作能方便地实现进程互斥。
设S 为一互斥信号量,其初值=1,表示某临界资源未被占用。利用信 号量实现并发进程Pl 、P2互斥访问临界区的描述如下:
进程p2
P(S) 临界区 V(S)
例:假如系统中有2台打印机可用,现有4个进程Pl, P2, P3, P4都在 不同时间里以不同数量申请该设备。下表列出使用P 、V 操作使这4 个进程互斥工作的
过程。
S 初值=2,表示共有2台打印机可用。
Pl 、P2、P3、P4为并发进程,本例假设第1个被调度的为P2。
进程pl P(S) 临
界区
V(S)
并发进程Pi工作序列0数字表示运行顺序当前处于
运行态进
程
所执行的
操作(P/V)
信号量s
的值 (初
值=2)
被唤醒
的进程
信号量s的
等待队列
并发执
行顺序
P1P2 P3 P4
■■•
•
•
•
•
•P2P1空(1)
(2) P(S)■(1)
P(S)
•
⑶
P(S)
•
(5)
P(S)
•
Pl P0空(2)
P3P-1P3(3)
■(6)
■
(4)
■
(7)
■P2P-2P3—P2(4)
V⑸■P(S)
■
V(S)
■
V(S)
■
P4P-3P3-*P2-*P4(5)
■■
■
■
■
■
(8)
P(S)
■
■Pl V-2P3P2—P4(6) ⑼
V(s)
P3V-1P2P4(7)
•
•
•
•P3p-2P4—P3(8) QD
V(S)
•
■
V(S)
•
P2V-1P4P3(9)
P4V0P3空(10) ■
■
■
■P2V1空(11)
P3V2空(12)
6.2进程同步
1.同步概念
进程同步是指多个相关进程在执行次序上的协调,这些进程相互合作,在一些关键点上可能需要相互等待,或互通消息。
例如:计算进程Calculate与打印进程Print公用一个缓冲区B;当B空
时,Calculate将计算结果不断送入B,直到B满,Calculate 等待B空;
当B满时,Print从B中取数据并打印输出,直到B空,Print等待B满;
如此循环,不断计算,不断打印。
使用P、V操作实现这一过程的同步: int Empty=l; AEmpty=l表示缓冲区
空,需要被计算进程填满*/ int Full = O; /*Full二1表示缓冲区满,需
要被打卬进程取空*/
/*初始化置Empth二1而Full二0就是要先计算再打印*/ main () { cobegin
calculate (); print ();
coe nd
}
calculatcO
{ while . T. do /*无限循环*/
{ P (Empty);
计算,将结果送入buffer,直到buffer满;V(Full);