c语言进程调度

#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;
}

猜你喜欢

转载自blog.csdn.net/baidu_38370610/article/details/80273536