OStask2

来源:互联网 发布:怎样查看淘宝价格曲线 编辑:程序博客网 时间:2024/05/21 15:55
Code:
  1. #include <iostream>   
  2. #include<string.h>   
  3.   
  4. using namespace std;   
  5. const int block_time=5; //定义时间片的长度为10秒   
  6. const int maxPCB=100;   //定义最大进程数   
  7.   
  8. //------------------------------定义进程结构体------------------------   
  9. typedef struct node   
  10. {   
  11.     char name[20];   
  12.     int status;   
  13.     /**  
  14.     三个状态:1:运行态,2:就绪态,3:完成态。  
  15.     */  
  16.     int time;   
  17.     int privilege;   
  18.     int finished;//完成状态   
  19.     int wait_time;   
  20. }pcb;   
  21.     pcb pcbs[maxPCB]; //结构体数组   
  22.     int quantity;     //总进程数量   
  23. //----------------------------初始化函数------------------------------   
  24. void initpcbfoo()   
  25. {   
  26.     /*  
  27.     * 初始化pcb信息  
  28.     */  
  29.     int i;   
  30.     for(i=0;i<maxPCB;i++)   
  31.     {   
  32.         strcpy(pcbs[i].name,"");   
  33.         pcbs[i].status=0;   
  34.         pcbs[i].time=0;   
  35.         pcbs[i].privilege=0;   
  36.         pcbs[i].finished=0;   
  37.         pcbs[i].wait_time=0;   
  38.     }   
  39.     quantity=0;//开始至进程数量为0;   
  40. }   
  41. //-------------------从文件中读数据函数 -------------   
  42. int readdatafoo()   
  43. {   
  44.     FILE *fp;   
  45.     char fname[20];   
  46.     int i;   
  47.     cout<<"请输入进程信息文件aaa.txt:";   
  48.     cin>>fname;   
  49.     if((fp=fopen(fname,"r"))==NULL)   
  50.     {   
  51.         cout<<"错误,文件打不开,请检查文件名"<<endl;   
  52.     }   
  53.     else  
  54.     {   
  55.         while(!feof(fp))   
  56.         {   
  57.             fscanf(fp,"%s %d %d ",pcbs[quantity].name,&pcbs[quantity].status,   
  58.                 &pcbs[quantity].time,&pcbs[quantity].privilege);   
  59.             quantity++;   
  60.         } //输出所读入的数据  次序为:进程名 进程状态 所需时间 优先数   
  61.         cout<<"所读入的 进程信息数据"<<endl;   
  62.         cout<<"进程名 进程状态 所需时间 优先数"<<endl;   
  63.         for(i=0;i<quantity;i++)   
  64.         {   
  65.             cout<<" "<<pcbs[i].name<<" "<<pcbs[i].status<<" "<<pcbs[i].time<<" "<<pcbs[i].privilege<<endl;   
  66.         }   
  67.         return(1);   
  68.     }   
  69.     return(0);   
  70. }   
  71. //重置数据,以供另一个算法使用   
  72. void init()   
  73. {   
  74.     int i;   
  75.     for(i=0;i<maxPCB;i++)   
  76.     {   
  77.         pcbs[i].finished=0; pcbs[i].wait_time=0;   
  78.     }   
  79. }   
  80. //先进先出算法   
  81. void FIFOfoo()   
  82. {   
  83.     int i,j; int total;   
  84.     //输出FIFO算法执行流   
  85.     cout<<endl<<"*****************************************************"<<endl;   
  86.     cout<<"FIFO算法:"<<endl;   
  87.     cout<<"进程名 等待时间"<<endl;   
  88.     for(i=0;i<quantity;i++)   
  89.     {   
  90.         cout<<" "<<pcbs[i].name<<" "<<pcbs[i].wait_time<<endl;   
  91.         for(j=i+1;j<quantity;j++)   
  92.         {   
  93.             pcbs[j].wait_time+=pcbs[i].time;   
  94.         }   
  95.     }   
  96.     total=0;   
  97.     for(i=0;i<quantity;i++)   
  98.     {   
  99.          total+=pcbs[i].wait_time;   
  100.     }   
  101.     cout<<"总等待时间:"<<total<<" 平均等待时间:"<<total/quantity<<endl;   
  102. }   
  103. /*--------------------------间片轮转调度算法---------------------------------*/  
  104. void RRtimefoo()   
  105. {   
  106.     cout<<endl<<"*******************************************************"<<endl;   
  107.     cout<<"时间片轮转调度(时间片设为5):"<<endl;   
  108.     int i,j,number,flag=1;   
  109.     int passed_time=0;   
  110.     int max_time=0;   
  111.     int round=0;   
  112.     int queue[1000];   
  113.     int total=0;   
  114.     while(flag==1)   
  115.     {   
  116.         flag=0;   
  117.         number=0;   
  118.         for(i=0;i<quantity;i++)   
  119.         {   
  120.             if(pcbs[i].finished==0)   
  121.             { number++; j=i; }   
  122.         }   
  123.         if(number==1)   
  124.         { queue[total]=j; total++; pcbs[j].finished=1; }   
  125.         if(number>1)   
  126.         {   
  127.             for(i=0;i<quantity;i++)   
  128.             {   
  129.                 if(pcbs[i].finished==0)   
  130.                 { flag=1;   
  131.                 queue[total]=i;   
  132.                 total++;   
  133.                 if(pcbs[i].time<=block_time*(round+1))   
  134.                 {   
  135.                     pcbs[i].finished=1;   
  136.   
  137.                 }   
  138.                 }   
  139.             }   
  140.         }   
  141.         round++;   
  142. }   
  143.     if(queue[total-1]==queue[total-2])   
  144.     {   
  145.         total--;   
  146.     }   
  147.   
  148.     for(i=0;i<total;i++)   
  149.     {   
  150.         cout<<pcbs[queue[i]].name<<" ";   
  151.         cout<<endl;   
  152.     }   
  153. cout<<"*******************************************************"<<endl;   
  154. }   
  155. //显示   
  156. void help()   
  157. {   //cout<<" Define what you want do!/n";   
  158.     cout<<"*****Created by husiwen******/n";   
  159.     cout<<"--------------------------------/n";   
  160.     cout<<"**  *1.时间片轮转调度         **/n";   
  161.     cout<<"**  *2.先来先服务调度         **/n";   
  162.     cout<<"**  *0.退出                   **/n";   
  163.     cout<<"--------------------------------/n";   
  164. }   
  165. void seek()   
  166. {   
  167.   int flag;   
  168.   cout<<"请选择你要进行的操作:";   
  169.   cin>>flag;   
  170.   while(0!=flag)   
  171.   {   
  172.       switch(flag)   
  173.       {   
  174.           case  1:   //时间片轮转调度   
  175.           {   
  176.               cout<<"    你选择的是时间片轮转调度"<<endl;   
  177.               initpcbfoo();   
  178.             int openflag=readdatafoo();   
  179.             if(1 == openflag)   
  180.             {   
  181.                 //init();   
  182.                 //initpcbfoo();   
  183.                 RRtimefoo();   
  184.             }   
  185.   
  186.   
  187.   
  188.   
  189.   
  190.           }   
  191.           flag = 0;   
  192.           seek();   
  193.           break;   
  194.   
  195.           case  2:   //先来先服务调度   
  196.           {   
  197.               cout<<"  你选择的是先来先服务调度"<<endl;   
  198.                initpcbfoo();   
  199.                int openflag=readdatafoo();   
  200.             if(1 == openflag)   
  201.             {   
  202.                 //init();   
  203.                 //initpcbfoo();   
  204.                 FIFOfoo();   
  205.             }   
  206.   
  207.           }   
  208.           flag = 0;   
  209.           seek();   
  210.           break;   
  211.           default:   
  212.           cout<<"erro/n";   
  213.           seek();// 输入错误 ,再次调用 seek 函数 提示用户输入选择操作;   
  214.           break;   
  215.       }   
  216.   }   
  217.   return ;   
  218. }   
  219. //主函数   
  220. int  main()   
  221. {   
  222.     help();   
  223.     seek();   
  224.     return 0;   
  225. }