实验七 设备管理.docx
《实验七 设备管理.docx》由会员分享,可在线阅读,更多相关《实验七 设备管理.docx(27页珍藏版)》请在冰豆网上搜索。
![实验七 设备管理.docx](https://file1.bdocx.com/fileroot1/2022-12/13/7f5cffa5-e626-4ec4-9888-5ec215d36a42/7f5cffa5-e626-4ec4-9888-5ec215d36a421.gif)
实验七设备管理
实验七设备管理(四课时)
一实验目的:
模拟实现包括设备的添加和删除,设备的分配和回收,体现设备分配中的设备独立性。
二内容要求:
1、设备管理模拟计算机系统的外围设备的系统结构,可以创建2个通道、3个控制器和四个外设(键盘、鼠标、显示器、打印机),键盘和鼠标使用一个控制器。
2、设备管理有添加和删除设备的功能,同时完成控制器的维护功能。
3、设备管理还包括设备的分配和回收。
使学生掌握外围设备的体系结构和管理方法。
成功分配的时候,用户进程使用设备,否则将被阻塞到一个级别的控制表上,等待被唤醒。
设备分配必须满足设备的独立性要求。
为了实现设备独立性,要求在驱动程序之上设计一层设备无关软件,其主要功能可分为执行所有设备的公有操作,主要包括:
(a)独占设备的分配与回收;(b)将逻辑设备名映射为物理设备,进一步可以找到相应物理设备的驱动程序。
三实现功能:
1、增加设备
2、删除设备
3、申请设备
4、回收设备
5、显示当前所有设备的状态
四实现过程:
[cpp]viewplaincopy
01.#include
02.#include
03.#include
04.usingnamespacestd;
05.structBLOCK/*阻塞*/
06.{
07.charname[100];/*阻塞态进程名称*/
08.charfrom[100];
09.BLOCK*next;
10.};
11.structDCT/*设备控制表*/
12.{
13.charname[100];/*设备名称*/
14.chartype;/*设备类型:
I/O*/
15.intstage;/*设备状态:
1/0*/
16.intcoct;/*连接相应控制器的控制器号*/
17.BLOCK*BLOCK,*rear;/*阻塞队列指针*//*阻塞队列尾指针*/
18.};
19.structSDT/*系统设备表*/
20.{
21.charname[100];/*系统设备名称*/
22.DCTDCT;/*绑定的相应设备*/
23.}SDT[100];
24.structCOCT/*控制器控制表*/
25.{
26.charname[100];/*控制器名称*/
27.intstage;/*控制器状态:
1/0*/
28.intchct;/*连接相应通道的通道号*/
29.BLOCK*BLOCK,*rear;/*阻塞队列*//*阻塞队列尾指针*/
30.}COCT[100];
31.structCHCT/*通道控制表*/
32.{
33.charname[100];/*通道名称*/
34.intstage;/*通道的状态:
1/0*/
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='I';
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='O';
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;i102.{
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;i123.cout<124.charname[100];
125.cout<";
126.cin>>name;
127.for(i=0;i128.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;i137.cout<138.cout<";
139.cin>>name;
140.strcpy(COCT[COCT_N].name,name);
141.for(i=0;i142.{
143.if(strcmp(COCT[i].name,name)==0)
144.break;
145.}
146.SDT[SDT_N].DCT.coct=i;
147.cout<<"现有通道为:
";
148.for(i=0;i<2;i++)
149.cout<150.cout<";
151.cin>>name;
152.for(i=0;i<2;i++)
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;i177.{
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->next;
192.deleteb;
193.}
194.b=p;
195.}
196.p=b;
197.if(b!
=NULL)
198.b=b->next;
199.}
200.p=b=CHCT[COCT[SDT[i].DCT.coct].chct].BLOCK;
201.while(b)
202.{
203.if(strcmp(b->from,name)==0)
204.{
205.if(b==CHCT[COCT[SDT[i].DCT.coct].chct].BLOCK)
206.p=CHCT[COCT[SDT[i].DCT.coct].chct].BLOCK=b->next;
207.else
208.{
209.p->next=b->next;
210.deleteb;
211.}
212.b=p;
213.}
214.p=b;
215.if(b!
=NULL)
216.b=b->next;
217.}
218.if(CHCT[COCT[SDT[i].DCT.coct].chct].BLOCK==NULL)
219.{
220.if(COCT[SDT[i].DCT.coct].BLOCK!
=NULL)
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->next;
226.}
227.else
228.{
229.if(SDT[i].DCT.BLOCK!
=NULL)
230.{
231.CHCT[COCT[SDT[i].DCT.coct].chct].BLOCK=SDT[i].DCT.BLOCK;
232.SDT[i].DCT.BLOCK=SDT[i].DCT.BLOCK->next;
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;j241.{
242.if(COCT[SDT[i].DCT.coct].chct==COCT[j].chct&&j!
=i)
243.{
244.if(COCT[j].BLOCK!
=NULL)
245.{
246.CHCT[COCT[SDT[i].DCT.coct].chct].BLOCK=COCT[j].BLOCK;
247.COCT[j].BLOCK=COCT[j].BLOCK->next;
248.CHCT[COCT[SDT[i].DCT.coct].chct].stage=1;
249.break;
250.}
251.}
252.}
253.
254.}
255.}
256.}
257.for(j=0;j258.{
259.if(SDT[i].DCT.coct==SDT[j].DCT.coct&&j!
=i)
260.break;
261.}
262.if(j==SDT_N)
263.{
264.
265.for(k=SDT[i].DCT.coct;k266.{
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;k274.{
275.if(SDT[k].DCT.coct>SDT[i].DCT.coct)
276.SDT[k].DCT.coct--;
277.}
278.for(k=i;k279.{
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;k289.{
290.strcpy(SDT[k].name,SDT[k+1].name);
291.moveDCT(&SDT[k].DCT,&SDT[k+1].DCT);
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;i314.{
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->next=block;
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->next=block;
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;i372.{
373.if(strcmp(SDT[i].name,name)==0)
374.break;
375.}
376.BLOCK