欢迎来到天天文库
浏览记录
ID:55339253
大小:2.12 MB
页数:99页
时间:2020-05-14
《计算机操作系统(王永茂)操作系统幻灯片.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、考点一:使用信号量解决问题的关键步骤:1)信号量的设置;2)给信号量赋初值(常用的互斥和同步信号量值的大小);3)P、V操作安排的位置。注意:1)若有多个信号量,信号量的P操作的顺序不能任意,通常先对资源信号量执行P操作,然后对互斥信号量进行P操作,而V操作的顺序可以任意;2)互斥信号量其P和V操作通常在同一个进程内;而资源信号量的P和V操作通常分布在不同的进程内。利用信号量实现进程互斥Varmutex:semaphore:=1;beginparbeginprocess1:process2:parendprocess1、2:beginrepeatwait(mutex);criticalsec
2、tionsignal(mutex);remaindersectionuntilfalse;end利用信号量实现进程的同步PQBuffer1假设有一个输入进程P和一个计算进程Q,共享一个缓冲区,输入进程输入数据,计算进程处理数据,如何实现二者的同步。Varempty,full:semaphore:=1,0;P:wait(empty);Q:wait(full);输入数据;处理数据;signal(full);signal(empty);利用信号量实现进程的同步(扩展1)假设有一个输入进程P可以接收两种数据:奇数和偶数,计算进程Q1负责处理奇数数据,计算进程Q2负责处理偶数数据。Varempty,f
3、ull1,full2:semaphore:=1,0,0;P:wait(empty);Q1:wait(full1);Q2:wait(full2);输入数据;处理奇数;处理偶数;if(是奇数)signal(empty);signal(empty);signal(full1);elsesignal(full2);Buffer1PQ1Q2利用信号量实现进程的同步(扩展2)假设有有两个输入进程P1和P2分别接收奇数和偶数,计算进程Q1和Q2分别负责处理奇数和偶数数据。Varempty,full1,full2:semaphore:=1,0,0;P1:wait(empty);P2:wait(empty);
4、Q1:wait(full1);Q2:wait(full2);输入奇数;输入偶数;处理奇数处理偶数signal(full1);signal(full2);signal(empty);signal(empty);Buffer1P1Q1Q2P2利用信号量实现进程的同步(扩展3)Buffer1假设进程P负责数据的输入,进程K负责数据的加工,进程Q负责数据的打印。PQKVarempty,full1,full2:semaphore:=1,0,0;P:wait(empty);K:wait(full1);Q:wait(full2);输入数据;取数据打印数据;signal(full1);数据加工;signal
5、(empty);signal(full2);利用信号量实现进程的同步(练习)吃水果问题:假设桌上有一个空盘子,一次仅允许放一个水果,利用信号量的P,V操作解决下列同步问题:1)父亲负责放水果,儿子负责吃水果;2)父亲负责水果(苹果或桔子),儿子吃苹果,女儿吃桔子;3)父亲负责放苹果,母亲负责放桔子,儿子吃苹果,女儿吃桔子;4)父亲负责放苹果,母亲负责削皮,儿子负责吃苹果。思考思考:有三个进程:进程get:从输入设备上不断读数据,并存入缓冲区Buffer1;进程copy:不断将缓冲区Buffer1的内容复制到缓冲区Buffer2;进程put:则不断将Buffer2的内容在打印机上输出,getc
6、opyputBuffer1Buffer23个进程的协同工作为了使三个进程并发工作以大大加快执行速度,又保证打印结果和输入结果一致,三个进程之间必须协调工作。★设四个信号量S1、S2、S3、S4,令:S1:初值为1,表示缓冲区Buffer1空闲的单元数;S2:初值为0,表示缓冲区Buffer1数据的个数;S3:初值为1,表示缓冲区Buffer2空闲的单元数;S4:初值为0,表示缓冲区Buffer2中数据个数。进程get进程copy进程putP(S1);P(S2);P(S4);从输入设备向P(S3);将缓冲区Buffer2缓冲区Buffer1将Buffer1内容内容在打印机上输出;中写数据;复制
7、到Buffer2V(S3);V(S2);V(S1);V(S4);………………3个进程之间的同步信号量的应用-实现前趋关系方法:若图中存在结点S1指向结点S2的有向边,表示进程P1中的程序段S1应该先执行,而进程P2中的程序段S2后执行。设置一个信号量s,初值为0,将signal(s)放在S1后面,而在S2前面先执行wait(s)。进程P1的语句序列为:S1;signal(s)进程P2的语句序列为:wait(
此文档下载收益归作者所有