独占型设备分配相关概念

有关独占型设备分配的相关内容,在这位老师的这篇博客(https://blog.csdn.net/dongyanxia1000/article/details/51862577)中,写的十分详细。十分感谢老师的分享。

实验环境

实验前提条件

假如系统中已经存在4类设备,每类设备各一个;3个设备控制器,设备控制器可以添加,添加系统中已存在的设备时,不需要添加设备控制器,而添加系统中不存在的设备时,需要自己手动添加新的设备控制器;2个通道;只有设备、设备控制器、通道三者同时被申请成功,设备才能分配成功。本实验中,通道不能添加。

实验相关代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define  MAX   100
typedef struct pcb/*进程*/
{int pcbID;     /*进程名称*/struct pcb *next;
}PCB;typedef struct chct//通道控制表
{int chctID;int status;//设备状态PCB *block;//阻塞队列
}CHCT;typedef struct coct//控制器控制表
{int coctID;int status;//设备状态CHCT *chct;//控制器所连接的通道PCB *block;//阻塞队列struct coct *next;//控制器队列
}COCT;typedef struct dct//设备控制表
{int dctID;int status;//设备状态int processid;//占用进程IDPCB *block;//阻塞队列指针COCT *coct;//与设备控制器相关连的控制器控制表struct dct* next;//同类设备的不同设备
}DCT;
typedef struct sdt//系统设备表
{char type;//系统设备表类型char name[MAX];//系统设备表名称DCT *dct;//DCT设备控制表struct sdt *next;//驱动入口地址
}SDT;
/*设置全局变量   2个通道、3个设备控制器、4个设备*/
CHCT *CH1,*CH2;//两个通道ch1,ch2
COCT *coct_head;//控制器控制表头部
SDT *sdt_head;
void init()
{PCB *ch1pcbblock,*ch2pcbblock,*co1pcbblock,*co2pcbblock,*co3pcbblock,*d1pcbblock,*d2pcbblock,*d3pcbblock,*d4pcbblock;//各个设备的等待队列COCT*CO1,*CO2,*CO3;DCT *dct1,*dct2,*dct3,*dct4;SDT *sdt1,*sdt2,*sdt3,*sdt4;CH1=(CHCT*)malloc(sizeof(CHCT));CH2=(CHCT*)malloc(sizeof(CHCT));CH1->status=0;CH2->status=0;CH1->chctID = 1;CH2->chctID = 2;ch1pcbblock=(PCB*)malloc(sizeof(PCB));ch2pcbblock=(PCB*)malloc(sizeof(PCB));ch1pcbblock->next=NULL;ch2pcbblock->next=NULL;CH1->block=ch1pcbblock;CH2->block=ch2pcbblock;coct_head=(COCT*)malloc(sizeof(COCT));coct_head->next=NULL;CO1=(COCT*)malloc(sizeof(COCT));CO2=(COCT*)malloc(sizeof(COCT));CO3=(COCT*)malloc(sizeof(COCT));CO1->status=0;CO2->status=0;CO3->status=0;coct_head->next=CO1;CO1->next=CO2;CO2->next=CO3;CO3->next=NULL;co1pcbblock=(PCB *)malloc(sizeof(PCB));co1pcbblock->next=NULL;co2pcbblock=(PCB *)malloc(sizeof(PCB));co2pcbblock->next=NULL;co3pcbblock=(PCB *)malloc(sizeof(PCB));co3pcbblock->next=NULL;CO1->coctID = 1;CO2->coctID = 2;CO3->coctID = 3;//随机分配起始时的通道和控制的连接情况CO1->chct=CH1;CO2->chct=CH1;CO3->chct=CH2;CO1->block=co1pcbblock;CO2->block=co2pcbblock;CO3->block=co3pcbblock;d1pcbblock=(PCB *)malloc(sizeof(PCB));d2pcbblock=(PCB *)malloc(sizeof(PCB));d3pcbblock=(PCB *)malloc(sizeof(PCB));d4pcbblock=(PCB *)malloc(sizeof(PCB));d1pcbblock->next=NULL;d2pcbblock->next=NULL;d3pcbblock->next=NULL;d3pcbblock->next=NULL;dct1=(DCT *)malloc(sizeof(DCT));dct2=(DCT *)malloc(sizeof(DCT));dct3=(DCT *)malloc(sizeof(DCT));dct4=(DCT *)malloc(sizeof(DCT));dct1->dctID = 1;dct2->dctID = 1;dct3->dctID = 1;dct4->dctID = 1;dct1->coct=CO1;dct2->coct=CO2;dct3->coct=CO3;dct4->coct=CO3;dct1->status=0;dct2->status=0;dct3->status=0;dct4->status=0;//同类设备链表dct1->next = NULL;dct2->next = NULL;dct3->next = NULL;dct4->next = NULL;dct1->block=d1pcbblock;dct2->block=d2pcbblock;dct3->block=d3pcbblock;dct4->block=d4pcbblock;sdt_head=(SDT *)malloc(sizeof(SDT));sdt_head->next=NULL;sdt1=(SDT *)malloc(sizeof(SDT));sdt2=(SDT *)malloc(sizeof(SDT));sdt3=(SDT *)malloc(sizeof(SDT));sdt4=(SDT *)malloc(sizeof(SDT));sdt_head->next=sdt1;sdt1->next=sdt2;sdt2->next=sdt3;sdt3->next=sdt4;sdt4->next = NULL;strcpy(sdt1->name,"printer");strcpy(sdt2->name,"screen");strcpy(sdt3->name,"keyboad");strcpy(sdt4->name,"mouse");sdt1->dct=dct1;sdt2->dct=dct2;sdt3->dct=dct3;sdt4->dct=dct4;
}
/**遍历sdt表,找到相应的设备类
*/
SDT* TravseSDT(char searchname[]){SDT* tmp;tmp = sdt_head->next;while(tmp!=NULL){
//        printf("%s\n",tmp->name);if(strcmp(tmp->name,searchname) == 0){printf("a:%s\n",tmp->name);return tmp;}tmp = tmp->next;}return sdt_head;
}
/**显示所有的设备及状态
*/
void display(){SDT* sdttmp = sdt_head->next;DCT* dcttmp = NULL;printf("SDT   设备ID  设备状态 所连COCT的ID  COCT状态   所连CHCT的ID   CHCT状态\n");while(sdttmp != NULL){dcttmp = sdttmp->dct;while(dcttmp != NULL){printf("%s\t%d\t%d         %d            %d             %d         %d\n",sdttmp->name,dcttmp->dctID,dcttmp->status,dcttmp->coct->coctID,dcttmp->coct->status,dcttmp->coct->chct->chctID,dcttmp->coct->chct->status);dcttmp = dcttmp->next;}sdttmp = sdttmp->next;}
}/**
void displaySDT(){SDT* p = sdt_head->next;while(p!=NULL){printf("%s\n",p->name);p = p->next;}
}
*//**添加设备
*/
void addDevice(){int channelid;//通道号printf("请输入待添加设备的名称\n");char devicename[30];scanf("%s",devicename);SDT* cur = TravseSDT(devicename);DCT* pt = cur->dct;if(cur != sdt_head){//添加已知种类的设备while(pt->next!=NULL){pt=pt->next;}DCT* p = (DCT*)malloc(sizeof(DCT));pt->next = p;p->next = NULL;printf("请输入待添加设备的标识\n");scanf("%d",&p->dctID);p->status = 0;p->block = (PCB*)malloc(sizeof(PCB));p->coct = cur->dct->coct;}else{//添加新的种类的设备SDT* newsdt = (SDT*)malloc(sizeof(SDT));newsdt->next= sdt_head->next;sdt_head->next = newsdt;DCT* newdct = (DCT*)malloc(sizeof(SDT));newdct->dctID = 1;newdct->status=0;strcpy(newsdt->name,devicename);newsdt->dct=newdct;newdct->next = NULL;printf("请输入要添加设备控制器的信息\n");COCT* con = (COCT*)malloc(sizeof(COCT));newdct->coct = con;con->next = coct_head->next;coct_head->next = con;printf("请输入控制器的标识\n");scanf("%d",&con->coctID);con->status=0;printf("请输入要使用的通道号\n");scanf("%d",&channelid);if(channelid == 1){con->chct = CH1;}if(channelid == 2){con->chct = CH2;}con->block = (PCB*)malloc(sizeof(PCB));}
}
/**删除设备
*/
void deleteDevice(){printf("请输入要删除的设备的种类名称\n");char deletename[30];scanf("%s",deletename);SDT* tmp = TravseSDT(deletename);//找到该类设备的sdtint i =1;if(tmp!=sdt_head){printf("请输入要删除设备的ID\n");int deleteid;scanf("%d",&deleteid);DCT* cur = tmp->dct;while(cur != NULL){if(cur->dctID == deleteid && i==1){//删除找到的设备ID,删除第一个节点tmp->dct = cur->next;break;}else if(cur->next->dctID == deleteid && cur->next->next != NULL){//中间节点DCT* p = cur->next;p->coct = NULL;cur->next = cur->next->next;free(p);break;}else if(cur->next->dctID == deleteid && cur->next->next == NULL){//最后一个节点cur->next = NULL;}cur =  cur->next;i++;}}else{printf("该类设备不存在\n");}}
/**分配设备
*/
void allotDevice(){PCB* pro = (PCB*)malloc(sizeof(PCB));printf("输入进程标识\n");scanf("%d",&pro->pcbID);pro->next = NULL;printf("请输入要申请的设备种类名称\n");char name[30];scanf("%s",name);//判断所有该类设备是否有空闲的SDT* p = sdt_head->next;DCT* pt = NULL;int flag=0;while(p!=NULL){if(strcmp(p->name,name) == 0){//找到该类设备pt = p->dct;while(pt!=NULL){if(pt->status == 0){//设备可用pt->status =1;flag = 1;break;}pt = pt->next;}if(flag==1){if(pt->coct->status == 0){//该类设备对应的设备控制器可用pt->coct->status = 1;if(pt->coct->chct->status == 0){//相应的通道可用pt->coct->chct->status =1;printf("设备分配成功\n");}else{//进入相应的通道等待队列printf("通道忙碌\n");PCB* newpcb = (PCB*)malloc(sizeof(PCB));newpcb->next = pt->coct->chct->block->next;pt->coct->chct->block->next = newpcb;}}else{//进入该设备相应的设备控制器等待队列printf("设备控制器忙碌\n");PCB* newpcb = (PCB*)malloc(sizeof(PCB));newpcb->next = pt->coct->block->next;pt->coct->block->next = newpcb;}}else{//进入设备等待队列printf("设备忙碌\n");PCB* newpcb = (PCB*)malloc(sizeof(PCB));newpcb->next = pt->block->next;pt->block->next = newpcb;}}p = p->next;}
}/**回收设备
*/
void reclaimDevice(){printf("请输入要回收的设备种类\n");char reclainname[30];scanf("%s",reclainname);int reclainID;//回收设备号SDT* p = sdt_head->next;DCT* pt = NULL;while(p!=NULL){if(strcmp(reclainname,p->name) == 0){//找到该类设备printf("请输入要回收的设备ID\n");scanf("%d",&reclainID);pt = p->dct;while(pt!=NULL){if(pt->dctID == reclainID){pt->status=0;
//                    pt->coct->status =0;
//                    pt->coct->chct->status = 0;}pt=pt->next;}}p = p->next;}
}
int main()
{//初始化init();display();int NUM;while(1){printf("----选项----\n");printf("NUM = 1:添加设备\n");printf("NUM = 2:删除设备\n");printf("NUM = 3:分配设备\n");printf("NUM = 4:回收设备\n");printf("请输入NUM:");scanf("%d",&NUM);if(NUM == 1){addDevice();display();}else if(NUM == 2){deleteDevice();display();}else if(NUM == 3){allotDevice();display();}else{reclaimDevice();display();}}return 0;
}

C语言模拟实现(三)-----独占型设备分配相关推荐

  1. 闽高校计算机二级c语言模拟器,闽高校计算机二级C语言模拟卷及答案.doc

    闽高校计算机二级C语言模拟卷及答案.doc (54页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 一.单项选择题(每小题2分,共20分) ...

  2. C语言模拟11答案,C语言模拟试题11答案.doc

    C语言模拟试题11答案.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文档 ...

  3. c语言中输出1st,高等学校计算机等级考试C语言模拟试题1st-all.doc

    高等学校计算机等级考试C语言模拟试题1st-all 上海市高等学校计算机等级考试C语言模拟试题 学院 _____________ 班级 __________ 姓名 __________ 学号 ____ ...

  4. 下列选项中属于c语言合法变量名的是,计算机二级考试C语言模拟练习

    C语言是一个有结构化程序设计.具有变量作用域以及递归功能的过程式语言.下面给大家整理了计算机二级考试C语言模拟练习,一起来看看吧! 计算机二级考试C语言模拟练习 1). 关于C语言的变量,以下叙述中错 ...

  5. 计算机专业c语言用的软件,计算机C语言模拟练习

    计算机C语言模拟练习 计算机C语言模拟练习1 一分钟一秒钟自满,在这一分一秒间就停止了自己吸收的生命和排泄的生命.只有接受批评才能排泄精神的一切渣滓.只有吸收他人的意见.我才能添加精神上新的滋养品.以 ...

  6. 闽高校计算机二级c语言模拟器,闽高校计算机二级C语言模拟卷及答案教案.doc

    闽高校计算机二级C语言模拟卷及答案教案 一.单项选择题(每小题2分,共20分) 1.以下4组用户定义标识符中,全部合法的一组是(). A)_totalclu_1sum B)if-maxturb C)t ...

  7. 偶数数位求和c语言4286,闽高校计算机二级C语言模拟题.doc

    闽高校计算机二级C语言模拟题.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3. ...

  8. 2015年9月全国二级C语言,2015年9月全国计算机二级C语言模拟题

    2015年9月全国计算机二级C语言模拟题 点击查看试题参考答案 17.在函数中默认存储类型说明符的变量应该是________存储类型. A.内部静态 B. 外部 C.自动 D. 寄存器 18.C语言中 ...

  9. 厦门大学c语言课程资源,厦门大学c语言模拟题讲评及课程复习.ppt

    <厦门大学c语言模拟题讲评及课程复习.ppt>由会员分享,可在线阅读,更多相关<厦门大学c语言模拟题讲评及课程复习.ppt(33页珍藏版)>请在装配图网上搜索. 1.C语言程序 ...

