实验七 设备管理.docx
- 文档编号:5183934
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:27
- 大小:21.16KB
实验七 设备管理.docx
《实验七 设备管理.docx》由会员分享,可在线阅读,更多相关《实验七 设备管理.docx(27页珍藏版)》请在冰豆网上搜索。
实验七设备管理
实验七设备管理(四课时)
一实验目的:
模拟实现包括设备的添加和删除,设备的分配和回收,体现设备分配中的设备独立性。
二内容要求:
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验七 设备管理 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)