经典的进程同步问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章 进程的描述与控制
2013-8-7
18
问题分析1
可把“顾客号数”看成是一个单缓冲区,顾客和柜员必 须互斥访问; CUSTOMER_NUM --单缓冲区 Semaphore counter; //柜台人员数,初值为n Semaphore customer; //当前等待的顾客数;初值为0; Semaphore mutex; //互斥对顾客号数的访问。初值为1
第三章 进程的描述与控制
2013-8-7
2
问题描述
通过一个有界缓冲区可以把一群生产者 p1,p2…,pm,和一群消费者Q1,Q2,…,Qn 联系起来。如图 只要缓冲区未满,生产者就可以把产品 送入缓冲区; 只要缓冲区未空,消费者就可以从缓冲 区中取走物品。
第三章 进程的描述与控制
2013-8-7
可把“顾客号数”看成是一个单缓冲区,顾客和柜员必 须互斥访问; CUSTOMER_NUM --单缓冲区 顾客号数 COUNTER_NUM --单缓冲区 柜台人员编号 Semaphore counter; //柜台人员数,初值为n Semaphore customer; //当前等待的顾客数;初值为0; Semaphore mutex; //互斥对顾客号数的访问。初值为1 Semaphore mutex2; //互斥对柜台人员编号的访问。初 值为1
第三章 进程的描述与控制 2013-8-7 17
【思考题】
银行的人民币存取业务问题 某银行的人民币存取业务由 n 个柜台工作人 员负责。每个顾客进入银行后先从抽号机中 取一个号,并且等着叫号。当一个柜台工作 人员空闲下来,就叫下一个号。 试用P,V 操作编写柜台工作人员进程和顾客进程的程 序。
int num;
REPEAT //叫号 P(customer); //等待顾客请求服务 叫号 为顾客服务; V(counter); UNTIL false; }
//服务完成
P(mutex); COSTOMER_NUM--; V(mutex);
}
第三章 进程的描述与控制 2013-8-7 20
问题分析2
第三章 进程的描述与控制
2013-8-7
19
思考题的解1
Semaphore counter; //柜台人员数,初值为n Semaphore customer ; //当前等待的顾客数;初值为0; Semaphore mutex; //互斥对顾客号数的访问。初值为1
顾客进程: { int num; //取号码 P(mutex); num = CUSTOMER_NUM++; V(mutex); //等待叫号 V(customer); //请求服务 P(counter); //等待号 接受服务; 离开; 柜台人员进程: {
第三章 进程的描述与控制
2013-8-7
14
begin repeat wait(So); //等待水果盘中放了桔子 取盘中桔子; signal(S); //置盘中已无水果标志 吃桔子; until false end Daughter :begin repeat wait(Sa); //等待水果盘中放了苹果 取盘中苹果; signal(S); //置盘中已无水果标志 吃苹果; until false end parend end Son:
第三章 进程的描述与控制 2013-8-7 15
【思考题】
若把问题改为: 爸爸只向盘中放苹果,妈妈只 向盘中放桔子,儿子专等吃盘中的桔子,女 儿专等吃苹果。 如何用P、V操作实现爸爸、儿子、女儿4个 并发进程的同步?
第三章 进程的描述与控制
2013-8-7
16
解:
信号量设置、儿子、女儿进程不变。只需修改父亲进程,并增加母亲进程。
第三章 进程的描述与控制
2013-8-7
7
采用AND信号量集解决生产者-消费者问题
Var mutex,empty,full: semaphore :=1,n,0; buffer: array[0, … , n-1] of item; //缓冲区 in,out: integer :=0,0; //输入、输出指针 begin parbegin 等待空缓冲区的数 producer:begin 目非0; repeat 等待无进程操作缓 … 冲区; 生产一个产品nextp; … swait(empty, mutex); Buffer(in):= nextp; //往Buffer [in]放产品 in = (in+1) mod n; ssignal(mutex, full); until false 允许其它进程操作 end 缓冲区;
第三章 进程的描述与控制
2013-8-7
21
思考题的解2
Semaphore counter; //柜台人员数,初值为n Semaphore customer ; //当前等待的顾客数;初值为0; Semaphore mutex,mutex2; //互斥对顾客号数,柜台人员编号的访问。初值为1
顾客进程: { int x; //取号码 P(mutex); x = CUSTOMER_NUM++; V(mutex); //等待叫号 V(customer); //请求服务 P(counter); //等待叫号 ACTION_CUSTOMER(x); //接受服务; } 柜台人员进程: { int x; REPEAT //叫号 P(customer); //等待顾客请求服务 P(mutex2); x = COUNTER_NUM; V(mutex2); ACTION_COUNTER(x); //为顾客服务 V(counter); //服务完成 UNTIL false; }
第三章 进程的描述与控制 2013-8-7 6
consumer:begin repeat wait(full); //等待已用缓冲区的数目非0 wait(mutex); //等待无进程操作缓冲区 nextc := Buffer(out) //从Buffer [out]取产品 out = (out +1) mod n; signal(mutex); //允许其它进程操作缓冲区 signal(empty); //增加空缓冲区的数目 消费nextc产品; until false end parend end
等待已用缓冲区的 数目非0; 等待无进程操作缓 冲区;
第三章 进程的描述与控制
2013-8-7
9
【思考题】
如果生产者消费者问题中的缓冲区是无界的, 又该如何解呢?
第三章 进程的描述与控制
2013-8-7
10
思考题的解
Var mutex, full: semaphore :=1, 0; //因无界,无需 empty信号量 buffer: array[0, …] of item; //无界缓冲区 in,out: integer :=0,0; //输入、输出指针 begin parbegin producer:begin repeat … 生产一个产品nextp; … //因无界,不必等待空缓冲区的数目非0 ! wait(mutex); //等待无进程操作缓冲区 Buffer(in):= nextp; //往Buffer [in]放产品 in = in+1; //因无界,无需考虑输入指针出界 signal(mutex); //允许其它进程操作缓冲区 signal(full); //增加已用缓冲区的数目 until false end
2.4 经典的进程同步问题
2.4.1 生产者/消费者问题 2.4.2 哲学家进餐问题 2.4.3 读者/写者问题
第三章 进程的描述与控制
2013-8-7
1
2.4.1 生产者/消费者问题
生产者消费者问题是一种同步问题的抽象 描述。计算机系统中的每个进程都可以消 费(使用)或生产(释放)某类资源。这 些资源可以是硬件资源,也可以是软件资 源。 当某一进程使用某一资源时,可以看作是 消费,称该进程为消费者。而当某一进程 释放某一资源时,它就相当于生产者。
增加已用缓冲区的 数目;
第三章 进程的描述与控制 2013-8-7 8
consumer:begin repeat swait(full, mutex); nextc := Buffer(out) //从Buffer [out]取产品 out = (out +1) mod n; signal(mutex, empty); 消费nextc产品; 允许其它进程操作 until false 缓冲区; end 增加空缓冲区的数 parend 目; end
Father :begin repeat wait(S); //等待水果盘中有空位置 将苹果放入盘中; signal(Sa); //置盘中放了苹果标志 until false end
Mother :begin repeat wait(S); //等待水果盘中有空位置 将桔子放入盘中; signal(So); //置盘中放了桔子标志 until false end
第三章 进程的描述与控制 2013-8-7 13
解:
设置三个信号量S,So,Sa ,初值分别为1,0,0。S 表示可否向盘中放水果; So可否取桔子; Sa可否取 苹果;
Var S,So,Sa: semaphore := 1,0,0; begin parbegin Father :begin repeat wait(S); //等待水果盘中有空位置 将水果放入盘中; if(是桔子) then signal(So); //置盘中放了桔子标志 else signal(Sa); //置盘中放了苹果标志 until false end
第三章 进程的描述与控制 2013-8-7 5
问题的解
Var mutex,empty,full: semaphore :=1,n,0; buffer: array[0, … , n-1] of item; //缓冲区 in,out: integer :=0,0; //输入、输出指针 begin parbegin producer:begin repeat … 生产一个产品nextp; … wait(empty); //等待空缓冲区的数目非0 wait(mutex); //等待无进程操作缓冲区 Buffer(in):= nextp; //往Buffer [in]放产品 in = (in+1) mod n; signal(mutex); //允许其它进程操作缓冲区 signal(full); //增加已用缓冲区的数目 until false end
第三章 进程的描述与控制 2013-8-7 11
consumer:begin repeat wait(full); //等待已用缓冲区的数目非0 wait(mutex); //等待无进程操作缓冲区 nextc := Buffer(out) //从Buffer [out]取产品 out = out +1; //因无界,无需考虑输出指针出界 signal(mutex); //允许其它进程操作缓冲区 //因无界,不必增加空缓冲区的数目 消费nextc产品; until false end parend end
3
有n个缓冲区的缓冲池
放消息 放产品
取产品 取消息
P
Q
......
i
j
n
n个缓冲区 (Buffer)
第三章 进程的描述与控制 2013-8-7 4
问题分析
为解决生产者消费者问题,应该设两个同步 信号量:一个说明空缓冲区的数目,用empty 表示,初值为有界缓冲区的大小N,另一个 说明已用缓冲区的数目,用full表示,初值为 0。 由于在此问题中有M个生产者和N个消费者, 它们在执行生产活动和消费活动中要对有界 缓冲区进行操作。由于有界缓冲区是一个临 界资源,必须互斥使用,所以,另外还需要 设置一个互斥信号量mutex,其初值为1。
第三章 进程的描述与控制
ห้องสมุดไป่ตู้
2013-8-7
12
【思考题】
桌上有一空盘,最多允许存放一只水果。爸 爸可向盘中放一个苹果或放一个桔子,儿子 专等吃盘中的桔子,女儿专等吃苹果。 试用P、V操作实现爸爸、儿子、女儿三个并 发进程的同步。
提示:设置一个信号量表示可否向盘中放水 果,一个信号量表示可否取桔子,一个信号 量表示可否取苹果。