最新文章

  1. cacti系列(一)之cacti的安装及配置监控mysql服务
  2. STM32F407 I2C 个人笔记
  3. Ubuntu下打开rar乱码问题的解决方法
  4. hdu1010深搜+奇偶剪枝
  5. 为什么用Object.prototype.toString.call(obj)检测对象类型?
  6. 无需羡慕,今后.NET开发想拿30k也可以毫不费劲!
  7. iar环境下c语言编程,c语言_源代码-iar环境配置.pdf
  8. 开发者该如何利用 C# 加解密?
  9. C语言|编程|判断素数
  10. WPF中如何在文本外面加虚线外框
  11. linux彻底卸载 mysql
  12. 网络安全从小白到专家
  13. 上波浪线符号复制_波浪线符号(word小技巧)
  14. 关于跑步,总感觉得写点什么!
  15. Python教程: ‘==‘ 与‘is‘ 以及它们背后的小秘密
  16. app小程序手机端Python爬虫开发00-课程介绍
  17. VC++2010组件安装失败解决办法
  18. HDU1814和平委员会
  19. html实训报告致谢,学术论文致谢词范文
  20. 从烽火狼烟到飞鸽传书,古人都是怎么通信的?

热门文章

  1. Arduino LiquidCrystal库函数中文对照
  2. 实战项目---模拟商品采购中心信息平台
  3. Alien 快速安装 Rippled 节点【Ubuntu】
  4. ZooKeeper: 简介, 配置及运维指南
  5. bzoj2194 快速傅立叶之二
  6. Kotlin 文档 .Google 正式确定将 Kotlin为android 开发语言
  7. 基于Angularjs+jasmine+karma的测试驱动开发(TDD)实例
  8. 关于引用传递的测试题
  9. 加载NMGameX.dll时出错?
  10. windows 解决 Go下载包失败 设置代理