操作系统实验三

/*
Name: procNQue.c 进程调度模拟实验源码 存储结构链表

Description:
实现一个有 N级队列的多级反馈队列调度算法。

*/
#include "stdio.h"
#include <stdlib.h>
#include <conio.h>
#define getpch(type) (type*)malloc(sizeof(type))
#define N 3
struct pcb { /* 定义进程控制块PCB */
char name[10];
char status;
int prio;
int ntime;
int rtime;
struct pcb* link;
}*ready=NULL,*p;

typedef struct pcb PCB;


sort() /* 进程进行优先级排列函数*/
{
PCB *first, *second;
int insert=0;
if((ready==NULL)||((p->prio)>(ready->prio))) /*优先级最大者,插入队首*/
{
p->link=ready;
ready=p;
}
else /* 进程比较优先级,插入适当的位置中*/
{
first=ready;
second=first->link;
while(second!=NULL)
{
if((p->prio)>(second->prio)) /*若插入进程比当前进程优先数大,*/
{ /*插入到当前进程前面*/
p->link=second;
first->link=p;
second=NULL;
insert=1;
}
else /* 插入进程优先数最低,则插入到队尾*/
{
first=first->link;
second=second->link;
}
}
if(insert==0) first->link=p;
}
}

input() /* 建立进程控制块函数*/
{
int i,num;
/*clrscr(); */ /*清屏*/
printf(" 请输入进程数?");
scanf("%d",&num);
for(i=0;i<num;i++)
{
printf(" 进程号No.%d: ",i);
p=getpch(PCB); /*宏(type*)malloc(sizeof(type)) */
printf(" 输入进程名:");
scanf("%s",p->name);
/*printf(" 输入进程优先数:");
scanf("%d",&p->prio); */
p->prio=N;
printf(" 输入进程运行时间:");
scanf("%d",&p->ntime);
printf(" ");
p->rtime=0;p->status='r';
p->link=NULL;
sort(); /* 调用sort函数*/
}

}


int space()
{
int l=0; PCB* pr=ready;
while(pr!=NULL)
{
l++;
pr=pr->link;
}
return(l);
}


disp(PCB * pr) /*单个进程显示函数*/
{

printf("|%s ",pr->name);
printf("|%c ",pr->status);
printf("|%d ",pr->prio);
printf("|%d ",pr->ntime);
printf("|%d ",pr->rtime);
printf(" ");
}

void printbyprio(int prio)
{
PCB* pr;
pr=ready;
printf(" ****当前第%d级队列(优先数为%d)的就绪进程有: ",(N+1)-prio,prio); /*显示就绪队列状态*/
printf(" qname status prio ndtime runtime ");
while(pr!=NULL)
{
if (pr->prio==prio) disp(pr);
pr=pr->link;
}
}

check() /* 显示所有进程状态函数 */
{
PCB* pr;
int i;
printf(" /\/\/\/\当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/
printf(" qname status prio ndtime runtime ");
disp(p);

printf(" 当前就绪队列状态为: "); /*显示就绪队列状态*/
for(i=N;i>=1;i--)
printbyprio(i);
/*
while(pr!=NULL)
{
disp(pr);
pr=pr->link;
}
*/
}


destroy() /*进程撤消函数(进程运行结束,撤消进程)*/
{
printf(" 进程 [%s] 已完成. ",p->name);
free(p);
}


running() /* 运行函数。判断是否完成,完成则撤销,否则置就绪状态并插入就绪队列*/
{
int slice,i;
slice=1;
for(i=1;i<((N+1)-p->prio);i++)
slice=slice*2;

for(i=1;i<=slice;i++)
{
(p->rtime)++;
if (p->rtime==p->ntime)
break;

}
if(p->rtime==p->ntime)
destroy(); /* 调用destroy函数*/
else
{
if(p->prio>1) (p->prio)--;
p->status='r';
sort(); /*调用sort函数*/
}
}
void cteatpdisp()
/*显示(运行过程中)增加新进程后,所有就绪队列中的进程*/
{

int i;

printf(" 当增加新进程后,所有就绪队列中的进程(此时无运行进程): "); /*显示就绪队列状态*/
for(i=N;i>=1;i--)
printbyprio(i);
}
void creatp()
{
char temp;
printf(" Creat one more process?type Y (yes)");
scanf("%c",&temp);
if (temp=='y'||temp=='Y')
{
input();
cteatpdisp();
}

}

main() /*主函数*/
{
int len,h=0;
char ch;
input();
len=space();
while((len!=0)&&(ready!=NULL))
{
ch=getchar();
/*getchar();*/
h++;
printf(" The execute number:%d ",h);
p=ready;
ready=p->link;
p->link=NULL;
p->status='R';
check();
running();
creatp();
printf(" 按任一键继续......");
ch=getchar();
}
printf(" 进程已经完成. ");
ch=getchar();
ch=getchar();
}

实验结果如下:

原文地址:https://www.cnblogs.com/zhangguojing/p/5487693.html