实验七 设备管理Word格式文档下载.docx
《实验七 设备管理Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验七 设备管理Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
17.BLOCK*BLOCK,*rear;
/*阻塞队列指针*//*阻塞队列尾指针*/
18.};
19.structSDT/*系统设备表*/
20.{
21.charname[100];
/*系统设备名称*/
22.DCTDCT;
/*绑定的相应设备*/
23.}SDT[100];
24.structCOCT/*控制器控制表*/
25.{
26.charname[100];
/*控制器名称*/
27.intstage;
/*控制器状态:
28.intchct;
/*连接相应通道的通道号*/
29.BLOCK*BLOCK,*rear;
/*阻塞队列*//*阻塞队列尾指针*/
30.}COCT[100];
31.structCHCT/*通道控制表*/
32.{
33.charname[100];
/*通道名称*/
34.intstage;
/*通道的状态:
35.BLOCK*BLOCK,*rear;
36.}CHCT[2];
37.
38.intSDT_N=4;
39.intCOCT_N=3;
40.voidinit()/*初始化*/
41.{
42./*
43.初始化SDT和DCT系统原有4个设备:
KMTP
44.*/
45.strcpy(SDT[0].name,"
K"
);
46.strcpy(SDT[0].DCT.name,SDT[0].name);
47.SDT[0].DCT.type='
I'
;
48.SDT[0].DCT.stage=0;
49.SDT[0].DCT.coct=0;
50.SDT[0].DCT.BLOCK=SDT[0].DCT.rear=NULL;
51.
52.strcpy(SDT[1].name,"
M"
53.strcpy(SDT[1].DCT.name,SDT[1].name);
54.SDT[1].DCT.type='
O'
55.SDT[1].DCT.stage=0;
56.SDT[1].DCT.coct=0;
57.SDT[1].DCT.BLOCK=SDT[1].DCT.rear=NULL;
58.
59.strcpy(SDT[2].name,"
T"
60.strcpy(SDT[2].DCT.name,SDT[2].name);
61.SDT[2].DCT.type='
62.SDT[2].DCT.stage=0;
63.SDT[2].DCT.coct=1;
64.SDT[2].DCT.BLOCK=SDT[2].DCT.rear=NULL;
65.
66.strcpy(SDT[3].name,"
P"
67.strcpy(SDT[3].DCT.name,SDT[3].name);
68.SDT[3].DCT.type='
69.SDT[3].DCT.stage=0;
70.SDT[3].DCT.coct=2;
71.SDT[3].DCT.BLOCK=SDT[3].DCT.rear=NULL;
72./*
73.初始化COCT系统原有3个控制器:
CO1CO2CO3
74.*/
75.strcpy(COCT[0].name,"
CO1"
76.strcpy(COCT[1].name,"
CO2"
77.strcpy(COCT[2].name,"
CO3"
78.COCT[0].stage=0;
79.COCT[1].stage=0;
80.COCT[2].stage=0;
81.COCT[0].chct=0;
82.COCT[1].chct=1;
83.COCT[2].chct=1;
84.COCT[0].BLOCK=COCT[0].rear=NULL;
85.COCT[1].BLOCK=COCT[1].rear=NULL;
86.COCT[2].BLOCK=COCT[2].rear=NULL;
87./*
88.初始化CHCT系统原有2个通道:
CH1CH2
89.*/
90.strcpy(CHCT[0].name,"
CH1"
91.strcpy(CHCT[1].name,"
CH2"
92.CHCT[0].stage=0;
93.CHCT[1].stage=0;
94.CHCT[0].BLOCK=CHCT[0].rear=NULL;
95.CHCT[1].BLOCK=CHCT[1].rear=NULL;
96.}
97./*设备维护*/
98.booljudgeSDT(char*name)
99.{
100.inti;
101.for(i=0;
i<
SDT_N;
i++)
102.{
103.if(strcmp(SDT[i].name,name)==0)/*有重名设备,新建失败,返回0*/
104.returnfalse;
105.}
106.if(i==SDT_N)
107.returntrue;
108.}
109.voidadd(char*name,chartype)/*新建设备*/
110.{
111.inti;
112.strcpy(SDT[SDT_N].name,name);
113.strcpy(SDT[SDT_N].DCT.name,name);
114.SDT[SDT_N].DCT.stage=0;
/*状态置0*/
115.SDT[SDT_N].DCT.type=type;
116.intchoose;
117.cout<
<
"
1、选用已有控制器2、新建控制器\n>
118.cin>
>
choose;
119.if(choose==1)/*选用已有控制器*/
120.{
121.cout<
现有控制器为:
122.for(i=0;
COCT_N;
123.cout<
COCT[i].name<
\t"
124.charname[100];
125.cout<
endl<
输入所选控制器的名称:
126.cin>
name;
127.for(i=0;
128.if(strcmp(COCT[i].name,name)==0)
129.break;
130.SDT[SDT_N].DCT.coct=i;
131.}
132.if(choose==2)/*新建控制器*/
133.{
134.charname[100];
135.cout<
136.for(i=0;
137.cout<
138.cout<
请输入新建控制器的名称:
139.cin>
140.strcpy(COCT[COCT_N].name,name);
141.for(i=0;
142.{
143.if(strcmp(COCT[i].name,name)==0)
144.break;
145.}
146.SDT[SDT_N].DCT.coct=i;
147.cout<
现有通道为:
148.for(i=0;
2;
149.cout<
CHCT[i].name<
150.cout<
请输入所选通道的名称:
151.cin>
152.for(i=0;
153.{
154.if(strcmp(CHCT[i].name,name)==0)
155.break;
156.}
157.COCT[SDT[SDT_N].DCT.coct].chct=i;
158.COCT_N++;
159.}
160.SDT_N++;
161.}
162.voidmoveDCT(DCT*a,DCT*b)
163.{
164.strcpy(a->
name,b->
name);
165.a->
BLOCK=b->
BLOCK;
166.a->
rear=b->
rear;
167.a->
coct=b->
coct;
168.a->
stage=b->
stage;
169.a->
type=b->
type;
170.}
171.
172.
173.voiddel(char*name)/*删除设备name*/
174.{
175.inti,j,k;
176.for(i=0;
177.{
178.if(strcmp(SDT[i].name,name)==0)
179.break;
180.}
181.BLOCK*p,*b;
182.p=b=COCT[SDT[i].DCT.coct].BLOCK;
183.while(b)
184.{
185.if(strcmp(b->
from,name)==0)
186.{
187.if(b==COCT[SDT[i].DCT.coct].BLOCK)
188.p=COCT[SDT[i].DCT.coct].BLOCK=b->
next;
189.else
190.{
191.p->
next=b->
192.deleteb;
193.}
194.b=p;
195.}
196.p=b;
197.if(b!
=NULL)
198.b=b->
199.}
200.p=b=CHCT[COCT[SDT[i].DCT.coct].chct].BLOCK;
201.while(b)
202.{
203.if(strcmp(b->
204.{
205.if(b==CHCT[COCT[SDT[i].DCT.coct].chct].BLOCK)
206.p=CHCT[COCT[SDT[i].DCT.coct].chct].BLOCK=b->
207.else
208.{
209.p->
210.deleteb;
211.}
212.b=p;
213.}
214.p=b;
215.if(b!
216.b=b->
217.}
218.if(CHCT[COCT[SDT[i].DCT.coct].chct].BLOCK==NULL)
219.{
220.if(COCT[SDT[i].DCT.coct].BLOCK!
221.{
222.if(SDT[i].DCT.BLOCK==NULL)
223.SDT[i].DCT.stage=0;
224.CHCT[COCT[SDT[i].DCT.coct].chct].BLOCK=COCT[SDT[i].DCT.coct].BLOCK;
225.COCT[SDT[i].DCT.coct].BLOCK=COCT[SDT[i].DCT.coct].BLOCK->
226.}
227.else
228.{
229.if(SDT[i].DCT.BLOCK!
230.{
231.CHCT[COCT[SDT[i].DCT.coct].chct].BLOCK=SDT[i].DCT.BLOCK;
232.SDT[i].DCT.BLOCK=SDT[i].DCT.BLOCK->
233.}
234.else
235.{
236.
237.CHCT[COCT[SDT[i].DCT.coct].chct].stage=0;
238.COCT[SDT[i].DCT.coct].stage=0;
239.SDT[i].DCT.stage=0;
240.for(j=0;
j<
j++)
241.{
242.if(COCT[SDT[i].DCT.coct].chct==COCT[j].chct&
&
j!
=i)
243.{
244.if(COCT[j].BLOCK!
245.{
246.CHCT[COCT[SDT[i].DCT.coct].chct].BLOCK=COCT[j].BLOCK;
247.COCT[j].BLOCK=COCT[j].BLOCK->
248.CHCT[COCT[SDT[i].DCT.coct].chct].stage=1;
249.break;
250.}
251.}
252.}
253.
254.}
255.}
256.}
257.for(j=0;
258.{
259.if(SDT[i].DCT.coct==SDT[j].DCT.coct&
260.break;
261.}
262.if(j==SDT_N)
263.{
264.
265.for(k=SDT[i].DCT.coct;
k<
COCT_N-1;
k++)
266.{
267.strcpy(COCT[k].name,COCT[k+1].name);
268.COCT[k].stage=COCT[k+1].stage;
269.COCT[k].chct=COCT[k+1].chct;
270.COCT[k].BLOCK=COCT[k+1].BLOCK;
271.COCT[k].rear=COCT[k+1].rear;
272.}
273.for(k=0;
274.{
275.if(SDT[k].DCT.coct>
SDT[i].DCT.coct)
276.SDT[k].DCT.coct--;
277.}
278.for(k=i;
SDT_N-1;
279.{
280.strcpy(SDT[k].name,SDT[k+1].name);
281.moveDCT(&
SDT[k].DCT,&
SDT[k+1].DCT);
282.}
283.SDT_N--;
284.COCT_N--;
285.}
286.else
287.{
288.for(k=i;
289.{
290.strcpy(SDT[k].name,SDT[k+1].name);
291.moveDCT(&
292.}
293.SDT_N--;
294.}
295.
296.
297.}
298.
299./*
300.设备分配
301.*/
302.intapply(char*p,char*name)/*申请设备,进程p申请设备name*/
303.{
304.inti,j;
305./*
306.从前往后查
307.*/
308.BLOCK*block;
309.block=newBLOCK;
310.strcpy(block->
name,p);
311.strcpy(block->
from,name);
312.block->
next=NULL;
313.for(i=0;
314.{
315.if(strcmp(SDT[i].name,name)==0)
316.break;
317.}
318.if(SDT[i].DCT.stage==0)/*如果DCT的状态是0则置1并继续往下查*/
319.{
320.SDT[i].DCT.stage=1;
321.if(COCT[SDT[i].DCT.coct].stage==0)/*如果COCT的状态是0则置1并继续往下查*/
322.{
323.COCT[SDT[i].DCT.coct].stage=1;
324.if(CHCT[COCT[SDT[i].DCT.coct].chct].stage==0)/*如果CHCT的状态是0则置1*/
325.{
326.CHCT[COCT[SDT[i].DCT.coct].chct].stage=1;
327.if(CHCT[COCT[SDT[i].DCT.coct].chct].BLOCK==NULL)
328.CHCT[COCT[SDT[i].DCT.coct].chct].rear=CHCT[COCT[SDT[i].DCT.coct].chct].BLOCK=block;
329./*代表进程p申请设备name过来的*/
330.return1;
/*申请成功*/
331.}
332.else/*如果CHCT的状态是1则需将该进程阻塞到CHCT的阻塞队列上*/
333.{
334.
335.CHCT[COCT[SDT[i].DCT.coct].chct].rear->
next=block;
336.CHCT[COCT[SDT[i].DCT.coct].chct].rear=block;
337.return2;
/*阻塞到了CHCT上*/
338.}
339.}
340.else/*如果COCT的状态是1,则需将该进程阻塞到COCT的阻塞队列上*/
341.{
342.if(COCT[SDT[i].DCT.coct].BLOCK==NULL)
343.COCT[SDT[i].DCT.coct].rear=COCT[SDT[i].DCT.coct].BLOCK=block;
344.else
345.{
346.COCT[SDT[i].DCT.coct].rear->
347.COCT[SDT[i].DCT.coct].rear=block;
348.}
349.return3;
/*阻塞到了COCT上*/
350.}
351.}
352.else/*如果DCT的状态是1,则需将该进程阻塞到DCT的阻塞队列上*/
353.{
354.if(SDT[i].DCT.BLOCK==NULL)
355.SDT[i].DCT.rear=SDT[i].DCT.BLOCK=block;
356.else
357.{
358.SDT[i].DCT.rear->
359.SDT[i].DCT.rear=block;
360.}
361.return4;
/*阻塞到了DCT上*/
362.}
363.}
364.
365.boolrecycle(char*t,char*name)/*t回收设备name*/
366.{
367./*
368.从后往前查
369.*/
370.inti,j,k;
371.for(i=0;
372.{
373.if(strcmp(SDT[i].name,name)==0)
374.break;
375.}
376.BLOCK