




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#include #include iostream.h#include stdlib.h#include string.h struct PCBint id;char name10;int size;struct PCB *next;;struct PCB *running;struct PCB *ready;struct PCB *blocked;struct PCB *q;struct PCB *p;int id=1;int size;char name10;/struct DCT 设备char name10;int busy;PCB * occupied;PCB * waiting;s
2、truct DCT *next;struct COCT* coct;上级控制器;struct COCT / 控制器char name10;int busy;PCB * occupied;PCB * waiting;struct COCT *next;struct CHCT* chct; 控制器的上级通道;struct CHCT 通道char name10;int busy;PCB * occupied;PCB * waiting;struct CHCT *next;lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
3、lllllllllllllllllllllstruct DCT * dcts;struct COCT *cocts;struct CHCT *chcts;void enqueue(int id,char *name,int size,struct PCB *head)struct PCB *node=(struct PCB *)malloc(sizeof(struct PCB);node-next=0;node-id=id;strcpy(node-name,name);node-size=size;struct PCB *tmp=head;while(tmp-next!=0)tmp=tmp-n
4、ext;tmp-next=node;struct PCB * dequeue(struct PCB *head)struct PCB * tmp=head-next;if(head-next!=0)head-next=head-next-next;tmp-next=0;return(tmp);void createProcess()printf(nname:);scanf(%s,name);printf(size:);scanf(%d,&size);printf(n);enqueue(id+,name,size,ready);if(running=0)running=dequeue(ready
5、); void switchProcess()if(running!=0&ready-next!=0) enqueue(running-id,running-name,running-size,ready); running=dequeue(ready);elseprintf(没有可切换的进程n); void blockProcess()if(running=0)printf(没有可阻塞的进程n); else enqueue(running-id,running-name,running-size,blocked);running=0;if(ready-next=0)printf(没有可执行的
6、进程n);elserunning=dequeue(ready);void wakeupProcess()if(blocked-next=0)printf(没有可激活的进程); elseenqueue(blocked-next-id,blocked-next-name,blocked-next-size,ready); dequeue(blocked);if(running=0)running=dequeue(ready);void terminateProcess() 结束进程if(running=0)printf(没有需要结束的进程n);elserunning=dequeue(ready);
7、void displayProcessstatus()printf(就绪态n);if(ready-next=0)printf(当前没有进程在该状态n);if(ready-next!=0) q=ready-next;while(ready-next!=0) printf(%s,ready-next-name);printf( %dn,ready-next-size);ready-next=ready-next-next; ready-next=q;printf(执行状态n);if(running=0) printf(当前没有进程在该状态n);if(running!=0) printf(%s,ru
8、nning-name);printf( %dn,running-size);printf(阻塞状态n);if(blocked-next=0) printf(当前没有进程在该状态 nn);if(blocked-next!=0) p=blocked-next;while(blocked-next!=0) printf(%s,blocked-next-name);printf( %dn,blocked-next-size);blocked-next = blocked-next-next; blocked-next=p;/struct DCT * findDCT(char name)设备分配时找到要
9、添加的设备struct DCT *temp = dcts;while(temp-next!=NULL)temp = temp-next;if(strcmp(temp-name,name)=0) return temp;) return NULL;)struct CHCT * findChannel(char name)(struct CHCT *temp = chcts;while(temp-next!=NULL) (temp = temp-next;if(strcmp(temp-name,name)=0) return temp;) return NULL;)struct COCT * fi
10、ndController(char name)(struct COCT *temp = cocts;while(temp-next!=NULL) (temp = temp-next;if(strcmp(temp-name,name)=0) return temp;) return NULL;)void addProcesstoWaiting(struct PCB * waiting,struct PCB *p)/ 进入进程等待队列 (struct PCB *temp = waiting;while(temp-next!=NULL) (temp = temp-next;)/temp-next =
11、 p;+temp-next = new struct PCB;temp-next-id = p-id;strcpy(temp-next-name,p-name);temp-next-size = p-size;temp-next-next = NULL;+void add(struct PCB * head,struct PCB * node)/ 入队列struct PCB *tmp=head;while(tmp-next!=0)tmp=tmp-next;tmp-next=node;/获得队列里的第一个进程struct PCB * getFirst(struct PCB *head) retu
12、rn head-next; void allocateCHCT(struct CHCT* chct,PCB *p) 分配 CHCT if(chct-occupied!=0) printf(不能分配通道n);addProcesstoWaiting(chct-waiting,p); elsechct-occupied=p;printf(分配成功! n);add(blocked,p);if(ready!=0)running=dequeue(ready);elserunning=0;*void allocateCOCT(struct COCT* coct,PCB *p)if(coct-occupied
13、!=0)printf(不能分配控制器n);addProcesstoWaiting(coct-waiting,p); add(blocked,p);if(ready!=0)running=dequeue(ready);elserunning=0;return;elsecoct-occupied=p;allocateCHCT(coct-chct,p);void allocateDCT()char nameDCT10;printf(请输入设备名称:);scanf(%s,nameDCT);struct DCT * dct=findDCT(nameDCT);struct PCB * p = runnin
14、g; if(dct!=NULL&p!=NULL) if(dct-occupied!=0)printf(不能分配设备n);addProcesstoWaiting(dct-waiting,p);add(blocked,p);if(ready!=0)running=dequeue(ready);elserunning=0;return;elsedct-occupied=p;allocateCOCT(dct-coct,p);+ /*add(blocked,p);if(ready!=0)running=dequeue(ready);elserunning=0;return;*/+ elseprintf(
15、发生错误!n);/?void releaseCHCT(char *name,struct CHCT* chct,struct PCB* p) if(p!=NULL)addProcesstoWaiting(chct-waiting,p);if(strcmp(name,chct-occupied-name)=0) if(chct-waiting-next!=NULL)chct-occupied = dequeue(chct-waiting); else chct-occupied = NULL;void releaseCOCT(char *name,struct COCT* coct,struct
16、 PCB* p) if(p!=NULL)addProcesstoWaiting(coct-waiting,p);if(strcmp(name,coct-occupied-name)=0) if(coct-waiting-next!=NULL)coct-occupied = dequeue(coct-waiting); else coct-occupied = NULL;releaseCHCT(name,coct-chct,coct-occupied);void releaseDCT()char nameDCT10;printf(请输入要释放的设备名称:n);scanf(%s,nameDCT);
17、char nameP10;printf(请输入要释放的进程名称:n);scanf(%s,nameP);struct DCT *temp = findDCT(nameDCT);if(strcmp(temp-occupied-name,nameP)=0) if(temp-waiting-next!=NULL) temp-occupied = dequeue(temp-waiting); else temp-occupied = NULL;releaseCOCT(nameP,temp-coct,temp-occupied); else printf(没有对应的设备和进程!);void addChan
18、nel(char name儿struct CHCT * temp=(struct CHCT *)malloc(sizeof(struct CHCT); strcpy(temp-name,name);temp-next=0;temp-busy=0;temp-waiting = new struct PCB;temp-waiting-next = NULL;/temp-waiting=0;temp-occupied=0;struct CHCT * head=chcts;/进入了 chcts 队歹Uwhile(head-next!=0)head=head-next;head-next=temp;vo
19、id addController(char *name,struct CHCT * chct) 增加控制器 struct COCT * temp=(struct COCT *)malloc(sizeof(struct COCT); strcpy(temp-name,name);temp-next=0;temp-busy=0;temp-waiting = new struct PCB; temp-waiting-next = NULL; /temp-waiting=0; /+temp-occupied=0;temp-chct= chct;struct COCT * head=cocts; 进入了
20、 cocts 队歹Uwhile(head-next!=0)head=head-next;head-next=temp;void addDevice(char *name,struct COCT * coct)增加设备struct DCT * temp=(struct DCT *)malloc(sizeof(struct DCT);strcpy(temp-name,name);temp-next=0;temp-busy=0;temp-waiting = new struct PCB;temp-waiting-next = NULL;/temp-waiting=0;temp-occupied=0;
21、temp-coct= coct;struct DCT * head=dcts;while(head-next!=0)head=head-next;head-next=temp;/ 添力口 设备 +void add_dct()char newDCT10;printf(请输入新设备的名字:n);scanf(%s,newDCT);char newCOCT10;printf(请输入要添加到的控制器的名字:n);scanf(%s,newCOCT);addDevice(newDCT,findController(newCOCT);/添加控制器void add_coct()char newCOCT10;pr
22、intf(请输入新控制器的名字:n);scanf(%s,newCOCT);char newCHCT10;printf(请输入要添加到的通道的名字:n);scanf(%s,newCHCT);addController(newCOCT,findChannel(newCHCT);/添加通道void add_chct()char newCHCT10;printf(请输入新的通道的名字:n);scanf(%s,newCHCT);addChannel(newCHCT);+ 删除操作 +删除设备void deleteDCT(char nameDCT)/char nameDCT10;/int i=0;/pri
23、ntf(请输入要删除 DCT的名字:);/scanf(%s,nameDCT);struct DCT * temp = findDCT(nameDCT);struct DCT * head = dcts;if(temp=NULL)printf(没有对应的设备!n);return ; elsewhile(head-next!=0) if(strcmp(temp-name,head-next-name)=0)if(temp-occupied!=NULL)printf(此设备现在正在使用不能删除n);elsehead-next=head-next-next;/i+;break;elsehead=hea
24、d-next;删除控制器void deleteCOCT(char nameCOCT)struct COCT *temp=findController(nameCOCT);struct COCT *head=cocts;if(temp=NULL)printf(没有对应白控制器n); return;) elsewhile(head-next!=0) (if(strcmp(temp-name,head-next-name)=0) if(temp-occupied!=NULL)printf(此控制器现在正在使用不能删除n);else/ deleteDCT(temp-);head-next=head-n
25、ext-next;) break;) head=head-next;)删除通道void deleteCHCT(char nameCHCT口)struct CHCT *temp=findChannel(nameCHCT);struct CHCT *head=chcts;if(temp=NULL)printf(没有对应的通道n); return;) elsewhile(head-next!=0) if(strcmp(temp-name,head-next-name)=0) if(temp-occupied!=NULL)printf(此通道现在正在使用不能删除n);else/ deleteDCT(t
26、emp-);head-next=head-next-next;)i+;break;) head=head-next;)/+void displayDCT()struct DCT * dct;struct COCT *coct;struct CHCT *chct = chcts;struct PCB *pcb;/while(chct-next!=NULL) chct = chct-next;printf(%s(,chct-name);if(chct-occupied!=0)printf(%s,chct-occupied-name);printf();pcb = chct-waiting-next
27、;waiting 是头结点, pcb指向队歹U第个进程 while(pcb!=NULL)printf(%s,pcb-name);pcb = pcb-next;printf(n);coct = cocts;while(coct-next!=NULL)coct = coct-next;if(strcmp(coct-chct-name,chct-name)=0) printf(if(coct-occupied!=0)%s(,coct-name);printf(%s,coct-occupied-name);printf();pcb = coct-waiting-next;while(pcb!=NULL
28、)printf(%s,pcb-name);pcb = pcb-next;printf(n);/ dct = dcts;while(dct-next!=NULL) dct = dct-next;if(strcmp(dct-coct-name,coct-name)=0) printf(%s(,dct-name);if(dct-occupied!=0)printf(%s,dct-occupied-name);printf();pcb = dct-waiting-next;while(pcb!=NULL) printf(%s,pcb-name);pcb = pcb-next; printf(n);/v
29、oid main()dcts=(struct DCT *)malloc(sizeof(struct DCT);dcts-next=0;cocts=(struct COCT *)malloc(sizeof(struct COCT);cocts-next=0;chcts=(struct CHCT *)malloc(sizeof(struct CHCT);chcts-next=0;addChannel(chct1);addChannel(chct2);addController(coct1,findChannel(chct1);addController(coct2,findChannel(chct
30、1);addController(coct3,findChannel(chct2);addDevice(dct1,findController(coct1);addDevice(dct2,findController(coct1);addDevice(dct3,findController(coct2);/addDevice(dct4findController(coct2);addDevice(dct4,findController(coct3);ready=(struct PCB *)malloc(sizeof(struct PCB);blocked=(struct PCB *)malloc(sizeof(struct PCB);ready-next=0;blocked-next=0;A:while(1)int choice;int function;printf(1:创建进程 n);printf(2:切换
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 绍兴市职业教育中心教师招聘考试真题2024
- (完整版)项目管理方案执行保障措施
- 服务进度保证措施方案
- 达标测试人教版八年级物理上册第4章光现象-光的色散必考点解析试卷(详解版)
- 2025煤矿企业主要负责人考试安全生产知识和管理能力冲刺试题及答案
- 解析卷-人教版八年级上册物理《物态变化》章节训练试题
- 2025年燃气经营企业从业人员考试测试题及答案
- 【语文】四川省眉山市2024-2025学年高一下学期期末考试试题(解析版)
- 2025年新版数控车工期末考试及答案
- 2025年道路运输企业主要负责人和安管人员考试冲刺试题及答案
- 2025中国临床肿瘤学会CSCO结直肠癌诊疗指南解读课件
- 借学科之力敲劳动之门
- 肝功能衰竭的护理查房
- 放化疗相关口腔黏膜炎预防及处理中华护理学会团体标准
- 金螳螂造价管理制度
- 配网工程验收规范
- 离婚协议合同打印
- 《逍遥游》全篇及译文
- 男性私密项目培训
- 数据采集服务合同
- 企业税收筹划的涉税风险与规避研究
评论
0/150
提交评论