操作系统设计大实验

1、设自行车生产线上有一只箱子,其中有N个位置(N≥3),每个位置可存放一个车架或一个车轮,又设有三名工人,其活动分别为:
在这里插入图片描述
用信号量PV操作编程实现三个工人的合作,不能出现死锁。要求N的大小可自定义,显示自行车生产组装的过程。(25分)
解:
分析:根据题目意义分析,该题所述作业工人1、工人2与工人3构成生产者与消费者关系,存在着生产者-消费者问题的同步关系,涉及的知识点包括:信号量、PV原语、进程同步、死锁问题等。
解决思路:先不考虑死锁问题,工人1、2分别与3是生产者和消费者关系。箱子内的空位是工人1、2的资源,车架和车轮是工人3的资源。定义三个信号灯如下:

semaphore empty=N;//箱子内的空位
semaphore weel=0;//车轮
semaphore frame=0;//车架

再来看死锁问题:如果说工人1或者工人2某一方生产速度很快,N个空位全部为车轮,或者≥N-1个空位是车架的话(此时最多只能放入一个车轮),工人3永远得不到组装一个完整的车的资源,就会发生死锁。所以车架最多不能达到N-2个,也就是车架的信号量初值要设置为N-2,车轮要设置为N-1。
伪代码如下:

semaphore empty = N;//空位置数量
semaphore maxframe = N-2;//箱中最大车架数量
semaphore maxwheel = N-1;//箱中最大车轮数量
semaphore frame = 0;//车架数量
semaphore wheel = 0;//车轮数量
do{
   
    //工人1活动
    P(maxframe);
P(empty);
加工一个车架;
车架放入箱中;
V(frame);
}while(1)

do{
   
    //工人2活动
    P(maxwheel);
P(empty);
加工一个车轮;
车轮放入箱中;
V(wheel);
}while(1)

do{
   
    //工人3活动
P(frame);
P(wheel);
P(wheel);
箱中取一个车架;
箱中取一个车架;
组装一台车;
V(maxframe);
V(maxwheel);
V(maxwheel);
V(empty);
V(empty);
V(empty);
}while(1)

源代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <pthread.h>
#include <unistd.h>
#include <signal.h>
#include <semaphore.h>
sem_t empty;//箱子内的空位
sem_t wheel;//车轮
sem_t frame;//车架
sem_t s1;//车架最大值
sem_t s2;//车轮最大值
pthread_t worker1_thread, worker2_thread, worker3_thread;//声明三个工人的线程
void * worker1Thread(void *i)
{
   
   
	while(1)
	{
   
   	
	    sleep(2);//工人1生产一个车架
	    printf("worker1 products a frame!\n");
        sem_wait(&empty);
		sem_wait(&s1);	
		sleep(1);//工人1将车架放入箱子
		printf("worker1 places a frame in the box!\n");
		sem_post(&frame);
	}
}
void * worker2Thread(void *i)
{
   
   
	while(1)
	{
   
   	
sleep(1);//工人2生产一个车轮
printf("worker2 products a wheel!\n");
	    sem_wait(&empty);
		sem_wait(&s2);	
		sleep(1);//工人2将车轮放入箱子
		printf("worker2 places a wheel in the box!\n");
		sem_post(&wheel);
	}
}
void * worker3Thread(void *i)
{
   
   
	while(1)
	{
   
   	
	    sem_wait(&frame);
	    sleep(1);//工人3从箱子中拿一个车架
        printf("worker3 takes out a frame from the box!\n");
        sem_post(&empty);	
        sem_post(&s1);
		sem_wait(&wheel);
		sem_wait(&wheel);
		sleep(2);//工人3从箱子中拿两个车轮
		printf("worker3 takes out two wheels from the box!\n");
		sem_post(&empty);
		sem_post(&empty);
		sem_post(&s2);
		sem_post(&s2);
sleep(3);//工人3生产一辆自行车
		printf("worker3 products a bicycle!\n");
	}
}
int main(){
   
   
      int N;
      printf("Please enter the number of the box positions:");
      scanf("%d",&N);
      printf("\n");
      //初始化信号量
      sem_init(&empty, 1, N);
      sem_init
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊hii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值