c++模拟操作系统进程调度算法(优先数,时间片轮转)

时间:2021-12-05 21:13:26

实验一 进程调度
1.目的和要求
进程调度是处理机管理的核心内容。本实验要求编写和调试一个简单的进程调度程序。通过本实验可以加深理解有关进程控制块、进程队列的概念,体会了解优先数和时间片轮转调度算法的具体实施办法。
2.实验内容
①设计进程控制块PCB表结构,分别适用于优先数调度算法和时间片轮转调度算法。
②建立进程就绪队列。对两种不同算法编写入队子程序。
③设计编写两种进程调度算法:1)优先数调度;2)时间片轮转调度。
3.实验环境
①PC兼容机
②Windows系统
③自选
4.实验提示
①本程序用两种算法对五个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。
②为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。
③在优先数算法中,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片数加2,进程还需要的时间片数减2,并排列到就绪队列的队尾上。
④对于遇到优先数一致的情况,采用FIFO策略解决。


#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;

bool _state = 0;
class PCB//类定义PCB表,适用于优先数
{
public:
int ID;
int priority;
int CPUtime;
int ALLtime;
int State;//1运行 2就绪 3等待
int flag;
void set_PCB(int a,int b,int c,int d, int e,int f)
{
ID=a;
priority = b;
CPUtime=c;
ALLtime=d;
State=e;
flag=f;
}
};

class PCB2
{
public:
int ID;
int CPUtime;
int ALLtime;
int State;
int flag;
void set_PCB2(int a,int b,int c,int d, int e)
{
ID=a;
CPUtime=b;
ALLtime=c;
State=d;
flag=e;
}
};

bool priority_sort_higher(const PCB &m, const PCB &n)//sort函数,定义按优先数排序,当优先数相同时按序号排序(即先进先出)
{
if(m.priority == n.priority) return m.ID < n.ID;
return m.priority > n.priority;
}




void priority_way(vector <PCB> &pcb, vector<PCB> &wait)//优先数算法
{
vector<PCB>::iterator it1;
it1 = pcb.begin();
int flag = 5;
while(flag)
{
wait.erase(wait.begin());
(*it1).State = 1;
(*it1).priority -= 3;
(*it1).CPUtime += 1;
(*it1).ALLtime -= 1;
if((*it1).ALLtime == 0)
{
flag -= 1;
(*it1).flag =1;
cout<<left<<setw(10)<<(*it1).ID<<setw(10)<<(*it1).State<<setw(10)<<(*it1).priority<<setw(10)<<(*it1).CPUtime<<setw(10)<<(*it1).ALLtime<<setw(10)<<(*it1).flag<<endl;
pcb.erase(pcb.begin());
sort(wait.begin(), wait.end(), priority_sort_higher);
sort(pcb.begin(), pcb.end(), priority_sort_higher);
}
else
{
cout<<left<<setw(10)<<(*it1).ID<<setw(10)<<(*it1).State<<setw(10)<<(*it1).priority<<setw(10)<<(*it1).CPUtime<<setw(10)<<(*it1).ALLtime<<setw(10)<<(*it1).flag<<endl;
(*it1).State = 2;
wait.push_back(*it1);
sort(wait.begin(),wait.end(),priority_sort_higher);
sort(pcb.begin(),pcb.end(),priority_sort_higher);
}



}

}

void round_robin_way(vector <PCB2> &pcb2,vector<PCB2> &wait2)//时间片算发
{
vector<PCB2>::iterator it2;
it2 = wait2.begin();
int flag=5;
while(flag)
{
it2 = pcb2.begin();
wait2.erase(wait2.begin());//出队(等待队列)
(*it2).State = 1;
if((*it2).ALLtime==1)
{
(*it2).CPUtime +=1;
(*it2).ALLtime -=1;
flag -= 1;
(*it2).flag = 1;
cout << left << setw(10) << (*it2).ID << setw(10) << (*it2).State<<setw(10)<<(*it2).CPUtime<<setw(10)<<(*it2).ALLtime<<setw(10)<<(*it2).flag<<endl;
pcb2.erase(pcb2.begin());
continue;
}
else if((*it2).ALLtime==2)
{
(*it2).CPUtime +=2;
(*it2).ALLtime -=2;
flag-=1;
(*it2).flag =1;
cout<<left<<setw(10)<<(*it2).ID<<setw(10)<<(*it2).State<<setw(10)<<(*it2).CPUtime<<setw(10)<<(*it2).ALLtime<<setw(10)<<(*it2).flag<<endl;
pcb2.erase(pcb2.begin());
continue;
}
else
{
(*it2).State = 1;
(*it2).CPUtime +=2;
(*it2).ALLtime -=2;
cout<<left<<setw(10)<<(*it2).ID<<setw(10)<<(*it2).State<<setw(10)<<(*it2).CPUtime<<setw(10)<<(*it2).ALLtime<<setw(10)<<(*it2).flag<<endl;
(*it2).State = 2;
wait2.push_back(*it2);
PCB2 q = *it2;
pcb2.erase(pcb2.begin());
pcb2.push_back(q);
}
}
}



int main( )
{cout<<"-------------------------------模拟进程调度----------------------------------"<<endl;
int flag_0,a[5],b;
cout<<"请输入想要模拟进程调度算法的编号"<<endl;
cout<<"1.优先数调度;2.时间片轮转调度。" <<endl;
cin>>flag_0;

if(flag_0 == 1)
{
it = pcb.begin();
cout<<"创建5个进程,请为5个进程设置优先数(优先数越大优先级越高)"<<endl;
cout<<"例如:14 20 6 12 11 ,即将5个进程的优先数分别设置为14 20 6 12 11"<<endl;

for(int i = 1; i <= 5; i++)
{
cin>>a[i-1];
}
cout<<"请为5个进程设置其需运行的时间片数"<<endl;
for(int i = 1; i <= 5; i++)
{
cin>>b;
PCB q;
q.set_PCB(i,a[i-1],0,b,2,0);
pcb.push_back(q);
}
sort(pcb.begin(),pcb.end(),priority_sort_higher);//按优先数排序,利用sort函数

vector<PCB> wait(5);
copy(pcb.begin(),pcb.end(),back_inserter(wait));
cout<<"该进程运行情况如下(flag=0代表未完成,flag=1代表已完成)"<<endl;
cout << left<<setw(10)<< "ID"<<setw(10)<<"State"<<setw(10)<<"priority"<<setw(10)<<"CPUtime"<<setw(10)<<"ALLtime "<<setw(10)<<"flag1" << endl;

priority_way(pcb,wait);
}
else if(flag_0 ==2)
{
vector <PCB2> pcb2;
vector<PCB2>::iterator it2;
it2 = pcb2.begin();
cout<<"创建5个进程,请为5个进程设置轮转时间数"<<endl;
for(int i = 1; i <= 5; i++)
{
cin>>b;
PCB2 q2;
q2.set_PCB2(i,0,b,2,0);
pcb2.push_back(q2);
}
vector<PCB2> wait2(5);
copy(pcb2.begin(),pcb2.end(),back_inserter(wait2));
cout<<"该进程运行情况如下(flag=0代表未完成,flag=1代表已完成)"<<endl;
cout << left<<setw(10)<< "ID"<<setw(10)<<"State"<<setw(10)<<"CPUtime"<<setw(10)<<"ALLtime "<<setw(10)<<"flag1" << endl;
round_robin_way(pcb2, wait2);
}

cout<<"----------------------------------END--------------------------------------"<<endl;
return 0;
}