经典进程同步问题_第1页
经典进程同步问题_第2页
经典进程同步问题_第3页
经典进程同步问题_第4页
经典进程同步问题_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、1 在多道程序环境下,进程同步问题是十在多道程序环境下,进程同步问题是十分重要的,也是相当有趣的问题,因而吸引分重要的,也是相当有趣的问题,因而吸引了不少学者对它进行研究。了不少学者对它进行研究。 其中较有代表性的是其中较有代表性的是“生产者生产者消费消费者问题者问题”、“读者读者写者问题写者问题”、“哲学哲学家进餐问题家进餐问题”等。等。2问题的描述:问题的描述:3需要解决的问题:需要解决的问题:1、对缓冲池的互斥访问,即只有一个进、对缓冲池的互斥访问,即只有一个进程访问缓冲区。程访问缓冲区。2、对生产、消费进程的同步,即:有产、对生产、消费进程的同步,即:有产品时才能消费,无产品时,必须先

2、生产后品时才能消费,无产品时,必须先生产后消费;有空间时才能生产,空间满时,必消费;有空间时才能生产,空间满时,必须先消费再生产。须先消费再生产。4信号量的设置:信号量的设置:1、一个互斥信号量、一个互斥信号量mutex,用于实现对共,用于实现对共享缓冲区的互斥访问,初始值为享缓冲区的互斥访问,初始值为1。2、两个同步信号量,分别表示可用资源数:、两个同步信号量,分别表示可用资源数:Empty:表示空缓冲区的个数,初始值为:表示空缓冲区的个数,初始值为nFull:表示装有消息的缓冲区的个数,初:表示装有消息的缓冲区的个数,初始值为始值为0,(一个缓冲区中放一条消息),(一个缓冲区中放一条消息)

3、5一、利用记录型信号量一、利用记录型信号量解决生产者解决生产者消费者问题消费者问题数据结构:数据结构:Var mutex, empty, full:semaphore =1,n,0; /定义信号量并赋初值定义信号量并赋初值 buffer:array0, , n-1 of item; /定义缓冲区定义缓冲区 in, out: integer =0, 0; /定义存取指针的初始位置定义存取指针的初始位置6Proceduer: /生产者进程生产者进程begin repeat 生产一件产品生产一件产品; wait(empty); wait(mutex); bufferin:=nextp; in =(i

4、n+1) mod n; signal(mutex); signal(full); until false;endempty:=empty-1;if empty 0 then block;mutex:=mutex-1;if mutex 0 then block;full:=full + 1;if full =0 then wakeup;mutex:=mutex+1;if mutex =0 then wakeup;7consumer:/消费者进程消费者进程begin repeat wait(full); wait(mutex); nextc:=bufferout; out =(out+1) mod

5、 n; signal(mutex); signal(empty); 消费这件产品消费这件产品; until false;end full:=full - 1;if full 0 then block;mutex:=mutex-1;if mutex0 then block;empty:=empty+1;if empty=0 then wakeup;mutex:=mutex+1;if mutex=1 and mutex=1 then empty:=empty-1;mutex:=mutex-1;mutex:=mutex+1;full:=full + 1;13consumer:/消费者进程消费者进程b

6、egin repeat Swait(full,mutex); nextc:=bufferout; out =(out+1) mod n; Ssignal(mutex,empty); 消费这件产品消费这件产品; until false;end if full =1 and mutex=1 then full:=full - 1; mutex:=mutex-1;mutex:=mutex+1;empty:=empty+1;143利用管程解决生产者利用管程解决生产者消费者问题消费者问题 在利用管程方法来解决生产者在利用管程方法来解决生产者消费者问题时,消费者问题时,首 先 便 是 为 它 们 建 立

7、一 个 管 程 , 并 命 名 为首 先 便 是 为 它 们 建 立 一 个 管 程 , 并 命 名 为ProclucerConsumer,或简称为,或简称为PC。其中包括两个。其中包括两个过程:过程:(1) put(item)过程。生产者利用该过程将自己生过程。生产者利用该过程将自己生产的产品投放到缓冲池中,并用整型变量产的产品投放到缓冲池中,并用整型变量count来表来表示在缓冲池中已有的产品数目,当示在缓冲池中已有的产品数目,当countn时,表示时,表示缓冲池已满,生产者须等待。缓冲池已满,生产者须等待。(2) get(item)过程。消费者利用该过程从缓冲池过程。消费者利用该过程从缓

8、冲池中取出一个产品,当中取出一个产品,当count0时,表示缓冲池中已无时,表示缓冲池中已无可取用的产品,消费者应等待。可取用的产品,消费者应等待。 15PC管程可描述如下:管程可描述如下:type producer-consumer=monitorVar in,out,count: integer;buffer: array0, , n-1 of item;notfull,notempty:condition;procedure entry put(item)beginif count=n then notfull.wait;buffer(in):=nextp;in:=(in+1) mod

9、n;count:=count+1;if notempty.queue then notempty.signal;end 16procedure entry get(item)beginif count=1 then L :=L - 1;if mx =1 then mx :=mx - 0; /即即mx值不变值不变L :=L + 1;35writer: repeatSwait(mx,1,1;L,RN,0);writing operation; Ssignal(mx,1); until false ;if mx =1 and L =RN then mx:=mx - 1; L:=L-0;/即在读进程数

10、不变即在读进程数不变mx :=mx + 1;36 Swait(mx,1,0) Swait(mx,1,0)语句起着开关的作用。语句起着开关的作用。只要无只要无writerwriter进程进入写,则进程进入写,则mxmx=1=1,readerreader进程就都可以进入读。一旦有进程就都可以进入读。一旦有writerwriter进程进进程进入写时,入写时,mxmx=0=0,则任何,则任何readerreader进程就都无法进程就都无法进入读。进入读。 Swait(mx,1,1,L,RN,0)Swait(mx,1,1,L,RN,0)语句表示:仅语句表示:仅当既是无当既是无writerwriter进程

11、在写(进程在写(mxmx=1=1)、又无)、又无 readerreader进程在读(进程在读(L=RNL=RN)时,)时,writerwriter进程才进程才能进入临界区写。能进入临界区写。373839数据结构:数据结构: Var mutex, avail-n, avail-s:semaphore:= 0, m, m;/mutex是互斥信号量,是互斥信号量,用于实现对共享缓冲区用于实现对共享缓冲区的互斥访问,初始值为的互斥访问,初始值为1 /avail-n表示允许向北行的车辆数,表示允许向北行的车辆数,初始值为初始值为m/avail-s表示允许向南行的车辆数,表示允许向南行的车辆数,初始值为初始值为m40South:Begin

温馨提示

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

评论

0/150

提交评论