简单轮转法。
其基本思想是:所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。如果运行进程用完它的时间片后还为完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕。
#include <stdio.h>
#define getpch(type) (type*)malloc(sizeof(type))
//#define NULL 0
struct pcb { /* 定义进程控制块PCB */
char name[10];
char state;
int super;
int ntime;
int rtime;
struct pcb * link;
}*ready=NULL,*p;
typedef struct pcb PCB;
void sort() /* 建立对进程进行优先级排列函数(插入排序)*/
{
PCB *first;
first=ready;//read是head结点
if (ready==NULL)
ready=p;
else{
while (first->link!=NULL)
first=first->link;//将first设置为tail结点
first->link=p;//新输入的结点挂在队尾
}
return;
}
void input() /* 建立进程控制块函数*/
{
int i,num;
//clrscr(); /*清屏*/
printf("\n 请输入进程个数?");
scanf("%d",&num);
for(i=0;i<num;i++)
{
printf("\n 进程号No.%d:\n",i);
p=getpch(PCB);
printf("\n 输入进程名:");
scanf("%s",p->name);
printf("\n 输入进程优先数:");
scanf("%d",&p->super);
printf("\n 输入进程运行时间:");
scanf("%d",&p->ntime);
printf("\n");
p->rtime=0;p->state='w';
p->link=NULL;
sort(); /* 调用sort函数*/
}
return;
}
void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/
{
printf("\n qname \t state \t super \t ndtime \t runtime \n");
printf(" |%s\t",pr->name);
printf(" |%c\t",pr->state);
printf(" |%d\t",pr->super);
printf(" |%d\t",pr->ntime);
printf(" |%d\t",pr->rtime);
printf("\n");
return;
}
void check() /* 建立进程查看函数 */
{
PCB* pr;
printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/
disp(p);
pr=ready;//pr为就绪队列的head进程
printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/
while(pr!=NULL)//显示就绪队列中的全部进程
{
disp(pr);
pr=pr->link;
}
return;
}
void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/
{
printf("\n 进程 [%s] 已完成.\n",p->name);
free(p);
return;
}
void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/
{
(p->rtime)++;//得到CPU分配的时间+1
if(p->rtime==p->ntime)//分配的时间等于所需运行时间,表示运行结束
destroy(); /* 调用destroy函数*/
else
{
p->state='w';
sort(); /*调用sort函数*/
}
return;
}
void main() /*主函数*/
{
int h=0;
char ch;
input();
ch=getchar();
while(ready!=NULL)
{
h++;
printf("\n The execute number:%d \n",h);
p=ready;//每次取head结点的进程
ready=p->link;//head置为队列中第二个结点
p->link=NULL;//取下head结点
p->state='R';//状态设置为就绪ready
check();
running();
printf("\n 按任一键继续......");
ch=getchar();
}
printf("\n\n 进程已经完成.\n");
ch=getchar();
return;
}
最高优先数优先
/*
编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对多个并发进程进行调度。
要求:采用动态优先数。
即进程的优先数在创建进程时可以给定一个初始值,
并且可以按一定原则修改优先数:在进程获得一次CPU后就将其优先数减少1。
*/
#include <stdio.h>
#define getpch(type) (type*)malloc(sizeof(type))
//#define NULL 0
struct pcb { /* 定义进程控制块PCB */
char name[10];
char state;
int super;
int ntime;
int rtime;
struct pcb * link;
}*ready=NULL,*p,*s;
typedef struct pcb PCB;
void sort() /* 建立对进程进行优先级排列函数(插入排序)*/
{
PCB *first,*m,*q;
//head=ready;//read是head结点
if (ready==NULL)
ready=p;
else{
first=p;//要插入的结点为first
for(q=ready;(q!=NULL)&&(q->super<first->super);m=q,q=q->link);//寻找插入位置
if(q==ready)
{
first->link=ready;//先连
ready=first;//后断
}
else//插在m之后,q之前
{
first->link=q;//先连
m->link=first;//后断
}
}
return;
}
void input() /* 建立进程控制块函数*/
{
int i,num;
//clrscr(); /*清屏*/
printf("\n 请输入进程个数?");
scanf("%d",&num);
for(i=0;i<num;i++)
{
printf("\n 进程号No.%d:\n",i);
p=getpch(PCB);
printf("\n 输入进程名:");
scanf("%s",p->name);
printf("\n 输入进程优先数:");
scanf("%d",&p->super);
printf("\n 输入进程运行时间:");
scanf("%d",&p->ntime);
printf("\n");
p->rtime=0;p->state='w';
p->link=NULL;
sort(); /* 调用sort函数*/
}
return;
}
void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/
{
printf("\n qname \t state \t super \t ndtime \t runtime \n");
printf(" |%s\t",pr->name);
printf(" |%c\t",pr->state);
printf(" |%d\t",pr->super);
printf(" |%d\t",pr->ntime);
printf(" |%d\t",pr->rtime);
printf("\n");
return;
}
void check() /* 建立进程查看函数 */
{
PCB* pr;
printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/
disp(p);
pr=ready;//pr为就绪队列的head进程
printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/
while(pr!=NULL)//显示就绪队列中的全部进程
{
disp(pr);
pr=pr->link;
}
return;
}
void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/
{
printf("\n 进程 [%s] 已完成.\n",p->name);
free(p);
return;
}
void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/
{
(p->rtime)++;//得到CPU分配的时间+1
(p->super)++;//进程获得一次CPU之后优先级减1,优先数越小优先级越高
if(p->rtime==p->ntime)//分配的时间等于所需运行时间,表示运行结束
destroy(); /* 调用destroy函数*/
else
{
p->state='w';
sort(); /*调用sort函数*/
}
return;
}
void main() /*主函数*/
{
int h=0;
char ch;
input();
ch=getchar();
while(ready!=NULL)
{
h++;
printf("\n The execute number:%d \n",h);
p=ready;//每次取head结点的进程
ready=p->link;//head置为队列中第二个结点
p->link=NULL;//取下head结点
p->state='R';//状态设置为就绪ready
check();
running();
printf("\n 按任一键继续......");
ch=getchar();
}
printf("\n\n 进程已经完成.\n");
ch=getchar();
return;
}
代码测试
创建3个进程,a,b,c,初始优先数分别为2,1,3(优先数越小优先级越高),运行时间都为3。
3个进程的运行时间总和为9,CPU时间片为1,所以进行9次运行之后,3个进程全部运行结束;
进程被CPU调度一次,优先数加1(优先级减1),运行时间加1;