模拟实现进程调度——采用高优先数优先和先来服务算法

2018-03-14 14:35:55 csdn  点击量: 评论 (0)
进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。  每个进程有一个进程控制块

      进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。

  每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。

  进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。

  进程的运行时间以时间片为单位进行计算。每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。

  就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。

  如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。

 

[cpp] view plain copy
 
  1. #include <stdio.h>  
  2. #include <stdlib.h>   
  3. #include <conio.h>   
  4. #define getpch(type) (type*)malloc(sizeof(type))   
  5.    
  6. struct pcb   /* 定义进程控制块PCB */  
  7. {  
  8.     char name[10];  
  9.     char state;  
  10.     int super;  
  11.     int ntime;  
  12.     int rtime;  
  13.     struct pcb* link;  
  14. }*ready = NULL, *p;  
  15. typedef struct pcb PCB;  
  16. sort() /* 建立对进程进行优先级排列函数*/  
  17. {  
  18.     PCB *first, *second;  
  19.     int insert = 0;  
  20.     if ((ready == NULL) || ((p->super) > (ready->super))) /*优先级最大者,插入队首*/  
  21.     {  
  22.         p->link = ready;  
  23.         ready = p;  
  24.     }  
  25.     else /* 进程比较优先级,插入适当的位置中*/  
  26.     {  
  27.         first = ready;  
  28.         second = first->link;  
  29.         while (second != NULL)  
  30.         {  
  31.             if ((p->super) > (second->super)) /*若插入进程比当前进程优先数大,*/  
  32.             { /*插入到当前进程前面*/  
  33.                 p->link = second;  
  34.                 first->link = p;  
  35.                 second = NULL;  
  36.                 insert = 1;  
  37.             }  
  38.             else /* 插入进程优先数最低,则插入到队尾*/  
  39.             {  
  40.                 first = first->link;  
  41.                 second = second->link;  
  42.             }  
  43.         }  
  44.         if (insert == 0) first->link = p;  
  45.     }  
  46. }  
  47. input() /* 建立进程控制块函数*/  
  48. {  
  49.     int i, num;  
  50.       
  51.     printf("\n 请输入进程数?");  
  52.     scanf("%d", &num);  
  53.     for (i = 0; i < num; i++)  
  54.     {  
  55.         printf("\n 进程号No.%d:\n", i);  
  56.         p = getpch(PCB);  
  57.         printf("\n 输入进程名:");  
  58.         scanf("%s", p->name);  
  59.         printf("\n 输入进程优先数:");  
  60.         scanf("%d", &p->super);  
  61.         printf("\n 输入进程运行时间:");  
  62.         scanf("%d", &p->ntime);  
  63.         printf("\n");  
  64.         p->rtime = 0; p->state = 'w';  
  65.         p->link = NULL;  
  66.         sort(); /* 调用sort函数*/  
  67.     }  
  68. }  
  69. int space()  
  70. {  
  71.     int l = 0; PCB* pr = ready;  
  72.     while (pr != NULL)  
  73.     {  
  74.         l++;  
  75.         pr = pr->link;  
  76.     }  
  77.     return(l);  
  78. }  
  79. disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/  
  80. {  
  81.     printf("\n qname \t state \t super \t ndtime \t runtime \n");  
  82.     printf("|%s\t", pr->name);  
  83.     printf("|%c\t", pr->state);  
  84.     printf("|%d\t", pr->super);  
  85.     printf("|%d\t", pr->ntime);  
  86.     printf("|%d\t", pr->rtime);  
  87.     printf("\n");  
  88. }  
  89. check() /* 建立进程查看函数 */  
  90. {  
  91.     PCB* pr;  
  92.     printf("\n **** 当前正在运行的进程是:%s", p->name); /*显示当前运行进程*/  
  93.     disp(p);  
  94.     pr = ready;  
  95.     printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/  
  96.     while (pr != NULL)  
  97.     {  
  98.         disp(pr);  
  99.         pr = pr->link;  
  100.     }  
  101. }  
  102. destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/  
  103. {  
  104.     printf("\n 进程 [%s] 已完成.\n", p->name);  
  105.     free(p);  
  106. }  
  107. running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/  
  108. {  
  109.     (p->rtime)++;  
  110.     if (p->rtime == p->ntime)  
  111.         destroy(); /* 调用destroy函数*/  
  112.     else  
  113.     {  
  114.         (p->super)--;  
  115.         p->state = 'w';  
  116.         sort(); /*调用sort函数*/  
  117.     }  
  118. }  
  119. main() /*主函数*/  
  120. {  
  121.     int len, h = 0;  
  122.     char ch;  
  123.     input();  
  124.     len = space();  
  125.     while ((len != 0) && (ready != NULL))  
  126.     {  
  127.         ch = getchar();  
  128.         h++;  
  129.         printf("\n The execute number:%d \n", h);  
  130.         p = ready;  
  131.         ready = p->link;  
  132.         p->link = NULL;  
  133.         p->state = 'R';  
  134.         check();  
  135.         running();  
  136.         printf("\n 按任一键继续......");  
  137.         ch = getchar();  
  138.     }  
  139.     printf("\n\n 进程已经完成.\n");  
  140.     ch = getchar();  
  141. }  

 

大云网官方微信售电那点事儿

责任编辑:售电衡衡

免责声明:本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
我要收藏
个赞