操作系统实验之处理机调度题目及代码实现

实验一 处理机调度(3学时)

一、实验目的

1)加深对处理机调度的作用和工作原理的理解。

2)进一步认识并发执行的实质。

二、实验类型

设计型。

三、预习内容

预习课本处理机调度有关内容,包括进程占用处理机的策略方法。

四、实验要求与提示

本实验有两个题,学生可选择其中的一题做实验。

第一题:设计一个按优先权调度算法实现处理器调度的程序。

【提示】

1假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:

进程名

指针

要求运行时间

优先数

状态


其中,

l        进程名——作为进程的标识,假设五个进程的进程名分别为P1P2P3P4P5

l        指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。

l        要求运行时间——假设进程需要运行的单位时间数。

l        优先数——赋予进程的优先权,调度时总是选取优先数大的进程先执行。

l        状态——可假设有三种状态,“就绪”状态(ready)、“运行”状态(working)和“结束”状态(finish)。五个进程的初始状态都为“就绪”,用“R”表示;当进程运行结束后,它的状态为“结束”,用“E”表示;当进程被选中开始运行但尚未结束时,它的状态为“运行”,用“W”表示。

2在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。

3为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。例:

 队首标志

        K2   

K1

P1

 K2

P2

 K3

P3

 K4

P4

 K5

P5

 

0

 

K4

 

K5

 

K3

 

K1

 

2

 

3

 

1

 

2

 

4

 

1

 

5

 

3

 

4

 

2

 

R

 

R

 

R

 

R

 

R

 

PCB1

 

PCB2

 

PCB3

 

PCB4

 

PCB5

 

4处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1”。由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:

优先数-1

要求运行时间-1

来模拟进程的一次运行。

提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。

5进程运行一次后,若要求运行时间¹0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改成“结束”(E),且退出队列。

6若“就绪”状态的进程队列不为空,则重复上面45的步骤,直到所有进程都成为“结束”状态。

7在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进程队列的变化。

8为五个进程任意确定一组“优先数”和“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。例如,下面的运行结果示意:

INPUT NAME , NEEDTIME AND PRIORITY

P1    2     1

P2    3     5

P3    1     3

P4    2     4

P5    4     2

OUTPUT OF  PRIORITY

CPUTIME:0

NAME CPUTIME  NEEDTIME  PRIORITY     STATE

 P1      0           2          1          ready

 P2      0           3          5          ready

 P3      0           1          3          ready

 P4      0           2          4          ready

 P5      0           4          2          ready

 

CPUTIME:1

 P1      0           2          1          ready

 P2      1          2           4          working

 P3      0           1          3          ready

 P4      0           2          4          ready

 P5      0           4          2          ready

 

CPUTIME:2

 P1      0           2          1          ready

 P2      2           2          4          ready

 P3      0           1          3          ready

 P4      1          1           3         working

 P5      0           4          2          ready

 

CPUTIME:3

 P1      0           2          1          ready

 P2      3          1           3          working

 P3      0           1          3          ready

 P4      2           1          3          ready

 P5      0           4          2          ready

 

CPUTIME:4

 P1      0           2          1          ready

 P2      4           1          3          ready

 P3      1          0           2          finish

 P4      3           1          3          ready

 P5      0           4          2          ready

 

CPUTIME:5

 P1      0           2          1          ready

 P2      5           1          3          ready

 P3      1           0          2          finish

 P4      4          0           2          finish

 P5      0           4          2          ready

 

CPUTIME:6

 P1      0           2          1          ready

 P2      6          0           2          finish

 P3      1           0          2          finish

 P4      4           0          2          finish

 P5      0           4          2          ready

 

CPUTIME:7

 P1      0           2          1          ready

 P2      6           0          2          finish

 P3      1           0          2          finish

 P4      4           0          2          finish

 P5      1          3           1          working

 

CPUTIME:8

 P1      1          1           0          working

 P2      6           0          2          finish

  P3     1           0           2         finish

 P4      4           0          2          finish

 P5      2           3          1          ready

 

CPUTIME:8

 P1      2           1          0          ready

 P2      6           0          2          finish

 P3      1           0          2          finish

 P4      4           0          2          finish

 P5      3          2           0          working

 

CPUTIME:9

 P1      3          0           -1         finish

 P2      6           0           2          finish

 P3      1           0          2          finish

 P4      4           0          2          finish

 P5      4           2          0          ready

 

CPUTIME:10

 P1      3           0          -1         finish

 P2      6          0           2          finish

 P3      1           0          2          finish

 P4      4           0          2          finish

 P5      5          1           -1         working

 

CPUTIME:11

 P1      3           0          -1         finish

 P2      6           0          2          finish

 P3      1           0          2          finish

 P4      4           0          2          finish

 P5      6          0           -2         finish

 

NAME  RoundTime   WaitingTime

P1          9            7

P2          6            3

P3          4            3

P4          5            3

P5         11            7

 

第二题:设计一个按时间片轮转法实现处理器调度的程序。

【提示】

1假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式为:

进程名

指针

要求运行时间

已运行时间

状态

其中,

l        进程名——作为进程的标识,假设五个进程的进程名分别为Q1Q2Q3Q4Q5

l        指针——进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程的指针指出第一个进程的进程控制块首地址。

l        要求运行时间——假设进程需要运行的单位时间数。

l        已运行时间——假设进程已经运行的单位时间数,初始值为“0”。

l        状态——有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“R”表示。当一个进程运行结束后,它的状态为“结束”,用“E”表示。

2每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间”。

3把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。例如,当前轮到P2执行,则有:

标志单元

        K2   

 

K1

Q1

 K2

Q2

 K3

