zoukankan      html  css  js  c++  java
  • 实验三 进程调度模拟程序

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

    专业:商软2班   姓名:柯晓君  学号:201406114210

    一、        实验目的

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

    二、        实验内容和要求

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

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

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

    将就绪队列分为N级(N=3~5),每个就绪队列优先数不同并且分配给不同的时间片:队列级别越高,优先数越低,时间片越长;级别越小,优先数越高,时间片越短。

    系统从第一级调度,当第一级为空时,系统转向第二级队列,.....当处于运行态的进程用完一个时间片,若未完成则放弃CPU,进入下一级队列。

    当进程第一次就绪时,进入第一级队列。

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

    1.      原理分析及流程图

     2.  主要程序段及其解释:

      1 #include <stdio.h> 
      2 #include <stdlib.h> 
      3 #include <conio.h> 
      4 #define getpch(type) (type*)malloc(sizeof(type)) 
      5 #define N 3
      6 struct pcb { /* 定义进程控制块PCB */ 
      7        char name[10]; 
      8        char status; 
      9        int prio; 
     10        int ntime; 
     11        int rtime; 
     12        struct pcb* link; 
     13 }*ready=NULL,*p; 
     14 
     15 typedef struct pcb PCB; 
     16   
     17   
     18 sort() /* 进程进行优先级排列函数*/ 
     19 { 
     20   PCB *first, *second; 
     21   int insert=0; 
     22   if((ready==NULL)||((p->prio)>(ready->prio))) /*优先级最大者,插入队首*/ 
     23   { 
     24     p->link=ready; 
     25     ready=p; 
     26   } 
     27   else /* 进程比较优先级,插入适当的位置中*/ 
     28   { 
     29     first=ready; 
     30     second=first->link; 
     31     while(second!=NULL) 
     32     { 
     33       if((p->prio)>(second->prio)) /*若插入进程比当前进程优先数大,*/ 
     34       { /*插入到当前进程前面*/ 
     35         p->link=second; 
     36         first->link=p; 
     37         second=NULL; 
     38         insert=1; 
     39       } 
     40       else /* 插入进程优先数最低,则插入到队尾*/ 
     41       { 
     42         first=first->link; 
     43         second=second->link; 
     44       } 
     45     } 
     46     if(insert==0) first->link=p; 
     47   } 
     48 } 
     49  
     50 input() /* 建立进程控制块函数*/ 
     51 { 
     52   int i,num; 
     53   printf("
     请输入进程数:"); 
     54   scanf("%d",&num); 
     55   for(i=0;i<num;i++) 
     56   { 
     57     printf("
     进程号No.%d:
    ",i); 
     58     p=getpch(PCB);  /*宏(type*)malloc(sizeof(type)) */
     59     printf("
     输入进程名:"); 
     60     scanf("%s",p->name); 
     61     p->prio=N;
     62     printf("
     输入进程运行时间:"); 
     63     scanf("%d",&p->ntime); 
     64     printf("
    "); 
     65     p->rtime=0;p->status='r'; 
     66     p->link=NULL; 
     67     sort(); /* 调用sort函数*/ 
     68   } 
     69 } 
     70 
     71 int space() //计算进程个数
     72 { 
     73   int l=0; PCB* pr=ready; 
     74   while(pr!=NULL) 
     75   { 
     76   l++; 
     77   pr=pr->link; 
     78   } 
     79   return(l); 
     80 } 
     81 
     82 
     83 disp(PCB * pr) /*单个进程显示函数*/ 
     84 { 
     85   printf("   %s	",pr->name); 
     86   printf("  %c	",pr->status); 
     87   printf("  %d	",pr->prio); 
     88   printf("  %d	",pr->ntime); 
     89   printf("   %d	",pr->rtime); 
     90   printf("
    "); 
     91 } 
     92 
     93 void printbyprio(int prio)
     94 {
     95   PCB* pr; 
     96   pr=ready; 
     97   printf("
     ****当前第%d级队列(优先数为%d)的就绪进程有:
    ",(N+1)-prio,prio); /*显示就绪队列状态*/ 
     98   printf("
     qname 	status	 prio 	ndtime	 runtime 
    "); 
     99   while(pr!=NULL) 
    100   { 
    101     if (pr->prio==prio) disp(pr); 
    102     pr=pr->link; 
    103   } 
    104 }
    105 
    106 check() /* 显示所有进程状态函数 */ 
    107 { 
    108   PCB* pr; 
    109   int i;
    110   printf("
    ------------当前正在运行的进程是:%s------------",p->name); /*显示当前运行进程*/ 
    111    printf("
     qname 	status	 prio 	ndtime	 runtime 
    "); 
    112   disp(p); 
    113   
    114   printf("
     当前就绪队列状态为:
    "); /*显示就绪队列状态*/ 
    115   for(i=N;i>=1;i--)
    116     printbyprio(i);
    117 } 
    118 destroy() /*进程撤消函数(进程运行结束,撤消进程)*/ 
    119 { 
    120   printf("
     进程 [%s] 已完成.
    ",p->name); 
    121   free(p); 
    122 } 
    123 
    124 
    125 running() /* 运行函数。判断是否完成,完成则撤销,否则置就绪状态并插入就绪队列*/ 
    126 { 
    127   int slice,i;
    128   slice=1;
    129   for(i=1;i<((N+1)-p->prio);i++)
    130     slice=slice*2;
    131     
    132   for(i=1;i<=slice;i++)
    133   {
    134      (p->rtime)++; 
    135      if (p->rtime==p->ntime)
    136        break;
    137        
    138   }
    139   if(p->rtime==p->ntime) 
    140       destroy(); /* 调用destroy函数*/ 
    141   else 
    142   { 
    143     if(p->prio>1) (p->prio)--; 
    144     p->status='r'; 
    145     sort(); /*调用sort函数*/ 
    146   } 
    147 } 
    148 
    149 void cteatpdisp()
    150 /*显示(运行过程中)增加新进程后,所有就绪队列中的进程*/
    151 { 
    152  
    153   int i;
    154   printf("
     当增加新进程后,所有就绪队列中的进程(此时无运行进程):
    "); /*显示就绪队列状态*/ 
    155   for(i=N;i>=1;i--)
    156     printbyprio(i);
    157 }
    158 
    159 void creatp()
    160 {
    161      char temp;
    162      printf("
    Creat one  more process?type Y (yes)");
    163      scanf("%c",&temp);
    164      if (temp=='y'||temp=='Y')
    165      {
    166         input();
    167         cteatpdisp();
    168      }  
    169 }  
    170   
    171 main() /*主函数*/ 
    172 { 
    173       char k;
    174 A:int len,h=0; 
    175   char ch; 
    176   input(); 
    177   len=space(); 
    178   while((len!=0)&&(ready!=NULL)) 
    179   { 
    180     ch=getchar(); 
    181     h++; 
    182     printf("
     The execute number:%d 
    ",h); 
    183     p=ready; 
    184     ready=p->link; 
    185     p->link=NULL; 
    186     p->status='R'; 
    187     check(); 
    188     running(); 
    189     creatp();
    190     printf("
     按任一键继续......"); 
    191     ch=getchar(); 
    192   } 
    193    printf("
    
     进程已经完成.
    "); 
    194    printf("
    ");
    195    printf("是否重新输入进程(Y or N):");
    196    scanf("%c",&k);
    197    if(k=='Y')
    198    {
    199        system("cls");
    200        goto A;
    201    }
    202    else
    203        exit(0);
    204 }

     3.  运行结果及分析

  • 相关阅读:
    .NET XmlNavigator with Namespace
    编程要素
    【FOJ】1962 新击鼓传花游戏
    【POJ】1389 Area of Simple Polygons
    【POJ】2482 Stars in Your Window
    【HDU】3265 Posters
    【HDU】1199 Color the Ball
    【HDU】3642 Get The Treasury
    【HDU】4027 Can you answer these queries?
    【HDU】1542 Atlantis
  • 原文地址:https://www.cnblogs.com/950525kxj/p/5487397.html
Copyright © 2011-2022 走看看