实验七 设备管理.docx

上传人:b****5 文档编号:5183934 上传时间:2022-12-13 格式:DOCX 页数:27 大小:21.16KB
下载 相关 举报
实验七 设备管理.docx_第1页
第1页 / 共27页
实验七 设备管理.docx_第2页
第2页 / 共27页
实验七 设备管理.docx_第3页
第3页 / 共27页
实验七 设备管理.docx_第4页
第4页 / 共27页
实验七 设备管理.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

实验七 设备管理.docx

《实验七 设备管理.docx》由会员分享,可在线阅读,更多相关《实验七 设备管理.docx(27页珍藏版)》请在冰豆网上搜索。

实验七 设备管理.docx

实验七设备管理

实验七设备管理(四课时)

一实验目的:

模拟实现包括设备的添加和删除,设备的分配和回收,体现设备分配中的设备独立性。

二内容要求:

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;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;i

123.cout<

124.charname[100];

125.cout<

";

126.cin>>name;

127.for(i=0;i

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;i

137.cout<

138.cout<

";

139.cin>>name;

140.strcpy(COCT[COCT_N].name,name);

141.for(i=0;i

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;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;i

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->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;j

241.{

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;j

258.{

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;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;k

274.{

275.if(SDT[k].DCT.coct>SDT[i].DCT.coct)

276.SDT[k].DCT.coct--;

277.}

278.for(k=i;k

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;k

289.{

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;i

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->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;i

372.{

373.if(strcmp(SDT[i].name,name)==0)

374.break;

375.}

376.BLOCK

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1