资源简介

进程是操作系统中最基本、最重要的概念,进程调度又是操作系统的核心模块。本实验要求学生独立地编写一个简单的进程管理程序,其主要部分是进程调度。调度算法可由学生自行选择,这里选用多级反馈队列调度算法。

资源截图

代码片段和文件信息

#include    
#include    
#include 

typedef struct node   /*进程节点信息*/  
{   
char name[20];   /*进程的名字*/  
int prio;    /*进程的优先级*/  
int round;    /*分配CPU的时间片*/  
int cputime;   /*CPU执行时间*/  
int needtime;   /*进程执行所需要的时间*/  
int arrivetime; /*进程抵达的时刻*/
char state;    /*进程的状态,W--就绪态,R--执行态,F--完成态*/  
int count;    /*记录执行的次数*/  
struct node *next;  /*链表指针*/  
}PCB;   

typedef struct Queue  /*多级就绪队列节点信息*/  
{   
PCB *linkPCB;   /*就绪队列中的进程队列指针*/  
int prio;    /*本就绪队列的优先级*/  
int round;    /*本就绪队列所分配的时间片*/  
struct Queue *next;  /*指向下一个就绪队列的链表指针*/  
}ReadyQueue;
   
PCB *run=NULL*finish=NULL; /*定义执行队列和完成队列*/  
ReadyQueue *Head = NULL; /*定义第一个就绪队列*/  
int num;     /*进程个数*/  
int ReadyNum;    /*就绪队列个数*/  
void Output();          /*进程信息输出函数*/  
void InsertFinish(PCB *in);       /*将进程插入到完成队列尾部*/  
void InsertPrio(ReadyQueue *in);     /*创建就绪队列,规定优先数越大,优先级越低*/  
void PrioCreate();         /*创建就绪队列输入函数,优先数等于就绪队列所分配到的时间片,时间片越多,优先级越低*/  
void GetFirst(ReadyQueue *queue);     /*取得某一个就绪队列中的队头进程*/  
void InsertLast(PCB *inReadyQueue *queue);   /*将进程插入到就绪队列尾部*/  
void ProcessCreate();        /*进程创建函数*/  
void RoundRun(ReadyQueue *timechip);    /*时间片轮转调度算法*/  
void MultiDispatch();        /*多级调度算法,每次执行一个时间片*/  

int main(void)   
{
PrioCreate(); /*创建就绪队列*/  
ProcessCreate();/*创建就绪进程*/ 
Output();
printf(“\n\n开始调度\n“);
MultiDispatch();/*算法开始*/ 
printf(“\n\n最终结果\n“);
Output();  /*输出最终的调度序列*/  
return 0;   
}

void Output()  /*进程信息输出函数*/  
{
ReadyQueue *print = Head;   
PCB *p;   
printf(“进程名\t优先级\t抵达\tcpu分配\tcpu执行\t需要时间\t进程状态\n“);   
while(print)   
{   
if(print ->linkPCB != NULL)   
{   
p=print ->linkPCB;   
while(p)   
{   
printf(“%s\t%d\t%d\t%d\t%d\t%d\t\t%c\n“p->namep->priop->arrivetimep->roundp->cputimep->needtimep->state);      
p = p->next;   
}   
}   
print = print->next;   
}   
p = finish;   /*进程指向完成队列*/
while(p!=NULL)   
{   
printf(“%s\t%d\t%d\t%d\t%d\t%d\t\t%c\n“p->namep->priop->arrivetimep->roundp->cputimep->needtimep->state);    
p = p->next;   
}   
p = run;   /*进程指向执行队列*/
while(p!=NULL)   
{   
printf(“%s\t%d\t%d\t%d\t%d\t%d\t\t%c\n“p->namep->priop->arrivetimep->roundp->cputimep->needtimep->state);    
p = p->next;   
}   
}
  


void PrioCreate() /*创建就绪队列*/  
{
ReadyQueue *q;   
int i;  
printf(“输入就绪队列的个数:\n“);   
scanf(“%d“&ReadyNum);     
printf(“输入每个就绪队列分配的CPU时间片:\n“);   
for(i = 0;i < ReadyNum; i++)   
{
if((q = (ReadyQueue *)malloc(sizeof(ReadyQueue)))==NULL)   
{
perror(“malloc“);   
exit(1);   
}
scanf(“%d“&(q->round));  /*输入此就绪队列中给每个进程所分配的CPU时间片*/  
q ->prio = q->round;  /*设置其优先级,时间片越高,其优先级越低*/  
q ->linkPCB = NULL;    /*初始化其连接的进程队列为空*/  
q ->next = NULL;
InsertPrio(q);     /*按照优先级从高到低,建立多个就绪队列*/  
}   


void InsertPrio(ReadyQueue *in)  /*创建就绪

评论

共有 条评论