操作系统——死锁算法c++实现
具体如下,有问题请联系,⼀起交流吧
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
typedef struct data{
char name;//进程名称
int at;//arrivetime到达时间
int st;//starttime开始时间
int pri;//优先权
double bt,ot,zzt,dqzzt;//开始时间,完成时间,周转时间,带权周转时间
int run_flag; //判断调度
int start_flag; //判断是否⾸次调度
}PCB;
PCB pcb[5]={{'A',0,4,4},{'B',1,3,2},{'C',2,5,3},{'D',3,2,5},{'E',4,4,1}};//内置数据
//PCB pcb[5]={{'A',1,5,3},{'B',2,4,6},{'C',3,5,7},{'D',0,1,1},{'E',4,1,0}};
int key;//时间⽚⼤⼩
int charge();//判断是否所以进程完成轮转
void refresh();//刷新项⽬数据,使其恢复初始状态
void initdata(){//数据输⼊
cout<<"请依次输⼊进程名、到达时间、服务时间、优先权"<<endl;
for(int i=0;i<5;i++){
cin>>pcb[i].name>>pcb[i].at>>pcb[i].st>>pcb[i].pri;
}
}
void show(PCB *p,string s,int sb){//数据输出
cout<<"\n调⽤"<<s<<"优先算法以后进程运⾏的顺序是: "<<endl;
if(sb){
cout<<p[0].name;
for(int i=1;i<5;i++)
{
cout<<"-->"<<p[i].name;
}
}
cout<<endl;
cout<<"具体进程调度信息:\n";
PCB *temp=p;
cout<<"进程名\t到达时间\t服务时间\t优先权\t开始时间\t完成时间\t周转时间\t带权周转时间\n" ;
for(int i=0;i<5;i++){
cout<<temp[i].name<<"\t"<<temp[i].at<<"\t\t"<<temp[i].st<<"\t\t"<<temp[i].pri<<"\t\t"<<temp[i].bt<<"\t\t"<<temp[i].ot<<"\t\t"<<temp[i].zzt<<"\t\t"<<temp[i].dqzzt<<endl }
}
void service(int N){//进程服务
int k;
PCB *p=pcb;
for(k=0; k <= N-1; k++)
{
if(k==0)
{
p[k].bt = p[k].at;
p[k].ot = p[k].bt + p[k].st;
}
else
{
p[k].bt = (p[k-1].ot >= p[k].at)? p[k-1].ot: p[k].at;
p[k].ot = p[k].bt + p[k].st;
p[k].ot = p[k].bt + p[k].st;
}
}
for(k=0; k<=N-1; k++)
{
p[k].zzt = p[k].ot - p[k].at;
p[k].dqzzt = p[k].zzt / p[k].st;
}
}
void zztcal(){//平均周转时间计算及输出
double sumzzt=0,sumdqzzt=0;
for(int i=0;i<5;i++){
sumzzt+=pcb[i].zzt;
sumdqzzt+=pcb[i].zzt/pcb[i].st;
}
sumzzt=sumzzt/5;
sumdqzzt=sumdqzzt/5;
cout<<"平均 \t \t \t \t \t \t\t\t\t\t "<<sumzzt<<"\t "<<sumdqzzt <<"\n"<<endl; }
void *sortbyat(){//根据到达时间排序
PCB *q=pcb;
for(int i=0;i<4;i++){
for(int j=i+1;j<5;j++){
if(q[i].at>q[j].at||(q[i].at==q[j].at&&q[i].st>q[j].st)){
PCB temp;
temp=q[i];
q[i]=q[j];
q[j]=temp;
}
}
}
}
void *fcfs(){//先来先服务
refresh();
sortbyat();
PCB *temp=pcb;
service(5);
char c[100]="先来先服务";
show(temp,c,1);
zztcal();
}
void sjf(PCB *p, int N) //短进程优先
{
refresh();
sortbyat();
for(int m=0; m<N-1; m++)
{
if(m == 0)
p[m].ot = p[m].at + p[m].st;
else
p[m].ot = ((p[m-1].ot >= p[m].at)? p[m-1].ot: p[m].at) + p[m].st;
int i=0;
for(int n = m+1; n <= N-1; n++)
{
if(p[n].at <= p[m].ot) i++;
else break;
}
float min = p[m+1].st;
int next = m+1;
for(int k = m+1; k < m+i; k++)
{
if(p[k+1].st < min)
{
min = p[k+1].st;
next = k+1;
}
}
PCB temp;
temp=p[m+1];
p[m+1]=p[next];
p[next]=temp;
}
int k;
service(5);
char c[100]="短进程优先";
show(pcb,c,1);
zztcal();
}
void hpf1(PCB *p, int N){//⾮抢占优先权
refresh();
sortbyat();
for(int m=0; m<N-1; m++)
{
if(m == 0)
p[m].ot = p[m].at + p[m].st;
else
p[m].ot = ((p[m-1].ot >= p[m].at)? p[m-1].ot: p[m].at) + p[m].st; int i=0;
for(int n = m+1; n <= N-1; n++)
{
if(p[n].at <= p[m].ot) i++;
else break;
}
float min = p[m+1].pri;
int next = m+1;
for(int k = m+1; k < m+i; k++)
{
if(p[k+1].pri < min)
{
min = p[k+1].pri;
next = k+1;
}
}
PCB temp;
temp=p[m+1];
p[m+1]=p[next];
p[next]=temp;
}
int k;
service(5);
char c[100]="优先权⾮抢占";
show(pcb,c,1);
zztcal();
}
//*
void hpf2(PCB *p, int N){//强占优先权
refresh();
sortbyat();
PCB ps[5];
int sumst=0;
for(int z=0;z<N;z++){
ps[z]=pcb[z];
sumst+=p[z].st;//计算总服务时间
}
float min;//最⼤优先权
char cn;
for(int m=0; m<sumst;)
int i=0;
for(int n=0;n<N;n++)//出已排序好的数组中已到达的任务
{
if(p[n].at<=m){
i++;
}
}
int next =0;
min=100;
cn=NULL;
for(int k=0;k<i;k++)//
{
if(p[k].st!=0&&p[k].run_flag==0&&p[k].pri<=min)
{
min = p[k].pri;
next = k;
cn=p[k].name;
}
}
if(m==0)cout<<cn;
else cout<<"-"<<cn;
if(p[next].start_flag==0) //判断是否第⼀次执⾏,记录开始执⾏时间
{
p[next].bt=m;
p[next].start_flag=1;
}
if(p[next].st>=1)//多于⼀个时间⽚未执⾏
{
m++;
p[next].st--;
}
cstring转为intif(p[next].st==0)
{
p[next].ot=m;
p[next].run_flag=1;//该进程运⾏结束
}
}
for(int k=0; k<5; k++)
{
p[k].st=ps[k].st;
p[k].zzt = p[k].ot - p[k].at;
p[k].dqzzt = p[k].zzt / p[k].st;
}
char c[100]="优先权抢占";
show(p,c,0);
zztcal();
}
void refresh(){
for(int i=0;i<5;i++){
pcb[i].bt=0;pcb[i].ot=0;pcb[i].zzt=0;pcb[i].dqzzt=0;pcb[i].run_flag=0;pcb[i].start_flag=0; }
}
int charge()//判断是否全部进程都执⾏完毕
{
int k;
int super_flag=0;
for(k=0; k<5; k++)
{
if(pcb[k].run_flag==0)
{
super_flag=1;
return super_flag;
break;
}
return super_flag;
}
void RR()//时间⽚轮转
{
float zzt=0;
int j=0;
int k=0;
int x=0;
PCB ps[5]; //备份信息,之后⽤于恢复servertime
for(int i=0; i<5; i++)
ps[j++]=pcb[i]; //对进程的初始化信息备份
zzt=pcb[0].at;
while(charge())//直到所有进程运⾏完毕
{
for(int i=0; i<5; i++,x++)
{
if(i>0)
{
if(pcb[i].at>zzt&&pcb[i-1].run_flag==1)//前⾯运⾏完了
zzt=pcb[i].at;//⽤于进程不连续时跳过间隔
}
if(pcb[i].run_flag==0&&pcb[i].at<=zzt) //该进程还未结束
{
if(pcb[i].start_flag==0) //判断是否第⼀次执⾏,记录开始执⾏时间 {
pcb[i].bt=zzt;
pcb[i].start_flag=1;
}
if(pcb[i].st/key>1)//多于⼀个时间⽚未执⾏
{
pcb[i].st=pcb[i].st-key;
zzt=zzt+key;
}
else if(pcb[i].st-key==0)
{
zzt=zzt+key;
pcb[i].ot=zzt;
pcb[i].run_flag=1;//该进程运⾏结束
pcb[i].st=ps[i].st;
}
else //运⾏⼩于⼀个时间⽚长度
{
zzt=zzt+pcb[i].st;
pcb[i].ot=zzt;
pcb[i].run_flag=1;
pcb[i].st=ps[i].st;
}
if(x==0)cout<<"调度顺序为:"<<pcb[i].name;
else cout<<"->"<<pcb[i].name;
}
}
}
}
void tpc(int bk){
refresh();
key=bk;
sortbyat();
RR();
for(int k=0; k<5; k++)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论