进程调度算法模拟

操作系统实验报告

    名:

    级:

    号:

指导教师:

实验一  进程调度算法模拟,用动态优先数及时间片轮转法

实现进程调度

一.实验内容:设计一个简单的进程调度算法,模拟OS中的进程调度过程

二.实验要求:

    ① 进程数不少于5个;

② 进程调度算法任选;

   最好选用动态优先数法,每运行一个时间片优先数减3

③ 用C++(或C)语言编程;

④ 程序运行时显示进程调度过程。

三.实验步骤:

① 设计PCB及其数据结构:

  struct pcb

{ /* 定义进程控制块PCB */

       char name[10];

       char state;

int super;

int ntime;

int rtime;

struct pcb* link;

} *ready=NULL,*p;

typedef struct pcb PCB;

② 设计进程就绪队列及数据结构;

三个应用队列: PCB *ready=NULL,*run=NULL,*finish=NULL;

③ 设计进程调度算法,并画出程序流程图;

④ 设计输入数据和输出格式;

   结构格式:当前正运行的进程:0

             当前就绪队列:2,1,3,4

⑤ 编程上机,验证结果。

源程序代码如下:

#include

void main(){

       int a[4][5]={{0,1,2,3,4},{9,38,30,29,0},{0,0,0,0,0},{3,3,6,3,4}};

       int a1[5],a0[5],a2[5],num;

       printf("当前系统中有5个进程,其初始状态如下:\n\n");

       for(int i=0;i<4;i++){    

              if(i==0)

                     printf("ID        ");

              if(i==1)

                     printf("PRIORITY  ");

              if(i==2)

                     printf("CPUTIME   ");

              if(i==3)

                     printf("ALLTIME   ");

              for(int j=0;j<5;j++){

                            printf("%5d  ",a[i][j]);

                     }

                     printf("\n");

              }

       printf("STATE       ready  ready  ready  ready  ready");

       for(;;){

              for(i=0;i<5;i++){  

                     a0[i]=a[1][i];

              }

              for(i=0;i<5;i++){  

                     for(int j=0;j<5-1;j++){

                            if(a0[j]<=a0[j+1]){

                                   num=a0[j];

                                   a0[j]=a0[j+1];

                                   a0[j+1]=num;

                            }

                     }

              }

//a0数组为排列好的优先极

              for(int j=0;j<5;j++){

                     a2[j]=a[1][j];

              }

             

        for(i=0;i<5;i++){  

                     for(int j=0;j<5;j++){

                            if(a0[i]==a2[j]){

                                   a1[i]=j;

                                   a2[j]=-10;

                                   break;

                            }

                     }

              }

              a[1][a1[0]]-=3;

              a[2][a1[0]]+=1;

              a[3][a1[0]]-=1;

              printf("\n");

              if(a[3][a1[0]]<=0){

                     a[1][a1[0]]=-3;

              }

              int ji=0;

              for(i=0;i<5;i++){

                     ji+=a[3][i];

              }

              printf("\n当前运行程序为:%d\n当前就绪队列:  ",a1[0]);

              for(i=1;i<5;i++){

                     if(a[1][a1[i]]>=0)

                     printf("%d  ",a1[i]);

              }    

              if(ji<=0)break;

              printf("\n\n程序正在运行中...");

       }

       printf("\n\n当前程序已全部运行完毕\n");

}

实验结果:

四.实验总结:
(1)本次试验后对优先数调度算法和时间片轮转调度算法实现 的过程,有了很清楚的认识、理解。设计计数器来对进程执行状 态的时间分析,使得进程调度这一抽象模型得到具体化。之后, 便是对进程的插入(执行完,插入到完成队列,否则插入到就绪) 和再次调度(当改进程再次满足条件时,从就绪队列调度到执行 队列)重复过程。
(2)通过设计 PCB 结构,模拟进程调度,加深了对进程的理解。 (3)提高了 C 语言编程动手能力,在设计就绪队列时,通过优 先数将新进程插入就绪队列中的适当位置。要做多重判断,但实际又是“链表插入”模型的运用,这感觉很爽,无论多复杂的问 题,都可以分化成简单的问题在已有的模型上处理。

相关推荐