zoukankan      html  css  js  c++  java
  • 操作系统-实验二、模拟进程调度

    实验二、进程调度模拟程序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  }

     

    五、实验总结

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

  • 相关阅读:
    LeetCode Path Sum II
    LeetCode Longest Palindromic Substring
    LeetCode Populating Next Right Pointers in Each Node II
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Binary Tree Maximum Path Sum
    LeetCode Find Peak Element
    LeetCode Maximum Product Subarray
    LeetCode Intersection of Two Linked Lists
    一天一个设计模式(1)——工厂模式
    PHP迭代器 Iterator
  • 原文地址:https://www.cnblogs.com/huanglinxin/p/5505547.html
Copyright © 2011-2022 走看看