• 实验三 进程调度模拟程序2.0


    一、实验目的

    用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。

    二、实验要求

    设计一个有 N个进程并发执行的进程调度模拟程序。

    1.模拟进程数据的生成,允许用户选择输入每个进程所需运行时间,进程的运行时间以时间片为单位。

    2. 模拟调度程序的功能

    2.1 按照模拟数据的到达时间和所需运行时间,能分别执行以下调度算法。

    FCFS

    SJ

    HRRN

    RR

    2.2 显示每种算法下各进程的调度执行顺序。

    2.3计算各进程的开始执行时间,各作业的完成时间,周转时间和带权周转时间(周转系数)。

    三、实验说明

    1)  先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。

    2)  短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业。

    3)  响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高者优先调度。RP (响应比)= 作业周转时间 / 作业运行时间=1+作业等待时间/作业运行时间。

    4)  时间片轮转(RR)调度算法:调度程序每次把CPU分配给就绪队列首进程使用一个时间片,就绪队列中的每个进程轮流地运行一个时间片。当这个时间片结束时,强迫一个进程让出处理器,让它排列到就绪队列的尾部,等候下一轮调度。

    四、程序代码:

    #include<stdio.h> 
    #define time int
    #define max 24
    typedef struct queue{  
    	char name; 
            int intime; 
    	int needtime;
            int runningtime;  
    	float priority;
    	int waitingtime;
    	char state;
    	int starttime;
    	int finishtime;
    	float turntime;
    	float turnnumber;
    }PCB; 
    int n;
    int ptime;
    PCB pcb[max];
    void addprocess(int n){
    	int i;
    	for(i=0;i<n;i++){
            printf("
    请输入进程名:");
    	    scanf("%s", &pcb[i].name);
        	printf("
    请输入进程的优先级:");
        	scanf("%f", &pcb[i].priority);
        	printf("
    请输入进程的所需时间:");
        	scanf("%d", &pcb[i].needtime);
        	pcb[i].intime=i;
    	    pcb[i].state='W';//将进程的状态初始化为等待态
    	    pcb[i].runningtime=0;
    	}
    }
    void sort(){
    	int i,j;
    	PCB temp;
    	//通过排序将优先级最高的进程排到最前面
    	for (i=0;i<n-1;i++)  
    	{    
         for (j=n-2;j>=i;j--)   
    	 {     
           if (pcb[j+1].priority>pcb[j].priority)    
    	   {
             temp=pcb[j];      
             pcb[j]=pcb[j+1];     
             pcb[j+1]=temp;    
    	   }   
    	 }  
      }
    	if (pcb[0].state!='F')  
      {    
        pcb[0].state='R';                //将优先级最高的状态置为运行  
      } 
    }
    void Print(){
      int i;     
      printf("
      进程名    优先级   到达时间  需要时间  已用时间  进程状态 
    ");   
      for (i=0;i<n;i++)    
      {  printf("%7s%12f%10d%10d%10d%10c
    ",&pcb[i].name,pcb[i].priority,
                 pcb[i].intime,pcb[i].needtime,pcb[i].runningtime,pcb[i].state);  
      } 
    }
    void Print1(){
      int i;     
      printf("
      进程名      完成时间   开始的时间    周转时间       周转系数  
    ");   
      for (i=0;i<n;i++)    
      {  printf("%7s%10d%9d%20f%20f%
    ",&pcb[i].name,pcb[i].finishtime,pcb[i].starttime,
                 pcb[i].turntime,pcb[i].turnnumber);  
      } 
    }
    
    void RRattemper()                           //调度  
    {  
    	 int i=0,j=0;
      do{   
    	  if(i==n){
    			i=0;
    		}
    	 
          if ((pcb[i].needtime-pcb[i].runningtime)>ptime)     
    	  {   
            pcb[i].runningtime=pcb[i].runningtime+ptime;       //已用时间加时间片                  
            pcb[i].state='W';
    		i++;
    	  }        
          else     
    	  {   
    		if(i==n){
    			i=0;
    		}
            pcb[i].runningtime=pcb[i].needtime;//已用时间等于需要时间                  
            pcb[i].state='F';          //完成进程,将状态置为完成    
    	    if(i==0){
    				 pcb[i].waitingtime=0;
    			 }else{
    				 pcb[i].waitingtime=pcb[i-1].needtime+pcb[i-1].waitingtime;
    			 }
    		pcb[i].starttime=pcb[i].waitingtime;
    		pcb[i].finishtime=pcb[i].waitingtime+pcb[i].runningtime;
    		pcb[i].turntime=(float)pcb[i].finishtime-pcb[i].intime;
            pcb[i].turnnumber=(float)pcb[i].turntime/pcb[i].needtime;
    		i++; 
    		if(i==n){
    			i=0;
    		}
    		if(pcb[i].state=='F'){
    			j++;
    		}
    		
    	  }  
          Print();  
    	  
    	   
      }while(j<n); 
       Print1(); 
    }
     void FCFSattemper() 
     {
    	 int i=0;
         pcb[0].state='R';                //将最先到达的状态置为运行  
    	 do{
    		 if(pcb[i].state=='R'){
                 pcb[i].runningtime=pcb[i].needtime;
    			 if(i==0){
    				 pcb[i].waitingtime=0;
    			 }else{
    				 pcb[i].waitingtime=pcb[i-1].needtime+pcb[i-1].waitingtime;
    			 }
    			 pcb[i].starttime=pcb[i].waitingtime;
    			 pcb[i].finishtime=pcb[i].waitingtime+pcb[i].runningtime;
    			 pcb[i].turntime=(float)pcb[i].finishtime-pcb[i].intime;
                 pcb[i].turnnumber=(float)pcb[i].turntime/pcb[i].needtime;
    			 pcb[i].state='F';
    			 i++;
    			 pcb[i].state='R';
    		 }
    	 
    	 }while(pcb[n].state!='F');
    	 
    		 Print();
    	     Print1();
     }
     void SJattemper() 
     {
    	int i,j;
    	PCB temp;
    	//通过排序将时间最少的进程排到最前面
    	for (i=0;i<n-1;i++)  
    	{    
         for (j=n-2;j>=i;j--)   
    	 {     
           if (pcb[j+1].needtime<pcb[j].needtime)    
    	   {
             temp=pcb[j];      
             pcb[j]=pcb[j+1];     
             pcb[j+1]=temp;    
    	   }   
    	 }  
      }	    
        pcb[0].state='R';  //将时间最少的状态置为运行
    		i=0;  
    	do{
    	
    		 if(pcb[i].state=='R'){
                 pcb[i].runningtime=pcb[i].needtime;
    			 if(i==0){
    				 pcb[i].waitingtime=0;
    			 }else{
    				 pcb[i].waitingtime=pcb[i-1].needtime+pcb[i-1].waitingtime;
    			 }
    			 pcb[i].starttime=pcb[i].waitingtime;
    			 pcb[i].finishtime=pcb[i].waitingtime+pcb[i].runningtime;
    			 pcb[i].turntime=(float)pcb[i].finishtime-pcb[i].intime;
                 pcb[i].turnnumber=(float)pcb[i].turntime/pcb[i].needtime;
    			 pcb[i].state='F';
    			 i++;
    			 pcb[i].state='R';
    		 }
    	 
    	 }while(pcb[n].state!='F');
    		 Print();
             Print1();
     }
     void HRRNattemper()
     {
    	 int i,j,k=1;
    	 PCB temp;
             sort();
    	 pcb[0].runningtime=pcb[0].needtime;
    	 pcb[1].waitingtime=pcb[0].needtime;
    	 pcb[0].state='F';
    	 for(i=1;i<n;i++){
    		pcb[i].runningtime=pcb[i].needtime;
    	    pcb[i].priority=1+pcb[i].waitingtime/pcb[i].runningtime;
    		pcb[i+1].waitingtime=pcb[i].needtime+pcb[i].waitingtime;
    		
    	 }
    	 for (i=1;i<n-1;i++)  
    	 {    
         for (j=n-2;j>=i;j--)   
    	 {     
           if (pcb[j+1].priority>pcb[j].priority)    
    	   {
             temp=pcb[j];      
             pcb[j]=pcb[j+1];     
             pcb[j+1]=temp;    
    	   }   
    	 }  
    	 }
         for(i=1;i<n;i++){
             pcb[i].runningtime=0;
    	 }
    	 pcb[1].state='R'; 
          do{
    		 if(pcb[k].state=='R'){
                 pcb[k].runningtime=pcb[k].needtime;
    			  pcb[k].runningtime=pcb[k].needtime;
    			 if(k==0){
    				 pcb[k].waitingtime=0;
    			 }else{
    				 pcb[k].waitingtime=pcb[k-1].needtime+pcb[k-1].waitingtime;
    			 }
    			 pcb[k].starttime=pcb[k].waitingtime;
    			 pcb[k].finishtime=pcb[k].waitingtime+pcb[k].runningtime;
    			 pcb[k].turntime=(float)pcb[k].finishtime-pcb[k].intime;
                 pcb[k].turnnumber=(float)pcb[k].turntime/pcb[k].needtime;
    			 pcb[k].state='F';
    			 k++;
    			 pcb[k].state='R';
    		 }
    	 
    	 }while(pcb[n].state!='F');
    	 Print();
    	 Print1();
         
     }
     int choose(){
    	 int number;
    	 printf("
    选择FCFS算法的请输入1:
    ");
         printf("
    选择SJ算法的请输入2:
    ");
         printf("
    选择HRRN算法的请输入3:
    ");
         printf("
    选择RR算法的请输入4:
    ");
    	 printf("
    结束请输入0:
    ");
    	 scanf("%d",&number);
    	 return number;
     }
    
    main(){ 
    	int chose;
         n=0;
    	 printf("请输入进程数:");
    	 scanf("%d", &n);
    	 
         addprocess(n);
    	 Print();
    	 chose=choose();
    	
    	 do{
    		if(chose==1){FCFSattemper(); chose=choose();}
    		if(chose==2){SJattemper(); chose=choose();}
    		if(chose==3){HRRNattemper(); chose=choose();}
    		if(chose==4){printf("请输入时间片的值:");
    	                    scanf("%d",&ptime);RRattemper(); chose=choose();}
    		if(chose==0){break;}
    	 }while(1);
    	 
    	 
          
    }
    

      五、程序代码的简单说明

    (1)、定义一个进程控制块PCB:

    typedef struct queue{  
    	char name; 
            int intime; 
    	int needtime;
            int runningtime;  
    	float priority;
    	int waitingtime;
    	char state;
    	int starttime;
    	int finishtime;
    	float turntime;
    	float turnnumber;
    }PCB; 
    

      

    (2)、程序的主函数:

    main(){ 
    	int chose;
             n=0;
    	 printf("请输入进程数:");
    	 scanf("%d", &n);
             addprocess(n);
    	 Print();
    	 chose=choose();
    	 do{
    		if(chose==1){FCFSattemper(); chose=choose();}
    		if(chose==2){SJattemper(); chose=choose();}
    		if(chose==3){HRRNattemper(); chose=choose();}
    		if(chose==4){printf("请输入时间片的值:");
    	                     scanf("%d",&ptime);RRattemper(); chose=choose();}
    		if(chose==0){break;}
    	 }while(1);
    	 
    	 
          
    }
    

      

    (3)、输入进程的函数:

    void addprocess(int n){
    	int i;
    	for(i=0;i<n;i++){
            printf("
    请输入进程名:");
    	    scanf("%s", &pcb[i].name);
        	printf("
    请输入进程的优先级:");
        	scanf("%f", &pcb[i].priority);
        	printf("
    请输入进程的所需时间:");
        	scanf("%d", &pcb[i].needtime);
        	pcb[i].intime=i;
    	    pcb[i].state='W';//将进程的状态初始化为等待态
    	    pcb[i].runningtime=0;
    	}
    }
    

      

    (4)算法选择的函数:

     int choose(){
    	 int number;
    	 printf("
    选择FCFS算法的请输入1:
    ");
             printf("
    选择SJ算法的请输入2:
    ");
             printf("
    选择HRRN算法的请输入3:
    ");
             printf("
    选择RR算法的请输入4:
    ");
    	 printf("
    结束请输入0:
    ");
    	 scanf("%d",&number);
    	 return number;
     }
    

      

    (5)、先来先服务(FCFS)调度算法:

     void FCFSattemper() 
     {
    int i=0; pcb[0].state='R'; //将最先到达的状态置为运行 do{ if(pcb[i].state=='R'){ pcb[i].runningtime=pcb[i].needtime; if(i==0){ pcb[i].waitingtime=0; }else{ pcb[i].waitingtime=pcb[i-1].needtime+pcb[i-1].waitingtime; } pcb[i].starttime=pcb[i].waitingtime; pcb[i].finishtime=pcb[i].waitingtime+pcb[i].runningtime; pcb[i].turntime=(float)pcb[i].finishtime-pcb[i].intime; pcb[i].turnnumber=(float)pcb[i].turntime/pcb[i].needtime; pcb[i].state='F'; i++; pcb[i].state='R'; } }while(pcb[n].state!='F'); Print(); Print1(); }

      

    (6)、短作业优先 (SJF) 调度算法:

     void SJattemper() 
     {
    	int i,j;
    	PCB temp;
    	//通过排序将时间最少的进程排到最前面
    	for (i=0;i<n-1;i++)  
    	{    
            for (j=n-2;j>=i;j--)   
    	 {     
            if (pcb[j+1].needtime<pcb[j].needtime)    
    	 {
             temp=pcb[j];      
             pcb[j]=pcb[j+1];     
             pcb[j+1]=temp;    
    	 }   
    	 }  
      }	    
        pcb[0].state='R';  //将时间最少的状态置为运行
           i=0;  
    	do{
    	if(pcb[i].state=='R'){
            pcb[i].runningtime=pcb[i].needtime;
    	if(i==0){
    	        pcb[i].waitingtime=0;
    	}else{
    	        pcb[i].waitingtime=pcb[i-1].needtime+pcb[i-1].waitingtime;
    	}
    	pcb[i].starttime=pcb[i].waitingtime;
    	pcb[i].finishtime=pcb[i].waitingtime+pcb[i].runningtime;
    	pcb[i].turntime=(float)pcb[i].finishtime-pcb[i].intime;
            pcb[i].turnnumber=(float)pcb[i].turntime/pcb[i].needtime;
            pcb[i].state='F';
    	 i++;
    	 pcb[i].state='R';
    		 }
    	 
    	 }while(pcb[n].state!='F');
    		 Print();
             Print1();
     }
    

      

    (7)、响应比高者优先(HRRN)调度算法:

    void HRRNattemper()
     {
             int i,j,k=1;
    	 PCB temp;
             sort();
    	 pcb[0].runningtime=pcb[0].needtime;
    	 pcb[1].waitingtime=pcb[0].needtime;
    	 pcb[0].state='F';
    	 for(i=1;i<n;i++){
    		pcb[i].runningtime=pcb[i].needtime;
    	        pcb[i].priority=1+pcb[i].waitingtime/pcb[i].runningtime;
    		pcb[i+1].waitingtime=pcb[i].needtime+pcb[i].waitingtime;
    	 }
    	 for (i=1;i<n-1;i++)  
    	 {    
             for (j=n-2;j>=i;j--)   
    	 {     
               if (pcb[j+1].priority>pcb[j].priority)    
    	   {
                temp=pcb[j];      
                pcb[j]=pcb[j+1];     
                pcb[j+1]=temp;    
    	   }   
    	 }  
    	 }
             for(i=1;i<n;i++){
                 pcb[i].runningtime=0;
    	 }
    	 pcb[1].state='R'; 
             do{
    	     if(pcb[k].state=='R'){
                 pcb[k].runningtime=pcb[k].needtime;
    	     pcb[k].runningtime=pcb[k].needtime;
    	     if(k==0){
    		pcb[k].waitingtime=0;
    	      }else{
    	         pcb[k].waitingtime=pcb[k-1].needtime+pcb[k-1].waitingtime;
    		}
    		pcb[k].starttime=pcb[k].waitingtime;
    	        pcb[k].finishtime=pcb[k].waitingtime+pcb[k].runningtime;
    		pcb[k].turntime=(float)pcb[k].finishtime-pcb[k].intime;
                    pcb[k].turnnumber=(float)pcb[k].turntime/pcb[k].needtime;
    			 pcb[k].state='F';
    			 k++;
    			 pcb[k].state='R';
    		 }
    	 }while(pcb[n].state!='F');
    	 Print();
    	 Print1();
         
     }
    

      

    (8)时间片轮转(RR)调度算法:

    void RRattemper()                           //调度  
    {  
    int i=0,j=0; do{ if(i==n){ i=0; } if ((pcb[i].needtime-pcb[i].runningtime)>ptime){ pcb[i].runningtime=pcb[i].runningtime+ptime; //已用时间加时间片 pcb[i].state='W'; i++; } else { if(i==n){ i=0;
    } pcb[i].runningtime=pcb[i].needtime;//已用时间等于需要时间 pcb[i].state='F'; //完成进程,将状态置为完成 if(i==0){ pcb[i].waitingtime=0; }else{ pcb[i].waitingtime=pcb[i-1].needtime+pcb[i-1].waitingtime; } pcb[i].starttime=pcb[i].waitingtime; pcb[i].finishtime=pcb[i].waitingtime+pcb[i].runningtime; pcb[i].turntime=(float)pcb[i].finishtime-pcb[i].intime; pcb[i].turnnumber=(float)pcb[i].turntime/pcb[i].needtime; i++; if(i==n){ i=0; } if(pcb[i].state=='F'){ j++; } } Print();
    }while(j<n); Print1(); }

      

         六、实验结果截图:

      图1、输入进程的效果图

    图2、先来先服务算法效果图

    图3、短作业优先 (SJF) 调度算法效果图

    图4、响应比高者优先(HRRN)调度算法效果图

    图5.1、时间片轮转(RR)调度算法效果图

    图5.2、时间片轮转(RR)调度算法效果图

    图5.3、时间片轮转(RR)调度算法效果图

    七、试验总结:

    通过几次的模拟进程的调度,对进程在操作系统中调度就更加了解,认识更深刻。

  • 相关阅读:
    把一个"结构体"当做属性后碰到的问题
    执行 Application.Terminate 后, OnDestroy 中的代码还会执行
    JavaScript 演练(4). 回调函数
    给 System.Zip 增加了个(多文件解压时的)解压进度事件
    各种媒体数据以 base64 编码方式直接嵌入网页中的写法
    JavaScript 演练(3). 判断是否是数组
    JavaScript 演练(1). 定义一组常量或一组函数
    覆盖、再覆盖
    一组文件名(主要以数字命名), 我想按数字大小排序
    Enterprise Library 2.0 Hands On Lab 翻译(12):安全应用程序块(一)
  • 原文地址:https://www.cnblogs.com/1-aa/p/5550835.html
Copyright © 2020-2023  润新知