您的位置:首页 > 其它

刚写完的模拟操作系统调度算法,与大家分享

2008-04-05 00:17 387 查看
今天晚上刚写完的操作系统调度程序,在这里与大家分享,如朋友你有更好的实现方法,希望能贴出来一同分享。


#include<stdio.h>


#include<string.h>


#include<iostream>


using namespace std;


const int MAXPCB=10; //定义最大进程数


const int cputime=40;


//定义进程结构体




typedef struct node...{


char name[20];


int status;


int time;


int privilege;


int finished;


int wait_time;




/**//*后添加部分*/


int taskruntimesum;//任务需要运行多少时间


int taskruntime;//cpu分给任务每次运行时间


int taskruntimed;//任务已运行时间


int taskstep;//任务运行的次数


int tasksteped;//任务已运行的次数


int taskaddtimes;//每次运行时间的和


bool taskfinished;//任务完成已完成, 默认为false


}pcb;


pcb pcbs[MAXPCB];


int quantity;


//初始化函数


void initial()




...{


int i;


for(i=0;i<MAXPCB;i++)




...{


strcpy(pcbs[i].name,"");


pcbs[i].status=0;


pcbs[i].time=0;


pcbs[i].privilege=0;


pcbs[i].finished=0;


pcbs[i].wait_time=0;




/**//*后添加部分*/


pcbs[i].taskruntimesum=0;


pcbs[i].taskruntime=0;


pcbs[i].taskruntimed=0;


pcbs[i].taskstep=0;


pcbs[i].tasksteped=0;


pcbs[i].taskaddtimes=0;


pcbs[i].taskfinished=false;




}


quantity=0;


}


//读数据函数


int readData()




...{


FILE *fp;


char fname[20];


int i;


cout<<"请输入进程流文件名:";


cin>>fname;


if((fp=fopen(fname,"r"))==NULL)




...{


cout<<"错误,文件打不开,请检查文件名"<<endl;


system("pause");


}


else




...{


while(!feof(fp))




...{


fscanf(fp,"%s %d %d %d",pcbs[quantity].name,&pcbs[quantity].status,&pcbs[quantity].time,&pcbs[quantity].privilege);


quantity++;


}




//输出所读入的数据


cout<<"输出所读入的数据"<<endl;


cout<<"进程名 进程状态 所需时间 优先数"<<endl;


for(i=0;i<quantity;i++)




...{


cout<<" "<<pcbs[i].name<<" "<<pcbs[i].status<<" "<<pcbs[i].time<<" "<<pcbs[i].privilege<<endl;


}


cout<<quantity;


system("pause");


return(1);


}


return(0);


}


//重置数据,以供另一个算法使用


void init()




...{


int i;


for(i=0;i<MAXPCB;i++)




...{


pcbs[i].finished=0;


pcbs[i].wait_time=0;


}


}


//先进先出算法


void FIFO()




...{


int i,j;


int total;


//输出FIFO算法执行流


cout<<endl<<"---------------------------------------------------------------"<<endl;


cout<<"FIFO算法执行流:"<<endl;


cout<<"进程名 等待时间"<<endl;




for(i=0;i<quantity;i++)...{


cout<<" "<<pcbs[i].name<<" "<<pcbs[i].wait_time<<endl;






for(j=i+1;j<quantity;j++)...{


pcbs[j].wait_time+=pcbs[i].time;


}


}


total=0;




for(i=0;i<quantity;i++)...{


total+=pcbs[i].wait_time;


}


cout<<"总等待时间:"<<total<<" 平均等待时间:"<<total/quantity<<endl;


system("pause");


}




//优先数调度算法


void privilege()




