某产品使用A、B、C三种零件组装而成,三种零件分别由三个相应的零件车间生产。零件组装则由装配车间完成,装配车间有三个分别存放三种零件的货架S1,S2,S3,分别可存放最多m个A零件,n个B零件,k个C


某产品使用A、B、C三种零件组装而成,三种零件分别由三个相应的零件车间生产。零件组装则由装配车间完成,装配车间有三个分别存放三种零件的货架S1,S2,S3,分别可存放最多m个A零件,n个B零件,k个C零件,每件产品分别使用A,B,C三种零件各一个装配而成,请采用信号量和PV操作描述两件生产装配的同步算法。


1) 定义数据结构
定义共享数据变量(临界资源)及私有变量
int S1[m];//零件A的存储空间
int S2[n];//零件B的存储空
int s3k];//零件C的存储空间
int inS1=0,outS1=0;//零件A的投放和存取指针
int inS2=0,outS2=0;//零件B的投放和存取指针
int inS3=0,outS3=0;//零件C的投放和存取指针

2) 定义进程
零件装配进程
取出一个零件A
取出一个零件B
取出一个零件C
装配成一个产品
3) 进程操作伪代码实现
#define m 10
#define n 20
#define k 30
int S1[m];//零件A的存储空间
int S2[n];//零件B的存储空间
int S3[k];//零件C的存储空间
int inA=0,inB=0,inC=0;/零件投放指针
int outA=0,outB=0,outC=0;//零件取出指针
semaphore Rs1=m;//零件A货架空位可用量
semaphore Rs2=n;//零件B货架空位可用量
semaphore Rs3=k;//零件C货架空位可用量
semaphore numA=0; //零件A可用量
semaphore numB=0;//零件B可用量
semaphore numC=0;//零件C可用量
semaphore semA=1; //零件A互斥访问控制
semaphore semB=1; //零件B互斥访问控制
semaphore semC=1;//零件C互斥访问控制
/零件A生产进程操作/
Process A()
{
While(1)
{
生产一个A零件;
P(Rs1);//取零件A投放货架空间
P(semS1);//互斥访问零件A货架
S1[inA]=零件A;//投放零件A
InA=(inA+1)%m;//投放指针推进
V(semS1);//释放临界区
V(numA);//零件A数增1
}
}
/零件B生产进程操作/
Process B()
{
While(1)
{
生产一个B零件;
P(Rs2);//取零件B投放货架空间
P(semS2);//互斥访问零件B货架
S2[inB]=零件B;//投放零件B
InB=(inB+1)%n;//投放指针推进
V(semS2);//释放临界区
V(numB);//零件B数增1
}
}
/零件C生产进程操作/
Process C()
{
While(1)
{
生产一个C零件;
P(Rs3);//取零件C投放货架空间
P(semS3);//互斥访问零件C货架
S1[inC]=零件C;//投放零件C
InC=(inC+1)%m;//投放指针推进
V(semS3);//释放临界区
V(numC);//零件C数增1
}
}
/零件装配进程操作/
Process produce()
{
While(1)
{
P(numA);//取一个零件A
P(semS1);//互斥访问零件A货架
零件A=S1[outA]//取出零件A
outA=(outA+1)%m;//取出指针推进
V(semS1);//释放临界区
V(Rs2);//零件B货架空位数增1
P(numB);//取一个零件B
P(semS2);//互斥访问零件B货架
零件B=S2[outB]//取出零件B
outB=(outB+1)%n;//取出指针推进
V(semS2);//释放临界区
V(Rs2);//零件B货架空位数增1
P(numC);//取一个零件C
P(semS3);//互斥访问零件C货架
零件C=S3[outC]//取出零件C
outC=(outC+1)%k;//取出指针推进
V(semS3);//释放临界区
V(Rs3);//零件C货架空位数增1
组装;
}
}

猜你喜欢

转载自blog.csdn.net/Clown_pan/article/details/84964882