进程同步问题实例.ppt

进程同步问题实例

操作系统概念 进程同步问题实例 本章主要内容 经典同步问题 生产者-消费者问题:缓冲区问题 嗜睡理发师问题 吸烟者问题 吃水果问题 1 经典同步问题 有限缓冲问题 读者-作者问题 哲学家进餐问题 有限缓冲问题(生产者-消费者问题) do { … produce an item in nextp … wait(empty); wait(mutex); … add nextp to buffer … signal(mutex); signal(full); } while (1); do { wait(full); wait(mutex); … remove an item from buffer to nextc … signal(mutex); signal(empty); … consume the item in nextc … } while (1); 读者-作者问题 一个数据对象可以为多个并发进程所共享。其中有的进程可能只需要读共享对象的内容,而其他进程可能要更新共享对象(即读和写)。 将只对读感兴趣的进程称为读者 其他则称为作者 第一读者-作者问题 仅当无读者等待时,才允许写者执行 第二读者-作者问题 在读者与作者同时申请资源的时候,写者优先。 第一读者-作者问题 wait(wrt); … writing is performed … signal(wrt); wait(mutex); readcount ++; if (readcount == 1) wait(wrt); signal(mutex); … reading is performed … wait(mutex); readcount --; if (readcount == 0) signal(wrt); signal(mutex); 哲学家就餐问题 共享数据 semaphore chopstick[5]; 哲学家i结构 do { wait(chopstick[i]); wait(chopstick[(I + 1) % 5]); … eat … signal(chopstick[i]); signal(chopstick[(I + 1) % 5]); … think … } while (1); 2 缓冲区问题(生产者-消费者问题) 三个进程P1、P2、P3 互斥使用一个包含N(N0)个单元的缓冲区。P1 每次用produce()生成一个正整数并用put()送入缓冲区某一个空单元中;P2 每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3 每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义。要求用伪代码描述。 缓冲区问题求解 (1) 缓冲区是一互斥资源,因此设互斥信号量mutex。 (2) 同步问题:P1、P2 因为奇数的放置与取用而同步,设同步信号量odd;P1、P3 因为偶数的放置于取用而同步,设同步信号量even;P1、P2、P3 因为共享缓冲区,设同步信号量empty。 semaphore mutex = 1,odd = 0,even = 0,empty = N; Process P1: while(true){ number = produce(); P(empty);P(mutex); put(); V(mutex); If number % 2 == 0 V(even); else V(odd); } 缓冲区问题求解 Process P2: while(true){ P(odd); P(mutex); getodd(); V(mutex);V(empty); countodd(); } Process P3: while(true){ P(even); P(mutex); geteven(); V(mutex);V(empty); counteven(); } 3 嗜睡理发师问题 一个理发店里有一个理发师,一张理发椅子,多张等候的椅子,当没有顾客的时候,理发师就睡觉。当一个顾客来到店里时,如果理发师在睡觉,则叫醒理发师;否则便坐着等;如果等待的椅子都满了就离开。 3 嗜睡理发师问题 int?? waiting=0 ; //等候理发

文档评论(0)

1亿VIP精品文档

相关文档