Chinaunix首页 | 论坛 | 博客
  • 博客访问: 532604
  • 博文数量: 150
  • 博客积分: 5010
  • 博客等级: 大校
  • 技术积分: 1861
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-17 00:19
文章分类

全部博文(150)

文章存档

2011年(1)

2009年(14)

2008年(135)

我的朋友

分类: 项目管理

2008-04-05 20:31:11

设某台机挂有两个I/O通道:分别挂一台输入机和一台打印机。卡片机上有一叠数据卡片,现在要把这些数据逐一输入到缓冲区B1,然后再复制到缓冲区B2,并在打印机上打印出来。
问:系统可设哪些进程来完成这个任务?用P-V原语写这些进程的同步算法。


解:由上图可见,系统可设3个进程:输入进程、复制进程、打印进程;分别用进程R、进程C、进程P来表示。
  这些进程之间的相互制约关系:
  R受C的约束;C受R、P的约束;P受C的约束。
  设4个信号量:S1=1,S2=0,S3=1,S4=0
  同步算法如下:



========================================================
P.V操作讨论

1) 信号量的物理含义:
   S>0表示有S个资源可用
   S=0表示无资源可用
   S<0则| S |表示S等待队列中的进程个数
   P(S):表示申请一个资源
   V(S)表示释放一个资源。信号量的初值应该大于等于0

2)   P.V操作必须成对出现,有一个P操作就一定有一个V操作
     当为互斥操作时,它们同处于同一进程
     当为同步操作时,则不在同一进程中出现
     如果P(S1)和P(S2)两个操作在一起,那么P操作的顺序至关重要,一个同步P操作与一个互斥P操作在一起时同步P操作在互斥P操作前
     而两个V操作无关紧要
====================================
%E5%9B%BE%E7%89%874.png?imgmax=400


经典的生产者─消费者问题







同步问题:
         P进程不能往“满”的缓冲区中放产品,设置信号量为S1

     Q进程不能从“空”的缓冲区中取产品,设置信号量S2

P:                             Q:
while  (true)  {                 while  (true)  {
     生产一个产品;           P(s2);
     P(s1) ;                         从缓冲区取产品;
     送产品到缓冲区;       V(s1);
     V(s2);                           消费产品;
};                                      };

S1初值为1,S2初值为0

==========================
生产者-消费者问题

生产者-消费者(Producer-Consumer)问题是著名的进程同步问题。它描述一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。以下用信号量解决生产者-消费者问题。
假设缓冲池中有n个缓冲区,每个缓冲区存放一个消息,可利用互斥信号量mutex使诸进程对缓冲池实现互斥访问;利用empty和full计数信号量分别表示空缓冲及满缓冲的数量。又假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一个消息。



其中,mutex,empty,full的初始值分别为1,n,0;


阅读(1641) | 评论(0) | 转发(0) |
0

上一篇: C语言宏定义技巧

下一篇:读者写者问题

给主人留下些什么吧!~~