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

来源:互联网 发布:妇科看病流程 知乎 编辑:程序博客网 时间: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
  }
  


 
原创粉丝点击