进程同步问题

  • 系统中有三个进程 GET 、 PRO 和 PUT ,共用两个缓冲区 BUF1 和 BUF2 。假设 BUF1 中最多可放 11 个信息,现已放入了两个信息; BUF2 最多可放 5 个信息。 GET 进程负责不断地将输入信息送入 BUF1 中, PRO 进程负责从 BUF1 中取出信息进行处理,并将处理结果送到 BUF2 中, PUT 进程负责从 BUF2 中读取结果并输出。试写出正确实现 GET 、 PRO 、 PUT 的同步与互斥的算法。

 

semaphore 
 empty1=9;// 空 buf1 的数目
 full1=2; // 有数据的 buf1 的数目
empty2=5; // 空 buf2 的数目
 full1=0; // 有数据的 buf2 的数目
 mutex1=mutex2=1; // 互斥信号量
int main(){
Cobegin // 并发开始
 GET();
 PRO();
 PUT();
Coend // 并发结束
return 0; }  
//GET 进程
void GET () {
 while(1)
{
…
wait(empty1);
wait(mutex1);
将信息送入 buf1;
signal(mutex1);
signal(full1);
…
}
}   
//PRO 进程
void PRO () {
 while(1)
{
wait(full1);
wait(mutex1);
从 buf1 中取出信息 ;
signal(mutex1);
signal (empty1);
wait(empty2);
wait(mutex2);
将信息送入 buf2;
signal(mutex2);
signal(full2);
}
} 
//PUT 进程
void PUT () {
 while(1)
{
wait(full2);
wait(mutex2);
从 buf2 中取出信息 ;
signal(mutex2);
signal (empty2);
}  
  • 三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。P1每次用produce0生成一个正整数并用putO送入缓冲区某一空单元中;P2每次用getoddO从该缓冲区中取出一个奇数并用countoddO统计奇数个数;P3每次用geteven)从该缓冲区中取出一个偶数并用counteven0统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义(要求用伪代码描述)。

  • 在一个仓库中可以存放A和B两种产品,要求:

        1)每次只能存入一种产品。

        2)A产品数量-B产品数量<M。

        3)B产品数量-A产品数量<N。

        其中,M、N是正整数,试用P操作、V操作描述产品A与产品B的入库过程。

 

  • 某工厂有两个生产车间和一个装配车间,两个生产车间分别生产A、B两种零件,装配车间的任务是把A、B两种零件组装成产品。两个生产车间每生产一个零件后都要分别把它们送到专配车间的货架F1、F2上。F1存放零件A,F2存放零件B,F1和F2的容量均可以存放10个零件。装配工人每次从货架上取一个零件A和一个零件B后组装成产品。请用P、V操作进行正确管理。

 

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经典的进程同步问题通常包括生产者-消费者问题、读者-写者问题和哲学家就餐问题等。这里以生产者-消费者问题为例,简单介绍一下如何在 C 语言中实现进程同步。 生产者-消费者问题是指多个进程共享同一个缓冲区,其中生产者进程向缓冲区中写入数据,而消费者进程则从缓冲区中读取数据。为了避免竞争条件和死锁等问题,需要使用同步机制来保证进程之间的协调工作。 使用信号量可以实现进程同步。信号量是一个计数器,用于控制对共享资源的访问。在 C 语言中,我们可以使用 POSIX 信号量库来创建和使用信号量。 下面是一个简单的生产者-消费者问题的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #define BUFFER_SIZE 10 int buffer[BUFFER_SIZE]; int in = 0, out = 0; sem_t empty; // 缓冲区空闲信号量 sem_t full; // 缓冲区满信号量 pthread_mutex_t mutex; // 互斥锁 void *producer(void *arg) { int item; while (1) { item = rand() % 100; // 生产一个随机数 sem_wait(&empty); // 当缓冲区空间为 0 等待 pthread_mutex_lock(&mutex); buffer[in] = item; in = (in + 1) % BUFFER_SIZE; // 循环缓冲区 printf("Producer produced item %d\n", item); pthread_mutex_unlock(&mutex); sem_post(&full); // 增加缓冲区中的项目数 } pthread_exit(NULL); } void *consumer(void *arg) { int item; while (1) { sem_wait(&full); // 当缓冲区中没有项目等待 pthread_mutex_lock(&mutex); item = buffer[out]; out = (out + 1) % BUFFER_SIZE; // 循环缓冲区 printf("Consumer consumed item %d\n", item); pthread_mutex_unlock(&mutex); sem_post(&empty); // 增加缓冲区的空闲空间 } pthread_exit(NULL); } int main(int argc, char **argv) { pthread_t producer_thread, consumer_thread; sem_init(&empty, 0, BUFFER_SIZE); // 初始化信号量 sem_init(&full, 0, 0); pthread_mutex_init(&mutex, NULL); pthread_create(&producer_thread, NULL, producer, NULL); pthread_create(&consumer_thread, NULL, consumer, NULL); pthread_join(producer_thread, NULL); pthread_join(consumer_thread, NULL); sem_destroy(&empty); // 销毁信号量和互斥锁 sem_destroy(&full); pthread_mutex_destroy(&mutex); return 0; } ``` 在这个示例中,我们使用了两个信号量 `empty` 和 `full` 来控制缓冲区的空闲空间和项目数。当 `empty` 为 0 ,表示缓冲区已满,生产者需要等待;当 `full` 为 0 ,表示缓冲区没有项目,消费者需要等待。使用互斥锁 `mutex` 来保护共享资源的访问,避免竞争条件。 当生产者生成一个随机数,将其写入缓冲区,同增加 `in` 指针,表示缓冲区中的项目数增加了一个。当消费者读取缓冲区中的项目,将其存储到 `item` 中,并将 `out` 指针增加,表示缓冲区中的项目数减少了一个。 上述代码中,生产者和消费者都是无限循环运行的,可以使用 `pthread_cancel()` 函数来终止它们的运行。此外,还需要注意的是,在使用信号量等同步机制,不要忘记释放已经申请的资源,否则可能会导致死锁等问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值