进程调度(时间片轮转,动态优先级,链表形式):
#include<cstdio>
#include<cstdlib>
struct PCB
{
char name[10];
char state; //状态
int super; //优先级
int ntime; //预计运行时间
int rtime; //实际运行时间
PCB *link;
}*ready=NULL, *p;
void disp(PCB *pr) /*建立进程显示函数,用于显示当前进程 */
{
printf("
qname state super ntime rtime
");
printf("|%s ",pr->name);
printf("|%c ",pr->state);
printf("|%d ",pr->super);
printf("|%d ",pr->ntime);
printf("|%d ",pr->rtime);
printf("
");
}
void check() /* 建立进程查看函数 */
{
printf("
******** 当前正在运行的进程是:%s",p->name); /* 显示当前运行进程 */
disp(p);
printf("
******** 当前就绪队列状态为:
"); /* 显示就绪队列状态 */
PCB *pr=ready;
while(pr!=NULL) disp(pr), pr=pr->link;
}
void sort() /* 建立对进程进行优先级排列函数 */
{
if(ready==NULL || (p->super)>(ready->super)) /* 优先级最大者,插入队首 */
{
p->link=ready;
ready=p;
}
else /* 进程比较优先级,插入适当的位置中 */
{
PCB *first=ready, *second=first->link;
while(second!=NULL)
{
if((p->super)>(second->super)) /* 若插入进程比当前进程优先数大,插入到当前进程前面 */
{
first->link=p;
p->link=second;
return;
}
first=first->link;
second=second->link;
}
first->link=p;
}
}
void input() /* 建立进程控制块函数 */
{
system("cls");
printf("
请输入进程数目?");
int num; scanf("%d",&num);
for(int i=0;i<num;i++)
{
printf("
进程号 No.%d:
",i);
p=(PCB *)malloc(sizeof(PCB));
printf("
输入进程名:");
scanf("%s",p->name);
printf("
输入进程优先数:");
scanf("%d",&(p->super));
printf("
输入进程运行时间:");
scanf("%d",&(p->ntime));
printf("
");
p->rtime=0;
p->state='w';
p->link=NULL;
sort(); /* 调用 sort 函数 */
}
system("cls");
printf("
******** 进程创建如下:
");
PCB *pr=ready;
while(pr!=NULL) disp(pr), pr=pr->link;
}
inline void destroy() /*建立进程撤消函数(进程运行结束,撤消进程) */
{
printf("
进程 [%s] 已完成.
",p->name), free(p);
}
inline void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态) */
{
(p->rtime)++;
if(p->rtime==p->ntime)
destroy(); /* 调用 destroy 函数 */
else
--(p->super), p->state='w', sort();
}
int main() /*主函数*/
{
input();
int h=0;
while(ready!=NULL)
{
getchar();
printf("
The execute number:%d
",++h);
p=ready;
ready=p->link;
p->link=NULL;
p->state='r';
check();
running();
printf("
按任意键继续......"), getchar();
}
printf("
进程已经全部完成.
");
getchar();
return 0;
}
/*
3
A
3
5
B
2
3
C
1
4
*/
作业调度(FCFS调度):
#include<bits/stdc++.h>
using namespace std;
int cur_time;
int limit;
double turnover_time_sum, weighted_turnover_time_sum;
struct JCB
{
int index; //作业序号
string name; //作业名称
string state; //状态
int estimate_time; //预计运行时间
int arrive_time; //到达时间
int running_time; //实际运行时间
int end_time; //结束时间
inline int turnover_time()const //周转时间
{
return cur_time-arrive_time;
}
inline double weighted_turnover_time()const
{
return turnover_time()*1.0/running_time;
}
inline int waiting_time()const //等待时间
{
return turnover_time()-running_time;
}
void print()const
{
printf("作业 %d : ",index);
cout<<"|名称: "<<name<<" ";
cout<<"|状态: "<<state<<" ";
printf("|到达: %d ",arrive_time);
printf("|预计运行: %d ",estimate_time);
printf("|已运行: %d ",running_time);
printf("|已等待: %d ",waiting_time());
if(state=="destroy")
{
printf("|周转时间: %d ",turnover_time());
printf("|带权周转: %.2f",weighted_turnover_time());
}
printf("
");
}
};
bool cmp(const JCB &a,const JCB &b)
{
return a.arrive_time<b.arrive_time;
}
vector<JCB> memory; //内存
queue<JCB> fifo; //FIFO队列
vector<JCB> destroy; //待销毁
JCB createJob(int index) //创建
{
JCB res;
printf("
作业序号: %d
",res.index=index);
res.state="reserve";
printf("请输入作业名称:
");
cin>>res.name;
printf("请输入预计运行时间:
");
cin>>res.estimate_time;
printf("请输入到达时间:
");
cin>>res.arrive_time;
res.running_time=0;
return res;
}
void printJobs() //输出各个作业情况
{
printf("
************************************************************
");
printf("目前时间: %d
",cur_time);
printf("
内存中存在 %d 个作业:
",memory.size());
for(auto job:memory) job.print();
queue<JCB> tmp=fifo;
printf("
后备队列中存在 %d 个作业:
",tmp.size());
while(tmp.size()) tmp.front().print(), tmp.pop();
printf("
待销毁 %d 个作业:
",destroy.size());
for(auto job:destroy) job.print();
cout<<endl<<endl<<endl<<endl;
}
void runJobs() //运行内存中的作业
{
for(unsigned int i=0;i<memory.size();i++)
{
memory[i].running_time++;
if(memory[i].running_time==memory[i].estimate_time)
{
memory[i].state="destroy";
memory[i].end_time=cur_time;
destroy.push_back(memory[i]);
memory.erase(memory.begin()+i);
i--;
}
}
}
void destroyJobs() //销毁待销毁的作业
{
for(unsigned int i=0;i<destroy.size();i++)
{
turnover_time_sum+=destroy[i].turnover_time();
weighted_turnover_time_sum+=destroy[i].weighted_turnover_time();
}
destroy.clear();
}
int main()
{
printf("请输入内存允许的最多作业数目:
");
cin>>limit;
printf("请输入作业总数目:
");
int num; cin>>num;
vector<JCB> tmp;
for(int i=0;i<num;i++) tmp.push_back(createJob(i));
sort(tmp.begin(),tmp.end(),cmp);
cur_time=0;
turnover_time_sum=weighted_turnover_time_sum=0.0;
while(tmp.size()>0 || fifo.size()>0 || memory.size()>0)
{
while(memory.size()<limit && fifo.size()>0)
{
JCB tmp=fifo.front();
fifo.pop();
tmp.state="running";
memory.push_back(tmp);
}
for(unsigned int i=0;i<tmp.size();i++)
{
if(tmp[i].arrive_time==cur_time)
{
fifo.push(tmp[i]);
tmp.erase(tmp.begin()+i);
i--;
}
}
runJobs();
printJobs();
destroyJobs();
cur_time++;
}
printf("
该组作业平均周转时间 %.2f, 平均带权周转时间 %.2f.
",turnover_time_sum/num,weighted_turnover_time_sum/num);
}
/*
2
7
YJC
5
3
HBG
3
1
WYY
10
5
QQQ
2
7
ZVD
8
1
WCY
10
10
YJLGXC
7
5
*/
作业调度(SJF调度):
#include<bits/stdc++.h>
using namespace std;
int cur_time;
int limit;
double turnover_time_sum, weighted_turnover_time_sum;
struct JCB
{
int index; //作业序号
string name; //作业名称
string state; //状态
int estimate_time; //预计运行时间
int arrive_time; //到达时间
int running_time; //实际运行时间
int end_time; //结束时间
inline int turnover_time()const //周转时间
{
return cur_time-arrive_time;
}
inline double weighted_turnover_time()const
{
return turnover_time()*1.0/running_time;
}
inline int waiting_time()const //等待时间
{
return turnover_time()-running_time;
}
void print()const
{
printf("作业 %d : ",index);
cout<<"|名称: "<<name<<" ";
cout<<"|状态: "<<state<<" ";
printf("|到达: %d ",arrive_time);
printf("|预计运行: %d ",estimate_time);
printf("|已运行: %d ",running_time);
printf("|已等待: %d ",waiting_time());
if(state=="destroy")
{
printf("|周转时间: %d ",turnover_time());
printf("|带权周转: %.2f",weighted_turnover_time());
}
printf("
");
}
bool operator<(const JCB &o)const
{
return o.estimate_time<estimate_time;
}
};
bool cmp(const JCB &a,const JCB &b)
{
return a.arrive_time<b.arrive_time;
}
vector<JCB> memory; //内存
priority_queue<JCB> heap; //优先队列
vector<JCB> destroy; //待销毁
JCB createJob(int index) //创建
{
JCB res;
printf("
作业序号: %d
",res.index=index);
res.state="reserve";
printf("请输入作业名称:
");
cin>>res.name;
printf("请输入预计运行时间:
");
cin>>res.estimate_time;
printf("请输入到达时间:
");
cin>>res.arrive_time;
res.running_time=0;
return res;
}
void printJobs() //输出各个作业情况
{
printf("
************************************************************
");
printf("目前时间: %d
",cur_time);
printf("
内存中存在 %d 个作业:
",memory.size());
for(auto job:memory) job.print();
priority_queue<JCB> tmp=heap;
printf("
后备队列中存在 %d 个作业:
",tmp.size());
while(tmp.size()) tmp.top().print(), tmp.pop();
printf("
待销毁 %d 个作业:
",destroy.size());
for(auto job:destroy) job.print();
cout<<endl<<endl<<endl<<endl;
}
void runJobs() //运行内存中的作业
{
for(unsigned int i=0;i<memory.size();i++)
{
memory[i].running_time++;
if(memory[i].running_time==memory[i].estimate_time)
{
memory[i].state="destroy";
memory[i].end_time=cur_time;
destroy.push_back(memory[i]);
memory.erase(memory.begin()+i);
i--;
}
}
}
void destroyJobs() //销毁待销毁的作业
{
for(unsigned int i=0;i<destroy.size();i++)
{
turnover_time_sum+=destroy[i].turnover_time();
weighted_turnover_time_sum+=destroy[i].weighted_turnover_time();
}
destroy.clear();
}
int main()
{
printf("请输入内存允许的最多作业数目:
");
cin>>limit;
printf("请输入作业总数目:
");
int num; cin>>num;
vector<JCB> tmp;
for(int i=0;i<num;i++) tmp.push_back(createJob(i));
sort(tmp.begin(),tmp.end(),cmp);
cur_time=0;
turnover_time_sum=weighted_turnover_time_sum=0.0;
while(tmp.size()>0 || heap.size()>0 || memory.size()>0)
{
//将若干作业调度运行
while(memory.size()<limit && heap.size()>0)
{
JCB tmp=heap.top(); heap.pop();
tmp.state="running";
memory.push_back(tmp);
}
//当前时间点到达的作业进入后备队列
for(unsigned int i=0;i<tmp.size();i++)
{
if(tmp[i].arrive_time==cur_time)
{
heap.push(tmp[i]);
tmp.erase(tmp.begin()+i);
i--;
}
}
runJobs();
printJobs();
destroyJobs();
cur_time++;
}
printf("
该组作业平均周转时间 %.2f, 平均带权周转时间 %.2f.
",turnover_time_sum/num,weighted_turnover_time_sum/num);
}
/*
2
7
YJC
5
3
HBG
3
1
WYY
10
5
QQQ
2
7
ZVD
8
1
WCY
10
10
YJLGXC
7
5
*/
作业调度(HRRN调度):
#include<bits/stdc++.h>
using namespace std;
int cur_time;
int limit;
double turnover_time_sum, weighted_turnover_time_sum;
struct JCB
{
int index; //作业序号
string name; //作业名称
string state; //状态
int estimate_time; //预计运行时间
int arrive_time; //到达时间
int running_time; //实际运行时间
int end_time; //结束时间
inline int turnover_time()const //周转时间
{
return cur_time-arrive_time;
}
inline double weighted_turnover_time()const
{
return turnover_time()*1.0/running_time;
}
inline int waiting_time()const //等待时间
{
return turnover_time()-running_time;
}
inline double response_ratio()const //响应比
{
return (waiting_time()+estimate_time)*1.0/estimate_time;
}
void print()const
{
printf("作业 %d : ",index);
cout<<"|名称: "<<name<<" ";
cout<<"|状态: "<<state<<" ";
printf("|到达: %d ",arrive_time);
printf("|预计运行: %d ",estimate_time);
printf("|已运行: %d ",running_time);
printf("|已等待: %d ",waiting_time());
if(state=="reserve")
{
printf("|响应比: %.2f",response_ratio());
}
if(state=="destroy")
{
printf("|周转时间: %d ",turnover_time());
printf("|带权周转: %.2f",weighted_turnover_time());
}
printf("
");
}
bool operator>(const JCB &o)const
{
return response_ratio()>o.response_ratio();
}
};
bool cmp(const JCB &a,const JCB &b)
{
return a.arrive_time<b.arrive_time;
}
vector<JCB> memory; //内存
vector<JCB> rq; //后备队列
vector<JCB> destroy; //待销毁
JCB createJob(int index) //创建
{
JCB res;
printf("
作业序号: %d
",res.index=index);
res.state="reserve";
printf("请输入作业名称:
");
cin>>res.name;
printf("请输入预计运行时间:
");
cin>>res.estimate_time;
printf("请输入到达时间:
");
cin>>res.arrive_time;
res.running_time=0;
return res;
}
void printJobs() //输出各个作业情况
{
printf("
************************************************************
");
printf("目前时间: %d
",cur_time);
printf("
内存中存在 %d 个作业:
",memory.size());
for(auto job:memory) job.print();
printf("
后备队列中存在 %d 个作业:
",rq.size());
for(auto job:rq) job.print();
printf("
待销毁 %d 个作业:
",destroy.size());
for(auto job:destroy) job.print();
cout<<endl<<endl<<endl<<endl;
}
void runJobs() //运行内存中的作业
{
for(unsigned int i=0;i<memory.size();i++)
{
memory[i].running_time++;
if(memory[i].running_time==memory[i].estimate_time)
{
memory[i].state="destroy";
memory[i].end_time=cur_time;
destroy.push_back(memory[i]);
memory.erase(memory.begin()+i);
i--;
}
}
}
JCB findJobs() //在后备队列查找作业
{
unsigned int idx=0;
for(unsigned int i=1;i<rq.size();i++)
{
if(rq[i]>rq[idx]) idx=i;
}
printf("调度该作业进入内存:
");
rq[idx].print();
JCB res=rq[idx];
res.state="running";
rq.erase(rq.begin()+idx);
return res;
}
void destroyJobs() //销毁待销毁的作业
{
for(unsigned int i=0;i<destroy.size();i++)
{
turnover_time_sum+=destroy[i].turnover_time();
weighted_turnover_time_sum+=destroy[i].weighted_turnover_time();
}
destroy.clear();
}
int main()
{
printf("请输入内存允许的最多作业数目:
");
cin>>limit;
printf("请输入作业总数目:
");
int num; cin>>num;
vector<JCB> tmp;
for(int i=0;i<num;i++) tmp.push_back(createJob(i));
sort(tmp.begin(),tmp.end(),cmp);
cur_time=0;
turnover_time_sum=weighted_turnover_time_sum=0.0;
while(tmp.size()>0 || rq.size()>0 || memory.size()>0)
{
//将若干作业调度运行
while(memory.size()<limit && rq.size()>0)
memory.push_back(findJobs());
//当前时间点到达的作业进入后备队列
for(unsigned int i=0;i<tmp.size();i++)
{
if(tmp[i].arrive_time==cur_time)
{
rq.push_back(tmp[i]);
tmp.erase(tmp.begin()+i);
i--;
}
}
runJobs();
printJobs();
destroyJobs();
cur_time++;
}
printf("
该组作业平均周转时间 %.2f, 平均带权周转时间 %.2f.
",turnover_time_sum/num,weighted_turnover_time_sum/num);
}
/*
2
7
YJC
5
3
HBG
3
1
WYY
10
5
QQQ
2
7
ZVD
8
1
WCY
10
10
YJLGXC
7
5
*/