#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语言进程调度
最新推荐文章于 2024-06-16 17:54:46 发布