操作系统第三次作业

实验三、进程调度模拟程序实验

商软1班   黄敏鹏  201406114116

一、        实验目的

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

二、        实验内容和要求

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

进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法。

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

(2).  进程的优先级及需要的运行时间可以事先人为地指定,进程的运行时间以时间片为单位进行计算。

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

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

(5).  如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待调度。

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

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

1.2.2实验题A:编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对N(N不小于5)个进程进行调度。

“最高优先级优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。

(1). 静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。

(2). 动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定规则修改优先数。例如:在进程获得一次CPU后就将其优先数减少1,并且进程等待的时间超过某一时限(2个时间片时间)时增加其优先数等。

(3). (**)进程的优先数及需要的运行时间可以事先人为地指定,(也可以由随机数产生)。

(4). (**)在进行模拟调度过程可以创建(增加)进程,其到达时间为进程输入的时间。

1.2.3实验题B:编写并调试一个模拟的进程调度程序,采用“基于时间片轮转法”调度算法对N(N不小于5)个进程进行调度。 “轮转法”有简单轮转法、多级反馈队列调度算法。

(1). 简单轮转法的基本思想是:所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片长度相同。如果运行进程用完它的时间片后还未完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕。(此调度算法是否有优先级?)

 (2). 多级反馈队列调度算法的基本思想是:

将就绪队列分为N级(N=3~5),每个就绪队列优先数不同并且分配给不同的时间片:队列级别越高,优先数越低,时间片越长;级别越小,优先数越高,时间片越短。系统从第一级调度,当第一级为空时,系统转向第二级队列,.....当处于运行态的进程用完一个时间片,若未完成则放弃CPU,进入下一级队列。当进程第一次就绪时,进入第一级队列。

(3). (**)考虑进程的阻塞状态B(Blocked)增加阻塞队列。进程的是否阻塞和阻塞的时间由产生的“随机数”确定(阻塞的频率和时间长度要较为合理)。注意进程只有处于运行状态才可能转换成阻塞状态,进程只有处于就绪状态才可以转换成运行状态。

2.    实验内容

根据指定的实验课题:A(1),A(2),B(1)和B(2)完成设计、编码和调试工作,完成实验报告。

注:带**号的条目表示选做内容。

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

1.      原理分析及流程图

  

源码:

  1 #include<stdio.h>
  2 #include<windows.h>
  3 
  4 struct pcb{
  5     char name[10];  //进程名称
  6     char status;    //状态
  7 
  8     int arrtime;    //到达时间
  9     int reqtime;    //要求服务时间
 10     int startime;   //调度时间
 11     int finitime;   //完成时间
 12 
 13     float TAtime;   //周转时间
 14     float TTAWtime;   //带权周转时间
 15     float prio;     //优先级
 16 }proarr[24],profin[24],pro[24];
 17 
 18 int systime=0;    //系统时间
 19 int intarr=0;     //记录proarr[]的元素个数
 20 int intfin;       //记录profin[]的元素个数
 21 int intpro;       //记录pro[]的元素个数
 22 
 23 void intputJobarr();
 24 void putoutJobarr(int n);
 25 void putoutAllJobarr();
 26 void sort();
 27 void simulateCohort();
 28 
 29 /*
 30     向proarr输入一个进程
 31 */
 32 void intputJobarr(){
 33     printf("
第 %d 个进程:
",intarr+1);
 34     printf("	输入进程名:");
 35     scanf("%s",&proarr[intarr].name);
 36     printf("	到达时间:");
 37     scanf("%d",&proarr[intarr].arrtime);
 38     printf("	要求服务时间:");
 39     scanf("%d",&proarr[intarr].reqtime);
 40     intarr++;
 41 }
 42 
 43 /*
 44     输出第n个进程信息    
 45 */
 46 void putoutJobarr(int n){
 47     n=n-1;
 48     if(n<0){
 49         printf("n<0
");
 50     }else{
 51         printf("            	name	artime	reqtime
");
 52         printf("第 %d 个进程:	%s	%d	%d
",n+1,proarr[n].name,proarr[n].arrtime,proarr[n].reqtime);
 53     }
 54 }
 55 
 56 /*
 57     输出所有进程信息    
 58 */
 59 void putoutAllJobarr(){
 60     printf("    进程名    到达时间    要求服务时间    调度时间    完成时间    周转时间    带权周转时间    
");
 61     for(int i=0;i<intarr;i++){
 62         printf("    %6s    %8d    %12d    %8d    %8d    %8f    %12f    
",proarr[i].name,proarr[i].arrtime,proarr[i].reqtime,proarr[i].startime,proarr[i].finitime,proarr[i].TAtime,proarr[i].TTAWtime);
 63     }    
 64 }
 65 
 66 /*
 67     对Jobarr进行排序,按照arrtime升序排序
 68 */
 69 void sort(){
 70     pcb k;
 71     for(int i=0;i<intarr;i++){
 72         for(int j=0;j<intarr-1;j++){
 73             if(proarr[j].arrtime>proarr[j+1].arrtime){
 74                 k=proarr[j];
 75                 proarr[j]=proarr[j+1];
 76                 proarr[j+1]=k;
 77             }
 78         }
 79     }
 80 }
 81 
 82 /*
 83     模拟队列
 84 */
 85 void simulateCohort(){
 86         proarr[0].startime=0;
 87         proarr[0].finitime=proarr[0].startime+proarr[0].reqtime;
 88         proarr[0].TAtime=proarr[0].finitime-proarr[0].arrtime;
 89         proarr[0].TTAWtime=float(proarr[0].TAtime)/proarr[0].reqtime;
 90     for(int i=1;i<intarr;i++){
 91         proarr[i].startime=proarr[i-1].finitime;
 92         proarr[i].finitime=proarr[i].startime+proarr[i].reqtime;
 93         proarr[i].TAtime=proarr[i].finitime-proarr[i].arrtime;
 94     }
 95     
 96 }
 97 
 98 /*
 99 *    主函数
100 */
101 void main()
102 {
103     system("mode con cols=100 lines=30");//窗口宽度高度
104     int flag=1;
105     int n;
106     printf("
	进程的个数 : ");
107     scanf("%d",&n);
108     while(intarr<n){
109         intputJobarr();
110     }
111     system("cls");
112     printf("
	这是您输入的数据:

");
113     putoutAllJobarr();
114 
115     sort();
116     simulateCohort();
117 
118     printf("
    ____________________________________________________________________________________________
");
119 
120     printf("

	这是模拟队列后的结果:

");
121     putoutAllJobarr();
122 
123     printf("
");
124 }
原文地址:https://www.cnblogs.com/huangmp1024/p/5487891.html