• 操作系统-实验二、模拟进程调度


    实验二、进程调度模拟程序2.0实验

    一、实验目的

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

    二、 实验内容和要求

    三、实验要求

    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 #include<stdio.h>
      2 
      3 #define N 10
      4 
      5 void main()
      6 {
      7  int a,o=1;
      8  
      9 loop: while(o==1)
     10  {
     11   printf("
    ");
     12   printf("		/****************************************/
    ");
     13   printf("		/****  **** ** 进程调度模拟 **  **** ****/
    ");
     14         printf("		/***************************************/");
     15         printf("
    		/*    1、优先级优先  调  度            */");
     16         printf("
    		/*    2、短作业优先  调  度            */");
     17         printf("
    		/*    3、时间片轮转  调  度            */");
     18         printf("
    		/*    4、先到先服务  调  度            */");
     19         printf("
    		/*    0、  退      出                  */
    ");
     20         printf("		/****************************************/");
     21         printf("
    		请选择菜单项?	");
     22         scanf("%d",&a);
     23         printf("
    ");
     24 
     25         switch(a)
     26   {
     27           case 4: printf("此功能未完成
    ") ;break;//fcfs()
     28           case 2: printf("此功能未完成
    ") ;break;//sjf()
     29           case 3: printf("此功能未完成
    ") ;break;//sjf()
     30           case 1: yxj();break;//printf("4
    ") 
     31           default: break;
     32   }
     33       if(a<0 || a>4){
     34    printf("		输入有误,请重新输入!!") ;
     35    goto loop;
     36    }  
     37 }
     38 
     39 }
     40 
     41 typedef struct process   //进程结构
     42 
     43 {
     44 
     45    char name;
     46 
     47    int arrive;
     48 
     49    int prio;
     50 
     51    int needTime;
     52 
     53    char state;
     54 
     55   
     56 
     57 }Process;
     58 
     59 Process a[N];
     60 
     61  
     62 
     63 
     64 void input(Process a[],int n){                //输入函数
     65 
     66     int i;
     67 
     68    for(i=0;i<n;i++)
     69 
     70    {
     71 
     72         printf("请输入第%d个进程的进程名:",i+1);
     73 
     74         scanf("%c",&a[i].name);
     75 
     76         printf("请输入第%d个进程的优先级:",i+1);
     77 
     78         scanf("%d",&a[i].prio);
     79 
     80         printf("请输入第%d个进程的到达时间:",i+1);
     81 
     82         scanf("%d",&a[i].arrive);
     83 
     84         printf("请输入第%d个进程的需要时间:",i+1);
     85 
     86         scanf("%d",&a[i].needTime);
     87 
     88         a[i].state='r';
     89 
     90         getchar();
     91 
     92         printf("
    ");
     93 
     94    }
     95 
     96 }
     97 
     98 void sort(Process a[],int n)               //排序算法
     99 
    100 { 
    101 
    102    int i,j;
    103 
    104    Process temp;
    105 
    106    for(i=0;i<n;i++)
    107 
    108       for(j=i;j<n;j++)
    109 
    110       {
    111 
    112              if(a[j].prio>a[i].prio) //按进程优先级排序
    113 
    114              {
    115 
    116                     temp=a[j];
    117 
    118                     a[j]=a[i];
    119 
    120                     a[i]=temp;
    121 
    122              }
    123 
    124              if(a[j].prio==a[i].prio)  //如果优先级相同,按先来先服务原则排序
    125 
    126              {
    127 
    128                     if(a[j].arrive<a[i].arrive)
    129 
    130                     {
    131 
    132                    temp=a[j];
    133 
    134                     a[j]=a[i];
    135 
    136                     a[i]=temp;
    137 
    138                     }
    139 
    140              }
    141 
    142       }
    143 
    144 }
    145 
    146 void output(Process a[],int n)            
    147 
    148 {
    149 
    150    int i;
    151 
    152    printf("	进程排序结果:
    ");
    153 
    154     printf("	********************************
    ");
    155 
    156    printf("	进程名	优先级	到达	需要
    ");
    157 
    158    for(i=0;i<n;i++)
    159 
    160         printf("	%c	%d	%d	%d	%c
    ",a[i].name,a[i].prio,a[i].arrive,a[i].needTime,a[i].state);
    161 
    162     printf("	********************************
    ");
    163 
    164 }
    165 
    166 void running(Process a[],int n)
    167 
    168 {
    169 
    170    int i;
    171 
    172     for(i=0;i<n;i++)
    173 
    174    {
    175 
    176       while(a[i].needTime!=0)
    177 
    178       {
    179 
    180             printf("	按任意键继续。。。。。
    ");
    181 
    182             fflush(stdin);
    183 
    184             getchar();
    185 
    186            a[i].needTime=a[i].needTime-1;
    187 
    188            a[i].prio=a[i].prio-1;
    189 
    190             if(a[i].needTime==0)
    191 
    192             {
    193 
    194                    a[i].state='f';
    195 
    196             }
    197 
    198           printf("	现在执行的进程信息:
    ");
    199 
    200          printf("	进程名	优先级	需要
    ");
    201 
    202          printf("	%c	%d	%d	%c
    ",a[i].name,a[i].prio,a[i].needTime,a[i].state);
    203 
    204          printf("	********************************
    ");
    205 
    206             sort(a,n);
    207 
    208             output(a,n);
    209 
    210       }
    211 
    212    }
    213 
    214 }
    215 
    216 void yxj()
    217 
    218 {
    219 
    220    int n;
    221 
    222    printf("你想输入多少个进程:");
    223 
    224    scanf("%d",&n);
    225 
    226    getchar();
    227 
    228    input(a,n);
    229 
    230    sort(a,n);
    231 
    232    running(a,n);
    233 
    234 }
    235 
    236  }

     

    五、实验总结

    这次模拟进程调度的实验主要是计算方式的代码有点乱,导致花了很多时间和精力,结果只做了一个根据进程优先级优先调度的方法,其他三个暂时还未实现,先把第一个完成,在此发个微博记录一下,下次再继续完善。

  • 相关阅读:
    【算法】数据结构
    【POJ】1222 EXTENDED LIGHTS OUT
    【BZOJ】1013 [JSOI2008]球形空间产生器sphere
    【有上下界网络流】【ZOJ】2314 Reactor Cooling
    【CODEVS】1281 Xn数列
    【POJ】3070 Fibonacci
    【CODEVS】3546 矩阵链乘法
    【BZOJ】1070: [SCOI2007]修车
    Quoit Design(hdu 1007)
    tree(poj 1741)
  • 原文地址:https://www.cnblogs.com/huanglinxin/p/5505547.html
Copyright © 2020-2023  润新知