刚写完的模拟操作系统调度算法,与大家分享
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;
}
#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;
}
相关文章推荐
- 操作系统——使用动态优先权的进程调度算法的模拟
- c++模拟操作系统进程调度算法(优先数,时间片轮转)
- Java模拟操作系统进程调度算法—先来先服务、短作业优先、高响比优先
- 模拟实现操作系统调度算法
- 操作系统实验之一--进程调度算法的模拟实现
- Java模拟操作系统进程调度算法—先来先服务、短作业优先、高响比优先
- [2017/05/18]操作系统调度算法--最短剩余时间优先算法的模拟实现
- 用C++模拟操作系统进程调度的几种算法
- 操作系统处理器调度算法c++模拟
- 计算机操作系统的进程调度的五种算法
- 操作系统轮转调度算法(c语言描述)
- 【操作系统】实验三 进程调度模拟程序
- 操作系统内存,磁盘调度,进程调度算法
- 【操作系统】学习笔记(三)基于时间片轮转的进程调度算法
- 操作系统进程调度(FCFS)算法
- 0415-操作系统 实验二 作业调度模拟程序
- 操作系统进程调度算法
- 操作系统作业调度和低级调度算法>>计算题
- 操作系统中的调度算法
- 几个常用的操作系统进程调度算法