...{


int i,j,p;


int passed_time=0;


int total;


int queue[MAXPCB];


int current_privilege=1000;


for(i=0;i<quantity;i++)




...{


current_privilege=1000;


for(j=0;j<quantity;j++)




...{


if((pcbs[j].finished==0)&&(pcbs[j].privilege<current_privilege))




...{


p=j;


current_privilege=pcbs[j].privilege;


}


}


queue[i]=p;


pcbs[p].finished=1;


pcbs[p].wait_time+=passed_time;


passed_time+=pcbs[p].time;


}


//输出优先数调度执行流


cout<<endl<<"---------------------------------------------------------------"<<endl;


cout<<"优先数调度执行流:"<<endl;


cout<<"进程名 等待时间"<<endl;




for(i=0;i<quantity;i++)...{


cout<<" "<<pcbs[queue[i]].name<<" "<<pcbs[queue[i]].wait_time<<endl;


}


total=0;


for(i=0;i<quantity;i++)




...{


total+=pcbs[i].wait_time;


}


cout<<"总等待时间:"<<total<<" 平均等待时间:"<<total/quantity<<endl;


system("pause");


}








void inittime()...{


//int taskruntimesum;//任务需要运行多少时间


//int taskruntime;//cpu分给任务每次运行时间


//int taskruntimed;//任务已运行时间


//int taskstep;//任务运行的次数


//int tasksteped;//任务已运行的次数


//bool taskfinished;//任务完成已完成, 默认为false


//char name[20];


//int status;


//int time;


//int privilege;


//int finished;


//int wait_time;






for(int i=0;i<quantity;i++)...{


pcbs[i].taskruntimesum=pcbs[i].time;






}




}








//分时调试算法


void timeRun()




...{


int i,alltaskcleari=0,alltaskruntimes=1;//所有任务每次运行的时间记数


int alltasknumber=quantity;


int sum=0,breaks;




for(i=0;i<quantity;i++)...{


pcbs[i].taskruntime=cputime/quantity; //任务运行时间


sum+=pcbs[i].time;


}


// sum=sum/quantity;


int jingcheng=quantity;




do...{




alltaskcleari=0; //每执行完整个进程数量就把这个进程记数清零,以方便那些还没有完成的进程再次运行




for(i=0;i<jingcheng;i++)...{


alltaskruntimes=1;//每个进程的时间记数清零




while(true)...{




if(pcbs[i].taskruntime>pcbs[i].taskruntimesum)...{


//比较,如果进程的需要运行时间比cpu分配的时间还小,刚他的分配时间就为进程需要运行时间


pcbs[i].taskruntime=pcbs[i].taskruntimesum;


}






if(alltaskruntimes<=pcbs[i].taskruntime)...{


alltaskruntimes++; //一个进程他的运行时间




}else...{


//pcbs[i].taskruntimed+=alltaskruntimes-1; //记录任务每次完成的时间


//pcbs[i].taskaddtimes+=alltaskruntimes-1;//把任务每次完成的时间全部累加起来




cout<<pcbs[i].name<<"第"<<i<<"次时间:"<<pcbs[i].taskruntimesum<<endl;




//pcbs[i].taskruntime=pcbs[i].taskruntimesum-pcbs[i].taskruntimed;


pcbs[i].taskruntimesum=pcbs[i].taskruntimesum-pcbs[i].taskruntime;




pcbs[i].tasksteped++;


break;


}




}


//记住每一个进程运行完一次的个数




if(++alltaskcleari==jingcheng)...{


i=-1;


}




if(pcbs[i].taskaddtimes==pcbs[i].time)...{


pcbs[i].taskfinished=true;




}






for(int k=1;k<jingcheng;k++)...{


if(pcbs[i].taskruntimesum==0)


breaks=1;




else...{


breaks=0;


break;


}




}




}










if(breaks==1)


break;




}while(sum-=10);




}//?分时调度执行完毕








//显示版权信息函数


void version()




...{


cout<<endl<<endl;


cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;


cout<<" ┃    操作系统进程调度模拟系统       ┃"<<endl;


cout<<" ┠───────────────────────┨"<<endl;


cout<<" ┃   (c)All Right Reserved MQ    ┃"<<endl;


cout<<" ┃      emngqing@tom.com         ┃"<<endl;


cout<<" ┃     version 2008 build 0327    ┃"<<endl;


cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;


cout<<endl<<endl;


}


//主函数


int main()




...{


int flag;


version();


initial();


flag=readData();


if(flag==1)




...{


FIFO();


init();


privilege();


// init();


inittime();


timeRun();


}


return 0;


}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: