#include<stdio.h> #include<stdlib.h> #include<string.h> #include<windows.h> #include <time.h> typedef struct PCB{ int id; int priority; int STime; int timePiece; int state; struct PCB* next; }pcb; //0 执行态 //1 就绪态 //1 阻塞态 int idNum=0; pcb * ready; pcb * block; pcb * current; int num=0; int notwork=0; void insertToColumn(pcb * column,pcb * newPcb) { int succ = 0; pcb *last = column; pcb *p = column->next; while(p!=NULL) { if(newPcb->priority< p->priority) { last->next = newPcb; newPcb->next = p; succ = 1; break; } last = p; p = p->next; } if(!succ)last->next = newPcb; } void diaodu() { current = ready->next; if(ready->next==NULL) { printf("当前没有进程可运行"); notwork = 1; } else ready->next = ready->next->next; current->next = NULL; } void rollback(int id) { if(current->id==id) { notwork=1; return; } pcb *p = ready->next; pcb *old = ready; while(p!=NULL) { if(p->id==id) { old->next=p->next; // delete p; return; } old = p; p = p->next; } p = block->next; old = block; while(p!=NULL) { if(p->id==id) { old->next=p->next; return; } old = p; p = p->next; } } void create() { srand((unsigned)time(NULL)); pcb *newPcb = (pcb *)malloc(sizeof(pcb)); newPcb->id = idNum++; newPcb->priority = rand()%255; newPcb->state = 1; newPcb->STime=0; newPcb->timePiece = 10; newPcb->next = NULL; num++; if(num==1) current = newPcb; else insertToColumn(ready,newPcb); if(!current)diaodu(); } void blockPro(pcb * column) { pcb * p = current; p->next==NULL; diaodu(); insertToColumn(column,p); } void show() { printf("执行的任务"); if(current!=NULL) printf("(%d,%d)\n",current->id,current->priority); printf("\n就绪队列"); pcb *p = ready; if(p->next==NULL)printf("\n"); while(p->next != NULL) { p=p->next; printf("(%d,%d)",p->id,p->priority); if(p->next==NULL)printf("\n"); else printf("->"); } printf("\n阻塞队列"); p = block; if(p->next==NULL)printf("\n"); while(p->next != NULL) { p=p->next; printf("(%d,%d)",p->id,p->priority); if(p->next==NULL)printf("\n"); else printf("->"); } } void back(int id) { pcb *p = block->next; pcb *old = block; while(p!=NULL) { if(p->id==id) { old->next = p->next; p->next = NULL; insertToColumn(ready,p); break; } old = p; p = p->next; } if(p==NULL)printf("不存在id=%d的进程\n",id); if(notwork)diaodu(); } void menu() { printf("\n------------------------------\n"); printf("请输入数字,选择一个操作\n"); printf("0 进程创建\n"); printf("1 进程撤销\n"); printf("2 进程阻塞\n"); printf("3 进程唤醒\n"); printf("4 时间片用完\n"); printf("5 进程结束\n"); printf("------------------------------\n"); int n; int id; scanf("%d",&n); switch(n) { case 0: create(); show(); break; case 1: printf("请输入进程id\n"); scanf("%d",&id); rollback(id); if(notwork)diaodu(); show(); break; case 2: blockPro(block); show(); break; case 3: printf("请输入进程id\n"); scanf("%d",&id); back(id); show(); break; case 4: blockPro(ready); //diaodu(); show(); break; case 5: diaodu(); show(); break; default:exit(0); } } int main() { ready = (pcb *)malloc(sizeof(pcb)); block = (pcb *)malloc(sizeof(pcb)); ready->next = NULL; block->next = NULL; for(;;)menu(); return 0; }
c语言进程调度
猜你喜欢
转载自blog.csdn.net/baidu_38370610/article/details/80273536
今日推荐
周排行