Q3

 K4

Q4

 K5

Q5

 

K2

 

K3

 

K4

 

K5

 

K1

 

2

 

3

 

1

 

2

 

4

 

1

 

0

 

0

 

0

 

0

 

R

 

R

 

R

 

R

 

R

 

PCB1

 

PCB2

 

PCB3

 

PCB4

 

PCB5

 

4处理器调度总是选择标志单元指示的进程运行。由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,而是执行:

已运行时间+1

来模拟进程的一次运行,表示进程已经运行过一个单位的时间。

请同学注意:在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。在这时省去了这些工作,仅用“已运行时间+1来表示进程已经运行满一个时间片。

5进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间¹已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修改成“结束”(E)且退出队列。此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。

6若“就绪”状态的进程队列不为空,则重复上面的45的步骤,直到所有的进程都成为“结束”状态。

7在所设计的程序中应有显示或打印语句,能显示或打印每次选中进程的进程名以及运行一次后进程队列的变化。

8为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中的进程名以及进程控制块的动态变化过程。输出要求与上述优先权优先调度输出形式类似。

五、思考题

1)处理机调度的目的?

2)你实现优先权调度算法的思想?

3)你采用时间片轮转法实现处理机调度的思想?

4)比较效率如何?

六、实验报告

1)实验题目。

2)程序中使用的数据结构及符号说明。

3)流程图。

4)实现的核心代码。

5)按题目要求格式得到的程序运行时的初值和运行结果。

   实验报告

 

姓名:邓涛                                 实验内容:处理器调度实验

一、    实验目的

1)加深对处理机调度的作用和工作原理的理解。

2)进一步认识并发执行的实质。

二、实验题目

    设计一个按优先权调度算法实现处理器调度的程序。

 

三、核心代码

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

typedef struct pb

{

      char pname[5];

   char status[8];

   int time;

      int pri;

      int cputime;

   struct pb *p;

 

}pbc,*pbcp;

 

 

pbcp creatListHead();

void sort(pbcp pbca);

void attemper(pbcp pbca);

void mallocPbc(pbcp pbca,int num);

void printPbc(pbcp pbca);

int main()

{

      int i,j;

      pbcp pbcph;

   pbcph=creatListHead();

      printf("----------初始化进程数据块-------\n\n\n");

      printf("   请输入进程块的数目: ");

      scanf("%d",&i);

      printf("\n");

   mallocPbc(pbcph,i);

   printf("----sort----:\n\n\n");

      sort(pbcph);

    printPbc( pbcph);

       for(j=0;j<11;j++)

       {

        printf("------------------------------------------------------\n");

        attemper(pbcph);

        _sleep(1000);

       }

  return 1;

}

pbcp creatListHead()

{  

      pbcp pbcph;

    if(NULL==(pbcph=(struct pb *)malloc(sizeof(pbc) )))

      {

             printf("pbc head malloc error\n");

   }

   else

      {

             strcpy(pbcph->pname,"head");

             pbcph->p=NULL;

        pbcph->time=0;

       pbcph->pri=0;

             pbcph->cputime=0;

       strcpy(pbcph->status,"head");

   }

      return pbcph;

}

 

 

 

 

void mallocPbc(pbcp pbca,int num)

{

      pbcp pbcptem;

      

   int i;

  for(i=0;i<num;i++)

  {

       if(NULL==(pbcptem=( pbcp )malloc(sizeof(pbc))))

         {

                   printf("pbc malloc error\n");

          }

       printf("--请输入进程名优先级运行时间 \n ");

       scanf("         %s%d%d",pbcptem->pname,&pbcptem->pri,&pbcptem->time);

    pbcptem->p=NULL;

       strcpy(pbcptem->status,"ready");

       

       pbcptem->cputime=0;

       pbca->p=pbcptem;

       pbca=pbca->p;

  }

  

 

}

void printPbc(pbcp pbca)

{ 

   pbcp pbcptem;

      pbcptem=pbca->p;

      while(pbcptem!=NULL)

      {

             printf("\n---进程名优先级运行时间 cpu时间状态 \n");

      

       printf("---%s       %d      %d       %d       %s\n",pbcptem->pname,pbcptem->pri,pbcptem->time, pbcptem->cputime,pbcptem->status);

        pbcptem=pbcptem->p;

      }

}

 

 

void sort(pbcp pbca)

{

 

pbcp p1,p2,p3,p4 ;

 p4=NULL;

 while(p4!=pbca->p->p)

 {

        for(p1=pbca;p1->p->p!=p4;p1=p1->p)

        {

               if((p1->p->pri)<(p1->p->p->pri))

               {

                      p2=p1->p;

                      p3=p1->p->p;

                      p1->p=p3;

                      p2->p=p3->p;

                      p3->p=p2;

               }

        }

        p4=p1->p;

 }

}

 

  

void attemper(pbcp pbca)

{

      pbcp p1,p2;

 

      p1=pbca->p;

      while(p1->time==0)

             p1=p1->p;

      if((p1->time-=1)==0)

       {

           p1->cputime+=1;

              p1->pri-=1;

           strcpy(p1->status,"finish");

           sort( pbca);

      }

 else

 {

      strcpy(p1->status,"run");

   p1->cputime+=1;

      p1->pri-=1;

 

      strcpy(p1->status,"run");

 }

   p2=p1->p;

      

      while(p2!=NULL)

      { 

             if(p2->cputime!=0)

             {

                    (p2->cputime)+=1;

             }

       p2=p2->p;

   }

   printPbc( pbca) ;

 

 

}

四、实验运行与调试

   

 

 

 

 

 

                       

 

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


  • 15
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值