操作系统课程设计设备管理实现源代码_第1页
操作系统课程设计设备管理实现源代码_第2页
操作系统课程设计设备管理实现源代码_第3页
免费预览已结束,剩余33页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操作系统课程设计 设备管理实 现源代码#in elude <stdio.h>#in elude "iostream.h"#inelude "stdlib.h"#inelude "string.h"struct PCBint id;char n ame10;int size; struct PCB *n ext;struct PCB *running;struct PCB *ready;struct PCB Flocked;struct PCB *q;struct PCB *p;int id=1;int size;char

2、n ame10;/struct DCT/ 设备char n ame10;int busy;PCB * occupied;PCB * wait ing; struct DCT *n ext;struct COCT* coct;/ 上级控制器;struct COCT控制器char n ame10;int busy;PCB * occupied;PCB * wait ing; struct COCT *n ext;struct CHCT* chct;/控制器的上级通道;struct CHCT 通道char n ame10;int busy;PCB * occupied;PCB * wait ing;

3、 struct CHCT *n ext;/struct DCT * dets;struct COCT *eoets;struct CHCT *ehets;void enqueue(int id,char *name,int size,struct PCB *head)struct PCB*n ode=(structPCB*)malloc(sizeof(struct PCB);no de->n ext=0;no de->id=id;strepy (no de->n ame, name);no de->size=size; struct PCB *tmp=head; whi

4、le(tmp->n ext!=0) tmp=tmp->n ext;tmp->n ext=node;struct PCB * dequeue(struct PCB *head) struct PCB * tmp=head->n ex t; if(head-> next!=0)head->n ext=head->n ext- >next; tmp->n ext=0;retur n( tmp);void createProcess()prin tf("nn ame:");sca nf("%s", name)

5、;prin tf("size:");sca nf("%d", &size);prin tf("n");enq ueue(id+, name,size,ready); if(runnin g=0)runnin g=dequeue(ready);void switchProcess()if(ru nnin g!=0&&ready->n ext!=0)enq ueue(r unnin g->id,r unning->n ame,r unning ->size,ready);runnin g=d

6、equeue(ready);elseprintf("没有可切换的进程n");void blockProcess()if(runnin g=0)printf("没有可阻塞的进程n");elseenq ueue(r unnin g->id,r unning->n ame,ru nnin g->size,blocked);runnin g=0;if(ready->n ext=O)printf(”没有可执行的进程n");elserunnin g=dequeue(ready);void wakeupProcess()if(bloc

7、ked->n ext=0)printf(“没有可激活的进程");elseenq ueue(blocked->n ext->id,blocked->n ext->n ame,blocked->next->size,ready);dequeue(blocked);if(runnin g=0)runnin g=dequeue(ready);void termi nateProcess()/ 结束进程if(runnin g=0)printf("没有需要结束的进程n");elserunnin g=dequeue(ready);voi

8、d displayProcessstatus()printf(" 就绪态n");if(ready->n ext=0)printf("当前没有进程在该状态n");if(ready->n ext!=0)q=ready->n ex t;while(ready->n ext!=0)prin tf("%s",ready->n ext- >n ame);prin tf("%dn",ready->n ext->size);ready->n ext=ready->n ex

9、t->next;ready->n ext=q;printf(" 执行状态n");if(running=0) printf("当前没有进程在该状 态 n");if(ru nnin g!=0)prin tf("%s",ru nnin g->n ame);prin tf("%dn ",r unnin g->size);printf(" 阻塞状态n");if(blocked-> next=O) printf("当前没有进程在 该状态nn");if(blo

10、cked->n ext!=0)p=blocked->n ex t;while(blocked->n ext!=0)prin tf("%s",blocked->n ext- >n ame);prin tf("%dn",blocked->n ext->size);blocked->n ext = blocked->n ext->next; blocked->n ext=p;/struct DCT * findDCT(char name) /设备分 配时找到要添加的设备struct DCT *t

11、emp = dcts;while(temp->n ext!=NULL)temp = temp->n ex t;if(strcmp(temp->n ame, name)=0) return temp;return NULL;struct CHCT * fin dCha nn el(char name)struct CHCT *temp = chcts;while(temp->n ext!=NULL)temp = temp->n ex t;if(strcmp(temp->n ame, name)=O) return temp;return NULL;struct

12、 COCT * findCon troller(char n ame) struct COCT *temp = cocts;while(temp->n ext!=NULL)temp = temp->n ex t;if(strcmp(temp->n ame, name)=0) return temp;return NULL;voidaddProcesstoWait in g(structPCBwait in g,struct PCB *p) 进入进程等待队列 struct PCB *temp = wait ing; while(temp->n ext!=NULL)temp

13、 = temp->next;/temp->n ext = p;/+temp->n ext = new struct PCB;temp->next->id = p->id;strcpy(temp->n ext- >n ame,p->n ame);temp->n ext->size = p->size;temp->next->n ext = NULL;/+PCB */chct,PCBvoid add(struct PCB * head,struct node)入队列struct PCB *tmp=head;whil

14、e(tmp->n ext!=0) tmp=tmp->n ext;tmp->n ext=no de;struct PCB * getFirst(struct PCB *head) 获得队列里的第一个进程retur n head->n ext;void allocateCHCT(struct CHCT*p) 分配 CHCTif(chct->occupied!=0)printf("不能分配通道n"); addProcesstoWaiti ng(chct->wait in g,p);elsechct->occupied=p; printf(

15、"分配成功! n");add(blocked,p);if(ready!=0)runnin g=dequeue(ready);elserunnin g=0;*void allocateCOCT(struct COCT* coct,PCB *p) if(coct->occupied!=0)printf(”不能分配控制器n");addProcesstoWaiting(coct->waiti ng,p); add(blocked,p);if(ready!=O) runnin g=dequeue(ready);elserunnin g=0;return;else

16、coct->occupied=p; allocateCHCT(coct->chct,p);void allocateDCT()char nameDCT10;pri ntf("请输入设备名称:");sca nf("%s", nameDCT);struct DCT * dct=fi ndDCT( nameDCT); struct PCB * p = running; if(dct!=NULL&&p!=NULL)if(dct->occupied!=0)printf("不能分配设备n");addProcess

17、toWait in g(dct->wait in g,p); add(blocked,p);if(ready!=0)runnin g=dequeue(ready);elserunnin g=0;return;elsedct->occupied=p; allocateCOCT(dct->coct,p); /+ /*add(blocked,p);if(ready!=0)runnin g=dequeue(ready);elserunnin g=0;return;*/ /+elseprintf("发生错误!n");void releaseCHCT(char *na

18、me,struct CHCT* chct,struct PCB* p) /?if(p!=NULL)addProcesstoWait in g(chct->wait in g,p);if(strcmp( name,chct->occupied->n ame)=0)if(chct->waiti ng-> next!=NULL)chct->occupieddequeue(chct->wait in g);elsechct->occupied = NULL; void releaseCOCT(char *name,struct COCT* coct,st

19、ruct PCB* p)if(p!=NULL)addProcesstoWaiti ng(coct->wait in g,p);if(strcmp( name,coct->occupied->n ame)=0)if(coct->wait in g-> next!=NULL)coct->occupieddequeue(coct->wait in g);elsecoct->occupied = NULL;releaseCHCT(name,coct->chct,coct->occupie d); void releaseDCT()char n

20、ameDCT10;printf("请输入要释放的设备名称:n");sea nf("%s", nameDCT);char nameP10;printf("请输入要释放的进程名称:n");sea nf("%s", nameP);struct DCT *temp = fin dDCT (n ameDCT);if(strcmp(temp->occupied->n ame, nameP)=O )if(temp->wait in g->n ext!=NULL)temp->occupied dequ

21、eue(temp->wait in g);elsetemp->occupied = NULL;releaseCOCT( nameP,temp->coct,temp->occu pied);elseprintf("没有对应的设备和进程!");void addCha nn el(char n ame)struct CHCT * temp=(struct CHCT *)malloc(sizeof(struct CHCT);strcpy(temp->n ame, name);temp->n ext=0;temp->busy=O;temp-&

22、gt;wait ing = new struct PCB;temp->wait ing->n ext = NULL;temp->wait in g=0;temp->occupied=0;struct CHCT * head=chcts;进入了chcts队列while(head->n ext!=0)head=head->n ex t; head->n ext=temp;void addC on troller(char *n ame,struct chct)增加控制器struct COCT * temp=(struct *)malloc(sizeof(s

23、truct COCT);strcpy(temp->n ame, name); temp->n ext=0;temp->busy=O;temp->wait ing = new struct PCB;temp->wait ing->n ext = NULL;/temp->wait in g=0; /+ temp->occupied=0;temp->chct= chct;struct COCT * head=cocts; cocts队列while(head->n ext!=0) head=head->n ex t;CHCT *COCT

24、/进入了head->n ext=temp;void addDevice(char *n ame,struct COCT * coct)增加设备struct DCT * temp=(struct DCT *)malloc(sizeof(struct DCT);strcpy(temp->n ame, name);temp->n ext=0;temp->busy=0;temp->wait ing = new struct PCB;temp->wait ing->n ext = NULL;/temp->wait in g=0;temp->occup

25、ied=0;temp->coct= coc t;struct DCT * head=dcts;while(head->n ext!=0)head=head->n ex t;head->n ext=temp;/添加设备void add_dct()char newDCT10;printf("请输入新设备的名字:n");sea nf("%s", newDCT);char newCOCT10;printf("请输入要添加到的控制器的名 字:n");sea nf("%s", newCOCT);addD

26、evice( newDCT,fi ndCo ntroller( newCOCT);添加控制器void add_coct()char newCOCT10;printf("请输入新控制器的名字:n");scanf("%s", newCOCT);char newCHCT10;printf("请输入要添加到的通道的名字:n");scanf("%s", newCHCT);addC on troller( newCOCT,fi ndCha nn el( newC HCT);添加通道void add_chct()char new

27、CHCT10;printf("请输入新的通道的名字:n");sea nf("%s", newCHCT);addCha nn el( newCHCT);/+/+ 删 除 操 作 删除设备void deleteDCT(char n ameDCT)/char n ameDCT10;int i=0;/printf("请输入要删除DCT的名字:");/sca nf("%s", nameDCT);struct DCT * temp = fin dDCT (n ameDCT); struct DCT * head = dcts;

28、if(temp=NULL)printf("没有对应的设备!n");return ;elsewhile(head->n ext!=O) if(strcmp(temp->n ame,head->n ext- >n ame)=0)if(temp->occupied!=NULL) printf("此设备现在正在使用不能删除 n");elsehead->n ext=head->n ext- >next;i+;break;elsehead=head->n ex t;删除控制器void deleteCOCT(cha

29、r nameCOC T)structCOCT*temp=fi ndC on troller( nameCOCT);struct COCT *head=cocts;if(temp=NULL)printf("没有对应的控制器n");return;elsewhile(head->n ext!=0)if(strcmp(temp->n ame,head->n ext- >n ame)= 0)if(temp->occupied!=NULL) printf("此控制器现在正在使用不能删 除 n");else/ deleteDCT(temp

30、->);head->n ext=head->n ext- >next;break;head=head->n ex t;删除通道void deleteCHCT(char nameCHC T)structCHCT*temp=fi ndCha nn el( nameCHCT);struct CHCT *head=chcts;if(temp=NULL)printf("没有对应的通道n"); return;elsewhile(head->n ext!=0)if(strcmp(temp->n ame,head->n ext- >n

31、ame)=0)if(temp->occupied!=NULL)printf("此通道现在正在使用不能删除n");else/ deleteDCT(temp->);head->n ext=head->n ext- >next;i+;break;head=head->n ex t;/+ void displayDCT()struct DCT * dct;struct COCT *coct;struct CHCT *chct = chcts;struct PCB *pcb;/while(chct-> next!=NULL)chct = ch

32、ct- >n ex t;prin tf("%s(",chct- >n ame);if(chct->occupied!=0)prin tf("%s",chct->occupied->n ame);prin tf(")");pcb = chct->wait ing->next; /wait ing是头结点,pcb指向队列第一个进程while(pcb!=NULL)prin tf("%s",pcb->n ame);pcb = pcb->n ex t;prin tf(&q

33、uot;n");/coct = cocts;while(coct-> next!=NULL)coct = coct->n ex t;if(strcmp(coct->chct->n ame,chct->n ame)=0)printf("%s(",coct- >n ame);if(coct->occupied!=0)prin tf("%s",coct->occupied->n ame);prin tf(")");pcb = coct->wait ing->n ex

34、 t; while(pcb!=NULL)prin tf("%s",pcb->n ame);pcb = pcb->n ex t;prin tf("n");/dct = dcts;while(dct-> next!=NULL) dct = dct- >n ex t;%s(",dct-> namif(strcmp(dct->coct- >n ame,coct- >n ame)=0) prin tf("e);if(dct->occupied!=0)prin tf("%s"

35、;,dct->occupied->n ame);prin tf(")");pcb = dct->wait ing->n ex t; while(pcb!=NULL)prin tf("%s",pcb->n ame); pcb = pcb->n ex t;prin tf("n");/void mai n()dcts=(struct DCT *)malloc(sizeof(structDCT);dets->n ext=O;cocts=(struct COCT *)malloc(sizeof(stru

36、ctCOCT);cocts->n ext=0;chcts=(struct CHCT *)malloc(sizeof(structCHCT);chcts->n ext=0;addCha nn el("chct1");addCha nn el("chct2");addC on troller("coct1",fi ndCha nn el("chct1"); addCo ntroller("coct2",fi ndCha nn el("chct1");addC on t

37、roller("coct3",fi ndCha nn el("chct2"); addDevice("dct1",fi ndCon troller("coct1");addDevice("dct2",fi ndCo ntroller("coct1");addDevice("dct3",fi ndCon troller("coct2");addDevice("dct4",fi ndCon troller("c

38、oct2");addDevice("dct4",fi ndCon troller("coct3");ready=(struct PCB *)malloc(sizeof(struct PCB);blocked=(struct PCB *)malloc(sizeof(struct PCB);ready->n ext=0;blocked->n ext=0;A:while(1)int choice;int fun cti on;printf("1:创建进程 n");printf("2:切换进程 n");printf("3:阻塞进程 n");printf("4:唤醒进程 n")

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论