操作系统实验--进程调度(不可抢占式动态优先级)
程序员文章站
2022-03-05 09:55:47
...
#include<stdio.h>
#include<iostream>
#include<iomanip>
using namespace std;
/*不可抢占式动态优先级*/
/*若正在运行的进程时间片用完就转为就绪状态,占用一次cpu优先级-1
就绪队列中等待的队列,每等待cpu运行完一个时间片,优先级+1*/
// 枚举进程的状态:就绪、执行、阻塞、完成
enum STATE { Ready, Run, Block, Finish };
struct PCB
{
string name;
int time;//运行需要时间
int rtime;//还需要运行多长时间才能完成
int priority;//优先数
PCB *next;//指向一下个PCB
STATE state;//状态(就绪、执行、阻塞、完成)
};
PCB *finish,*ready,*run,*tail;//完成,就绪,运行队列
int num;//实际进程总数,小于10
int timeslice;//时间片
void input();//输入
void init();//初始化参数
void output();//输出
void insert(PCB *p);//根据优先级将进程插入有序单向链表队列
void in();//从就绪队列选择队首进程运行
void running();//进程调度
int main()
{
input();
init();
output();
running();
return 0;
}
void input()//输入
{
ready=NULL;
finish=NULL;
run=NULL;
PCB *p;
cout<<"请输入进程个数:";
cin>>num;
cout<<endl;
cout<<"请输入时间片大小: ";
cin>>timeslice;
cout<<endl;
for(int i=0;i<num;i++)
{
p=new PCB;
cout<<"请输入进程"<<i+1<<"的信息"<<endl;
cout<<"名字:";
cin>>p->name;
cout<<endl;
cout<<"运行时间: ";
cin>>p->time;
cout<<endl;
cout<<"优先数: ";
cin>>p->priority;
cout<<endl;
p->next=NULL;//初始化新建进程的下一个都为NULL
// cout<<p->name<<" input finish, next is insert"<<endl;
/*
if(ready==NULL)
{
p->next=ready;
ready=p;
}
else
*/
insert(p);
}
}
void init()//初始化参数
{
PCB *p=ready;
for(int i=0;i<num;i++)
{
//p->wtime=0;
p->rtime=p->time;
p->state=Ready;
p=p->next;
}
/*
tail=ready;
p=tail->next;
while(p!=NULL)
{
tail=tail->next;
p=tail->next;
}
*/
}
void output()//输出
{
PCB *temp=ready;
cout<<"进程名 "<<"运行时间 "<<"优先数 "<<"剩余时间 "<<"状态 "<<endl;
cout<<"ready队列"<<endl;
while(temp!=NULL)
{
cout<<temp->name<<setw(7)<<temp->time<<setw(9)<<temp->priority
<<setw(7)<<temp->rtime<<setw(9)<<temp->state<<endl;
temp=temp->next;
}
// if(temp==NULL)
// cout<<"运行完成!"<<endl;
/*
temp=run;
cout<<"runing队列"<<endl;
while(temp!=NULL)
{
cout<<temp->name<<setw(5)<<temp->time<<setw(7)<<temp->priority
<<setw(5)<<temp->rtime<<setw(7)<<temp->state<<endl;
temp=temp->next;
}
*/
temp=finish;
cout<<"finish队列"<<endl;
while(temp!=NULL)
{
cout<<temp->name<<setw(7)<<temp->time<<setw(9)<<temp->priority
<<setw(7)<<temp->rtime<<setw(9)<<temp->state<<endl;
temp=temp->next;
}
}
void insert(PCB *p) /* 建立对进程进行优先级排列函数*/
{
p->state=Ready;
PCB *first, *second;
int flag = 0;
if((ready==NULL)||((p->priority)>(ready->priority))) /*优先级最大者,插入队首*/
{
p->next=ready;//插入的数据作为链表头结点
ready=p;//头结点指针指向插入数
}
else /* 进程比较优先级,插入适当的位置中*/
{
first = ready;
second = first->next;
while (second != NULL)
{
if ((p->priority) > (second->priority)) /*若插入进程比当前进程优先数大,*/
{ /*插入到当前进程前面*/
p->next = second;
first->next = p;
second = NULL;
flag = 1;
break;
}
else /* 插入进程优先数最低,则插入到队尾*/
{
first = first->next;
second = first->next;
}
}
if (flag == 0)
{
first->next=p;
// p->next=NULL;
}
}
}
void in()//从就绪队列选择队首进程运行
{
if(ready==NULL)
{
run=NULL;
return;
}
run=ready;
run->state=Run;
cout<<"running: "<<run->name<<endl;
cout<<run->name<<setw(7)<<run->time<<setw(9)<<run->priority
<<setw(7)<<run->rtime<<setw(9)<<run->state<<endl;
ready=ready->next;
run->next=NULL;
}
void running()//进程调度
{
PCB *temp=ready;
in();
while(run!=NULL)
{
temp=ready;
if(run->rtime<=timeslice)
{
run->rtime=0;
run->state=Finish;
run->next=finish;
finish=run;
run=NULL;
}
else
{
//如果超过规定时间片,则此进程优先级-1,回到就绪队列,就绪队列中其他进程优先级+1
run->rtime=(run->rtime)-timeslice;
run->priority=(run->priority)-1;
while(temp!=NULL)
{
temp->priority++;
temp=temp->next;
}
insert(run);
// tail->next=run;
// tail=tail->next;
// sort();
}
output();
in();
}
}
上一篇: 写一个Boot引导程
下一篇: Redis配置与使用