刚写完的模拟操作系统调度算法,与大家分享
来源:互联网 发布:妇科看病流程 知乎 编辑:程序博客网 时间:2024/06/09 15:59
今天晚上刚写完的操作系统调度程序,在这里与大家分享,如朋友你有更好的实现方法,希望能贴出来一同分享。
#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<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++模拟操作系统进程调度的几种算法
- 操作系统的调度算法
- 操作系统处理器调度算法c++模拟
- 操作系统处理机调度算法模拟实现
- 毕业生如何从容应对校园招聘问与答(刚看到的,和大家分享下)
- android实现联网小例子,刚学习与大家分享
- 【操作系统】C语言模拟操作系统优先数调度算法
- 【操作系统】作业调度的算法
- 操作系统的作业调度算法
- 操作系统的进程调度算法
- 操作系统常见的调度算法
- 操作系统----常见的调度算法
- 操作系统的进程调度算法
- [2017/05/18]操作系统调度算法--最短剩余时间优先算法的模拟实现
- 需求分析:将技术语言和业务语言统一
- SPS2007权限体系分析
- 关于socket
- 从身边小事做起 为开源发展增砖添瓦
- c/c++函数指针变量和函数指针参数
- 刚写完的模拟操作系统调度算法,与大家分享
- 把握现在,掌控未来:2008 Java开发展望
- 不寻常的休假
- 要成为Java高手需要注意的25个学习目标
- Oracle 9i数据库OMS没有数据库节点的解决办法
- 周立功-采访笔录
- 一个很奇怪的问题
- 右边悬浮广告--随滚动条移动--简单实用
- 周立功:其实做什么产品都赚钱,关键看您做得怎么样