日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言模拟实现(三)-----独占型设备分配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

獨占型設備分配相關概念

有關獨占型設備分配的相關內容,在這位老師的這篇博客(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语言模拟实现(三)-----独占型设备分配的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 制中文字幕音影 | 久久色在线 | 亚洲天堂2015 | 精品一二三四 | 色多多在线视频 | 久久视频在线播放 | 国产美女无遮挡永久免费观看 | 99久久精品国产亚洲 | 黄色片视频免费在线观看 | 丰满人妻一区二区三区精品高清 | 美女啪啪网| 亚洲精品动漫在线观看 | 久久男女视频 | 九九热精品免费视频 | 99操| 大地资源二中文在线影视观看 | 福利网址在线观看 | 欧美色图亚洲天堂 | 人妻少妇一区 | 日本人妻丰满熟妇久久久久久 | 先锋影音av资源在线 | 国产精品久久99 | 九九久久久 | 国产在线视频网站 | 精品国产一区二区不卡 | www.国产黄色 | 久久理论视频 | 日本一区二区不卡在线观看 | 女性向片在线观看 | 久久中文精品 | 国产欧美一区二区精品忘忧草 | 欧美成人三级伦在线观看 | 亚洲av无码成人精品区 | 国产一av| 成人午夜久久 | av免费在线观看网站 | 人人人妻人人澡人人爽欧美一区 | 日本美女动态图 | 国产麻豆免费视频 | 麻豆av电影在线观看 | 奇米影视狠狠 | 欧美成人吸奶水做爰 | 2021国产在线视频 | 女性裸体视频网站 | 久久久久99人妻一区二区三区 | 久久久噜噜噜久久久 | 四虎影视免费看 | 免费日韩 | 久久久999视频 | 国产看黄网站 | 欧美顶级少妇做爰 | 91久久国产综合久久91精品网站 | 色又黄又爽 | 国产精品亚洲天堂 | 少妇的被肉日常np | 中文字幕一区二区三区四区不卡 | 在线免费观看av网站 | 中文有码在线观看 | 男生女生搞鸡视频 | 久久久夜色 | 国产任你操 | 久久久蜜桃一区二区人 | 亚洲中字幕 | 久久亚洲精品中文字幕 | 黄瓜视频色 | 国产又黄又猛又粗 | 中文字幕免费中文 | 男女在线视频 | 亚洲精品在线视频免费观看 | 一区二区三区四区影院 | 又色又爽又黄无遮挡的免费视频 | 国产精品久久久久一区二区三区 | 成人a网| 国产中文字幕一区 | 日本少妇激三级做爰在线 | 在线观看视频亚洲 | 99精品免费在线观看 | 在线播放av网站 | 国产超91 | 伊人久久麻豆 | 搞中出| 日韩免费高清视频 | 在线成人中文字幕 | 中国黄色一级大片 | 国产在线国偷精品免费看 | 亚洲天堂av线 | 欧美色图3p | 久久精品一区二 | 天天综合网站 | 国产日韩片 | 在线观看免费小视频 | 爱啪啪网站 | www免费网站在线观看 | 青草草在线观看 | 欧美一二三四五区 | 日韩av一区二区在线观看 | 加勒比hezyo黑人专区 | 国产又粗又猛又黄又爽 | 国产做受高潮漫动 |