• 1202实验三 进程调度实验


    一、实验目的

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

     

    二、实验内容和要求

    1.要求:设计一个有 N(N不小于5)个进程并发执行的进程调度模拟程序。

    进程调度算法:“时间片轮转法”调度算法对N个进程进行调度。 

    2.完成两个算法(简单时间片轮转法、多级反馈队列调度算法)的设计、编码和调试工作,完成实验报告。

        1) 每个进程有一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、优先级、到达时间、需要运行时间、已用CPU时间、进程状态等等。 

        2) 每个进程的状态可以是就绪 r(ready)、运行R(Running)、或完成F(Finished)三种状态之一。

        3) 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。

        4) 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,应把它插入就绪队列等待下一次调度。

        5) 每进行一次调度,程序都打印一次运行进程、就绪队列中各个进程的 PCB,以便进行检查。   

        6) 重复以上过程,直到所要进程都完成为止。

     

    三、实验方法、步骤及结果测试

    1. 源程序名:压缩包文件(rar或zip)中源程序名3.c

     

    可执行程序名:3.exe

     

    2. 原理分析及流程图

     

          这个程序主要是对进程调度算法的使用,主程序里是menu( )函数的调用,将menu( )函数放在while(1)内,使之不断被执行,以实现实验要求的效果。

     

           

     

    3. 主要程序段及其解释:

    #include<stdio.h>
    typedef struct JCB{ 
    	char name[10];
        char state;
        int arrivetime;     //到达时间
        int runtime;       //运行需要时间
        int staut;         //状态
    }pcb;
    
    pcb work[10],work1[10],work2[10];
    int a,n,now,i,j;
    static int maxruntime;
    int number=1;
    input()
    {
    	int num,aaa=0;
    
    	printf("
    总共有多少个作业?");
    	scanf("%d",&n);
    	printf("
    请输入各进程的进程名字 到达时间 所需时间:
    ");
    	for(aaa=0;aaa<n;aaa++)
    	{
    		scanf("%s",&work[aaa].name);
    		scanf("%d",&work[aaa].arrivetime);
    		scanf("%d",&work[aaa].runtime);
    	}
    	printf("已输入信息:
    ");
    	printf("   进程名字  到达时间  所需时间
    ");
    	for(num=0;num<n;num++) 
    	{
    		printf("	%s	%d	%d	
    ",work[num].name,work[num].arrivetime,work[num].runtime);
    	}
    }
    
    max()
    {
    	pcb temp;
    	for(i=0;i<10;i++)
    	{
    		work1[i]=work[i];
    		work2[i]=work[i];
    	}
    
    	for(i=0;i<n;i++)
        
    	{
           for(j=i+1;j<n;j++)
    	   {
    		   if(work[j].runtime>work[i].runtime)
    		   {
    			   temp=work1[j]; 
    			   work1[j]=work1[i];
                   work1[i]=temp;   
         
    		   }   
    	   }
    	}
    	maxruntime=work1[0].runtime;
    }
    paidui()
    {
    	int i,j;
    	pcb temp;
        for(i=0;i<n;i++)    
    	{
           for(j=i+1;j<n;j++)
    	   {
    		   if(work[j].arrivetime<work[i].arrivetime)
    		   {
    			   temp=work[j];
                   work[j]=work[i];
                   work[i]=temp;   
         
    		   }   
    	   }
    	}
    	for(i=0;i<n;i++)
    	{
    		work[i].state=1;
    	}
    }
    simple()
    {
    	int a=1,i,j;
    	now=work[0].arrivetime;
    	for(j=0;j<maxruntime;j++)
    	{
    		printf("第%d次轮转:",number);
    	    number++;
    	    for(i=0;i<n;i++)
    		{
    			if(work[i].arrivetime<=now&&work[i].state==1)
    			{
    				work[i].runtime=work[i].runtime-a;
    		        if(work[i].runtime==0)
    		        work[i].state=0;
    		        now=work[i].arrivetime+number;
    		        printf("%s	",work[i].name);
    			}	
    		}
    	    printf("
    ");
    	}
    	menu();
    }
    much()
    {
        int a=1,i;
    	now=work[0].arrivetime;
    	for(j=0;j<maxruntime;j=j+a-2)
    	{
    		printf("第%d次轮转:",number);
        	number++;
        	for(i=0;i<n;i++)
    		{
    			if(work[i].state==1)
    			{ 
    				work[i].runtime=work[i].runtime-a;
    		        if(work[i].runtime<=0)
    		        work[i].state=0;
    		        now=work[i].arrivetime+a;
    	   	        printf("%s	",work[i].name);
    			}	
    		}
    	    a=a+1;
    	    printf("
    ");
    	}
    }
    menu()
    {
    	 int i;
    	 printf("
    ------------------------------------欢迎使用!----------------------------------
    ");
         printf("进程调度程序:
    
    	1,简单时间片轮转法 
    
    	2,多级反馈队列调度算法
    
    	3退出程序
    ");
         printf("请选择:
    ");
         scanf("%d",&i);
    	 system("cls");//清屏 
         if(i==1)
    	 {
             printf("
    您选择的是简单时间片轮转法
    ");
    		 input();
    		 paidui();
    	  	 max();
    		 simple();
    	 }
    	 else if(i==2)
    	 {
             printf("
    您选择的是多级反馈队列调度算法
    ");
    		 input();
    		 paidui();
    		 max();
    		 much();
    	 }
    	 else if(i==3)
    	 {
    		 printf("退出程序,谢谢使用!");
    		 exit(0);
    	 }
    	 else if(i>3)
    	 {
            printf("
    输入错误,请重新输入:(1 or 2)
    ");
    	 }
    }
    void main()
    {
    	while(1)
    	{
    		 menu(); 	 
    	}
       
    }
    

      

    4、运行结果及分析

    运行程序,有如下效果:此时可选择选项1~3,选择1--进入简单时间片转轮法,选择2--进入多级反馈队列调度算法,选择3--退出程序。

    选择1,进入下图界面:

    此时可输入作业数,然后提示“请输入各进程名字 到达时间 所需时间:”,输入完后显示已输入信息以及转轮情况,然后再次提示选择选项1~3。

    选择2则进入下图界面。

    具体操作及效果可参考选择1的情况。

    选择3则提示“退出程序,谢谢使用!”

    四、实验总结

           因为不熟悉时间片轮转法和多级反馈队列调度算法,在写程序的时候先写了大致的框架,后来经过上网查资料和问同学才知道算法公式,算法部分是后面才加上去的。程序部分还是有些问题,希望复习过后能改进这个程序,使程序更为理想化。

     

  • 相关阅读:
    Java Native Method
    SQL语句优化
    Ibatis的环境搭建以及遇到的问题解决
    Java 构建器
    SpringMVC自定义视图 Excel视图和PDF视图
    java 枚举的常见使用方法
    mysql 根据某些字段之和排序
    MFC The Screen Flickers When The Image Zoomed
    How To Debug Qmake Pro File
    Gcc And MakeFile Level1
  • 原文地址:https://www.cnblogs.com/zy1717/p/5014645.html
Copyright © 2020-2023  润新知