第3章 进程同步与通信-3_第1页
第3章 进程同步与通信-3_第2页
第3章 进程同步与通信-3_第3页
第3章 进程同步与通信-3_第4页
第3章 进程同步与通信-3_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章进程同步与通信●进程同步与互斥

●经典进程同步问题

●管程

●AND信号量

●进程通信本章要点用信号量解决了很多同步和互斥问题,但在解决问题的过程中,同时还存在一些问题。例:两个进程P1和P2,它们共享两个局部变量R1和R2,因此设置两个互斥信号量mutex1和mutex2,并令它们初值为1。

//进程P1//进程P2P(mutex1);P(mutex2);

P(mutex2);P(mutex1);

两个进程处于僵持状态,都无法继续运行

这些问题的出现促使AND信号量的产生。●3.3AND信号量

AND信号量同步机制的基本思想:将进程在整个运行期间所需要的所有临界资源,一次性的全部分配给进程,待该进程使用完后再一起释放。只要尚有一个资源不能满足进程的要求,其他所有能分配给该进程的资源也都不予以分配。实现方法:在P操作上增加一个AND条件,故称为AND信号量。

AND信号量定义Swait(s1,s2,…,sn){if(s1>=1&&s2>=1&&…&&sn>=1){/*满足资源要求时*/ for(i=1;i<=n;i=i+1)

si=si-1;}else{/*某些资源不能满足要求时*/

block(si.queue)/*将进程投入第一个小于1的信号量的等待队列si.queue

*/; }}AND信号量定义AND信号量定义Ssignal(s1,s2,…,sn){for(i=1;i<=n;i=i+1)

{si=si+1; for(等待队列si.queue中的每个进程P) { if(进程P通过Swait中的测试) {/*通过检查,即资源够用*/

wackup(p);//唤醒进程P;}

else {/*未通过检查,即资源不够用*/ 进程P进入某等待队列继续等待;}

} }}用AND信号量解决哲学家进餐问题semaphorec[5]={1,1,1,1,1};voidphilosopher(inti)/*哲学家进程*/{while(true)

{Swait(c[i],c[(i+1)%5]); eat();/*进餐*/

Ssignal(c[i],c[(i+1)%5]); think();/*思考*/ }}●略●3.4管程●3.5进程通信信号量作为进程同步和互斥工具是卓有成效的。但作为通信工具就不够理想。原因为: ●效率低——一次只传一条消息。 ●通信对用户不透明。因此必须引入高级通信工具,解决进程之间大量的信息传递问题进程通信的类型●共享存储器系统●消息传递系统●直接通信方式●间接通信方式一对一多对一一对多多对多●管道通信●互斥能力●同步能力进程通信中的几个问题●通信链路的建立方式●显示建立链路●隐式建立链路●通信方向●单向通信●双向通信●通信链路连接方式

●点对点方式●广播方式●通信链路的容量●无容量通信链路●有容量通信链路●数据格式

●字节流●报文●同步方式●阻塞方式●不阻塞方式消息缓冲队列-数据结构定义//消息缓冲区定义structmessage_buffer{charsender[30]; /*发送进程标识符*/intsize; /*消息长度*/chartext[200]; /*消息正文*/

structmessage_buffer*next; //指向下一个消息缓冲区的指针};//PCB中有关通信的数据项structprocess_control{structmessage_buffer*mq;/*消息队列队首指针*/

semaphoremutex=1; /*消息队列互斥信号量,初值为1*/

semaphoresm=0;/*消息队列同步信号量,记录消息的个数.初值为0*/}消息缓冲队列-示意图//发送原语charreceiver[30];structmessage_buffera;voidsend(receiver,a){structmessage_bufferi;

structprocess_controlj;

getbuf(a.size,i);/*发送区a消息的长度申请一缓冲区i*/i.sender=a.sender;

i.size=a.size;i.text=a.text;

i.next=NULL;

getid(PCB_set,receiver,j);/*获得接收进程的进程标识符j*/

P(j.mutex);

Insert(j.mq,i);/*将消息缓冲区i挂到的消息队列j.mq上*/

V(j.mutex);

V(j.sm);}消息缓冲队列-发送原语消息缓冲队列-接收原语structmessage_bufferb;voidreceive(b){structmessage_bufferi;

structprocess_controlj;j=internal_name();/*接收进程的内部标识符*/

P(j.sm);

P(j.mutex);

remove(j.mq,i);/*从消息队列中摘下第一个消息缓冲区*/

V(j.mutex);b.sender=i.sender;b.size=i.size;b.text=i.text;}客户—服务器系统通

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论