C语言模拟实现(三)-----独占型设备分配
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                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语言模拟实现(三)-----独占型设备分配的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 一文看懂Python(九)-----可变
- 下一篇: 骑驴找马!在职期间如何优雅的去面试?
