1. 程式人生 > >某產品使用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三種零件組裝而成,三種零件分別由三個相應的零件車間生產。零件組裝則由裝配車間完成,裝配車間有三個分別存放三種零件的貨架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
組裝;
}
}