这里是两种方法
优先权法和轮转算法
#include <iostream>
#include <math.h>
#include <queue>
#include <algorithm>
#include <vector>
#include <time.h>
using namespace std;
string s[3] = { "finish","ready", "running"};
int n = 0;
struct pcb
{
int id;//进程标号
int priority;//进程优先级
int needtime=0;//进程还需多少时间
int status = 1;//进程的状态,是否运行以及是否完成
int holdtime = 0;//占用时间
};
void print(pcb* process)
{
for(int i=0;i<n;i++)
cout << "proceeding:" << process[i].id << " 优先级:"<< process[i].priority
<< " 剩余时间:" << process[i].needtime << " 状态:" << s[process[i].status] << endl;
cout << endl;
}
void print1(pcb* process)
{
for (int i = 0; i < n; i++)
cout << "proceeding:" << process[i].id <<
" 剩余时间:" << process[i].needtime << " 占有时间:" <<process[i].holdtime<<
" 状态:" << s[process[i].status] <<endl;
cout << endl;
}
int cmp(pcb a, pcb b)
{
return a.priority > b.priority;
}
int priority(int n)
{
srand(time(NULL));//产生随机数
pcb *process=new pcb[n];
//初始化进程
for (int i =0; i < n; i++)
{
process[i].id = i+1;
process[i].needtime = rand() %20 + 1;
process[i].priority = rand() %30 + 1;
//process.push(proceeding);
}
cout << "初始就绪进程情况:" << endl;
print(process);
//按照进程的优先级进行排序
vector <pcb> p(process, process + n);
sort(p.begin() ,p.end(), cmp);
//取出优先级最高的进程
cout << "运行情况" << endl;
//remainproc = { 0 };
while (true)
{
int proid = p[0].id-1;
p[0].status = 2;
process[proid].status = 2;
print(process);
p[0].priority -= 3;
p[0].needtime -= 1;
process[proid].priority -= 3;
process[proid].needtime -= 1;
if (p[0].needtime == 0)
{
process[proid].status = 0;
p.erase(p.begin(), p.begin() + 1);
if (p.empty())
break;
}
else
{
p[0].status = 1;
process[proid].status = 1;
sort(p.begin(), p.end(), cmp);
}
}
print(process);
delete[]process;
return 1;
}
int round(int n)
{
srand(time(NULL));
//产生随机数
int pieces = rand() % 5 + 1;
//1-5时间片大小
pcb* process = new pcb[n];
cout << "时间片大小(1-5):" << pieces<<endl;
//初始化进程
for (int i = 0; i < n; i++)
{
process[i].id = i + 1;
process[i].needtime = rand() % 20 + 1;
}
cout << "初始就绪进程情况:" << endl;
print1(process);
//按照进程的优先级进行排序
cout << "运行情况" << endl;
vector <pcb> p(process, process + n);
while (true)
{
int proid = p[0].id - 1;
process[proid].status = 2;
process[proid].needtime -= 1;
p[0].needtime -= 1;
process[proid].holdtime += 1;
print1(process);
if (process[proid].needtime == 0)
{
process[proid].status = 0;
p.erase(p.begin(), p.begin() + 1);
if (p.empty())
break;
}
else
{
if (process[proid].holdtime == pieces)
{
p[0].holdtime = 0;
process[proid].holdtime = 0;
process[proid].status = 1;
p.push_back(p[0]);
p.erase(p.begin(), p.begin() + 1);
}
}
}
print1(process);
delete[]process;
return 0;
}
int main()
{
int input = 0;
cout << "please input 0 or 1(0 优先权法,1 轮转法):";
cin >> input;
cout << "输入进程数:";
cin >> n;
if (n <= 0)
{
cout << "none proceeding" << endl;
return 0;
}
if (input == 0)
{
priority(n);
}
else if (input == 1)
{
round(n);
}
else
{
cout << "input error" << endl;
return 0;
}
}