/****************************************模拟操作系统的优先级调度*******************************/
/*程序结构体说明:
/*Process schedule
compiled with visual c++ 6.0
written by xiaoKINLVY and modification by HeNian
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*Define Process Structure*/
typedef struct _proc {
char name[32];
int run_time;
int req_time;/*required time*/
int pri;/*priority*/
enum {
READY = 0X01,END
}state;/*process state*/
struct _proc *next;
}PROC;
int g_TotalTimeSlices = 0;
PROC *g_Head = NULL, *g_Curr = NULL;
void insertSort(PROC*p);
void init()
{
PROC*p;
g_Head=(PROC*)malloc(sizeof(PROC));
g_Head->next=NULL;
p=(PROC*)malloc(sizeof(PROC));
strcpy(p->name,"P1");
p->run_time=0;
p->req_time=2;
p->pri=1;
p->state=PROC.READY;
insertSort(p);
p = (PROC*)malloc(sizeof(PROC));
strcpy(p->name, "P2");
p->run_time = 0;
p->req_time = 3;
p->pri = 5;
p->state = PROC.READY;
insertSort(p);
p = (PROC*)malloc(sizeof(PROC));
strcpy(p->name, "P3");
p->run_time = 0;
p->req_time = 1;
p->pri = 3;
p->state = PROC.READY;
insertSort(p);
p = (PROC*)malloc(sizeof(PROC));
strcpy(p->name, "P4");
p->run_time = 0;
p->req_time = 2;
p->pri = 4;
p->state = PROC.READY;
insertSort(p);
p = (PROC*)malloc(sizeof(PROC));
strcpy(p->name, "P5");
p->run_time = 0;
p->req_time = 4;
p->pri = 2;
p->state = PROC.READY;
insertSort(p);
}
void insertSort(PROC*p)
{
PROC *p0,*p1;
p0=g_Head;
p1=g_Head->next;
if(g_Head->next==NULL)
{
p->next=g_Head->next;
g_Head->next=p;
}
else
{
while(true)
{
if(p->pri>p1->pri)
{
while(p0->next!=NULL)
{
if(p0->next==p1)
{
break;
}
else
{
p0=p0->next;
}
}
p->next=p1;
p0->next=p;
break;
}
else if(p1->next==NULL)
{
p1->next=p;
p->next=NULL;
break;
}
else
{
p1=p1->next;
}
}
}
}
void PrintInfo()
{
PROC *p = g_Head->next;
printf("Time : %d/t Process Information/n", g_TotalTimeSlices);
printf("name run_time req_time pri state/n");
printf("------------------------------------/n");
while(p != NULL){
printf("%4s %8d %8d %3d %5s/n", p->name, p->run_time, p->req_time,
p->pri, p->state == PROC.READY? "READY" : "END");
p = p->next;
}
printf("Current process is %s/n", g_Curr->name);
printf("-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+/n/n");
}
void DeleteP(PROC*p)
{
PROC*p1=g_Head;
while(p1->next!=NULL)
{
if(p1->next==p)
break;
else
p1=p1->next;
}
p1->next=p->next;
}
void Run()
{
PrintInfo();
g_Curr=(PROC*)malloc(sizeof(PROC));
while(g_Head->next!=NULL)
{
PROC*p_temp=NULL;
g_Curr=g_Head->next;
g_TotalTimeSlices++;
g_Curr->req_time--;
g_Curr->run_time++;
g_Curr->pri--;
if(g_Curr->req_time!=0)
{
PrintInfo();
DeleteP(g_Curr);
insertSort(g_Curr);
}
else
{
g_Curr->state=PROC.END;
PrintInfo();
//delete Function
DeleteP(g_Curr);
//PrintInfo();
}
/* g_TotalTimeSlices++;
g_Curr->req_time--;
g_Curr->run_time++;
g_Curr->pri--;*/
}
}
int main()
{
init();
Run();
free(g_Head);
return 0;
}