• 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则提示“退出程序,谢谢使用!”

    四、实验总结

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

     

  • 相关阅读:
    cocos2d-x CSV文件读取 (Excel生成csv文件)
    cocos2d-x 中 xml 文件读取
    String 类的实现
    json 文件解析与应用
    设计模式 之 《简单工厂模式》
    C++ 0X 新特性实例(比较常用的) (转)
    CCSpriteBatchNode CCSpriteFrameCache
    LongAdder
    ConcurrentHashMap源码
    HashMap源码
  • 原文地址:https://www.cnblogs.com/zy1717/p/5014645.html
Copyright © 2020-2023  润新知