/*
*Name:进程调度模拟算法
*Time:2018/4/25
*Author:Cuirongcheng
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <iomanip>
using namespace std;
typedef struct node
{
char name[20]; //进程名
int prio; //进程优先级
int round; //轮转时间片数
int cputime; //进程已占用的CPU时间
int needtime; //进程执行还需要的时间
char state; //进程的状态,W——就绪态,R——执行态,F——完成态
struct node *next; //链队指针
int count; //记录执行的次数
}PCB; //定义进程块结构体
PCB *run=NULL; //当前运行进程指针
PCB *ready=NULL; //就绪队列头指针
PCB *tail=NULL; //就绪队列尾指针
PCB *finish=NULL; //完成队列头指针
int num; // 进程数
//取得第一个就绪队列节点执行
void GetFirst()
{
run = ready; //运行进程指针指向就绪队列头指针
if(ready!=NULL) //如果就绪队列中有进程则取出
{
run ->state = 'R'; //当前进程状态为执行态
ready = ready ->next; //就绪队列头指针后移
run ->next = NULL; //取出就绪队列第一个节点
}
}
//创建优先级队列,规定优先数越小,优先级越低
void InsertPrio(PCB *in)
{
PCB *fst,*nxt; //fst、nxt用来取就绪队列节点
fst = nxt = ready; //fst、nxt指向就绪队列头指针
if(ready == NULL) //如果队列为空,则进程为第一个节点
{
in->next = ready;
ready = in;
}
else //查到合适的位置进行插入
{
if(in ->prio >= fst ->prio) //判断优先级,若进程优先级比第一个还要大,则插入到队头
{
in->next = ready;
ready = in;
}
else
{
while(fst->next != NULL) //移动指针查找第一个比它小的元素的位置进行插入
{
nxt = fst;
fst = fst->next;
}
if(fst ->next == NULL) //已经搜索到队尾,则其优先级数最小,将其插入到队尾即可
{
in ->next = fst ->next;
fst ->next = in;
}
else //插入到队列中
{
nxt = in;
in ->next = fst;
}
}
}
}
//将进程插入到就绪队列尾部
void InsertReady(PCB *in)
{
PCB *fst;
fst = ready; //fst指向就绪队列
if(ready == NULL) //如果队列为空,则进程为第一个节点
{
in->next = ready;
ready = in;
}
else //插入就绪队列队尾
{
while(fst->next != NULL)
{
fst = fst->next;
}
in ->next = fst ->next;
fst ->next = in;
}
}
//将进程插入到完成队列尾部
void InsertFinish(PCB *in)
{
PCB *fst;
fst = finish; //fst指向完成队列
if(finish == NULL) //如果队列为空,则进程为第一个节点
{
in->next = finish;
finish = in;
}
else //插入完成队列队尾
{
while(fst->next != NULL)
{
fst = fst->next;
}
in ->next = fst ->next;
fst ->next = in;
}
}
//优先级调度输入函数
void PrioCreate()
{
PCB *tmp; //优先级进程队列
int i; //循环变量
cout<<"请输入进程名和运行时间:"<<endl; //输入进程名和需要时间
for(i = 0;i < num; i++)
{
if((tmp = (PCB *)malloc(sizeof(PCB)))==NULL) //循环申请队列空间
{
cerr<<"malloc"<<endl;
exit(1);
}
cin>>tmp->name; //输入进程名
getchar();
cin>>tmp->needtime; //输入进程需要时间
tmp->cputime = 0; //初始占用cpu时间设置为0
tmp->state ='W'; //进程默认设置为就绪态
tmp->prio = 50 - tmp->needtime; //设置其优先级,需要的时间越多,优先级越低
tmp->round = 0; //轮转时间片为0
tmp->count = 0; //执行次数为0
InsertPrio(tmp); //按照优先级从高到低,将进程依次插入到就绪队列
}
}
//时间片输入函数
void RoundCreate()
{
PCB *tmp;
int i;
cout<<"请输入进程名和运行时间:"<<endl;
for(i = 0;i < num; i++)
{
if((tmp = (PCB *)malloc(sizeof(PCB)))==NULL)
{
cerr<<"malloc"<<endl;
exit(1);
}
cin>>tmp->name;
getchar();
cin>>tmp->needtime;
tmp ->cputime = 0;
tmp ->state ='W'; //进程默认设置为就绪态
tmp ->prio = 0;
tmp ->round = 2; //轮转时间片设置为2
tmp ->count = 0;
InsertReady(tmp); //将进程依次插入到就绪队列
}
}
//优先级输出队列
void PrioOut()
{
PCB *p; //p用来暂存就绪队列首节点
p = ready; //p指向就绪队列
//cout<<setw(10)<<"name"<<setw(10)<<"cputime"<<setw(10)<<"needtime"<<setw(10)<<"priority"<<setw(10)<<"state"<<setw(10)<<"count"<<endl;
while(p!=NULL)
{
cout<<setw(10)<<p->name<<setw(10)<<p->cputime<<setw(10)<<p->needtime<<setw(10)<<p->prio<<setw(10)<<p->state<<setw(10)<<p->count<<endl;
p = p->next; //依次输出就绪队列进程
}
p = finish; //p指向完成队列
while(p!=NULL)
{
cout<<setw(10)<<p->name<<setw(10)<<p->cputime<<setw(10)<<p->needtime<<setw(10)<<p->prio<<setw(10)<<p->state<<setw(10)<<p->count<<endl;
p = p->next; //依次输出完成队列进程
}
p = run; //p指向当前进程
while(p!=NULL)
{
cout<<setw(10)<<p->name<<setw(10)<<p->cputime<<setw(10)<<p->needtime<<setw(10)<<p->prio<<setw(10)<<p->state<<setw(10)<<p->count<<endl;
p = p->next;
}
}
//轮转法输出队列
void RoundOut()
{
PCB *p; //p用来暂存就绪队列首节点
p = ready; //p指向就绪队列
//cout<<setw(10)<<"name"<<setw(10)<<"cputime"<<setw(10)<<"needtime"<<setw(10)<<"priority"<<setw(10)<<"state"<<setw(10)<<"count"<<endl;
while(p!=NULL)
{
cout<<setw(10)<<p->name<<setw(10)<<p->cputime<<setw(10)<<p->needtime<<setw(10)<<p->round<<setw(10)<<p->state<<setw(10)<<p->count<<endl;
p = p->next; //依次输出就绪队列进程
}
p = finish; //p指向完成队列
while(p!=NULL)
{
cout<<setw(10)<<p->name<<setw(10)<<p->cputime<<setw(10)<<p->needtime<<setw(10)<<p->round<<setw(10)<<p->state<<setw(10)<<p->count<<endl;
p = p->next; //依次输出完成队列进程
}
p = run; //p指向当前进程
while(p!=NULL)
{
cout<<setw(10)<<p->name<<setw(10)<<p->cputime<<setw(10)<<p->needtime<<setw(10)<<p->round<<setw(10)<<p->state<<setw(10)<<p->count<<endl;
p = p->next;
}
}
//按照优先级调度,每次执行一个时间片
void Priority()
{
int flag = 1;
GetFirst(); //取得第一个就绪队列节点
while(run != NULL) //进程没有执行完时继续循环
{
PrioOut(); //优先级输出队列
while(flag)
{
run->prio -= 3; //优先级减去三
run->cputime++; //CPU时间片加一
run->needtime--;//进程执行完成的剩余时间减一
run->count++; //进程执行的次数加一
if(run->needtime == 0)//如果进程执行完毕,将进程状态置为F,将其插入到完成队列
{
run ->state = 'F'; //标位为完成态
InsertFinish(run); //插入完成队列队尾
flag = 0;
}
else //将进程状态置为W,插入就绪队列
{
run->state = 'W'; //标志位为就绪态
InsertReady(run); //插入就绪队列队尾
flag = 0;
}
}
flag = 1;
GetFirst(); //继续取就绪队列队头进程执行
}
}
//时间片轮转调度算法
void RoundRun()
{
int flag = 1;
GetFirst(); //轮转法输出队列
while(run != NULL)
{
RoundOut();
while(flag)
{
run->cputime++; //CPU时间片加一
run->needtime--;//进程执行完成的剩余时间减一
run->count++; //进程执行的次数加一
if(run->needtime == 0)//如果进程执行完毕,将进程状态置为F,将其插入到完成队列
{
run ->state = 'F'; //标位为完成态
InsertFinish(run); //插入完成队列队尾
flag = 0;
}
else if(run->count == run->round)//时间片用完
{
run->state = 'W'; //标志位为就绪态
run->count = 0; //计数器清零,为下次做准备
InsertReady(run); //插入就绪队列队尾
flag = 0;
}
}
flag = 1;
GetFirst(); //继续取就绪队列队头进程执行
}
}
//主函数
int main(void)
{
system("color 3f");
int n;
cout<<"欢迎进入进程调度算法模拟"<<endl<<endl;
cout<<"请输入进程数目:";
cin>>setw(10)>>num;
cout<<endl;
getchar();
cout<<"-----------------进程调度算法模拟----------------------"<<endl;
cout<<" [1]优先数调度算法 "<<endl;
cout<<" [2]循环轮转调度算法 "<<endl;
cout<<"-------------------------------------------------------"<<endl;
cout<<endl;
cout<<"请选择算法编号:";
cin>>n;
cout<<endl;
switch(n)
{
case 1:
cout<<"---------------------优先数调度算法--------------------"<<endl;
PrioCreate();
cout<<endl;
cout<<setw(10)<<"name"<<setw(10)<<"cputime"<<setw(10)<<"needtime"<<setw(10)<<"priority"<<setw(10)<<"state"<<setw(10)<<"count"<<endl;
Priority();
PrioOut();
break;
case 2:
cout<<"-------------------循环轮转调度算法--------------------"<<endl;
RoundCreate();
cout<<endl;
cout<<setw(10)<<"name"<<setw(10)<<
- 1
- 2
前往页