实验二-模拟在CPU中的优先级调度

一、        实验目的

通过本实验可以加深对有关进程控制块、进程队列的概念的进一步理解。

二、        实验内容和要求

     1.进程PCB的结构体定义

     2.定义结构体

     3.输入进程序列

     4.排序(按到位时间)

     5.输出进程运行的结果

三、        实验代码及结果测试

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #define MAX 100
  4 /*定义进程结构体*/
  5 typedef struct pcb {
  6     char name[30];
  7     int priority ;
  8     int serveTime;
  9     int cpuTime;
 10     char state;
 11 } PCB;
 12 
 13 Input(PCB p[MAX],int n) {
 14     int i;
 15     for(i=0; i<n; i++) {
 16         printf("第%d个进程的名称:",i+1);
 17         scanf("%s",&p[i].name);
 18         printf("第%d个进程的优先数:",i+1);
 19         scanf("%d",&p[i].priority);
 20         printf("第%d个进程的服务时间:",i+1);
 21         scanf("%d",&p[i].serveTime);
 22         p[i].state='W';
 23         p[i].cpuTime=0;
 24         printf("\n");
 25     }
 26 }
 27 
 28 Output(PCB p[MAX],int n) {
 29     int i;
 30     printf("进程名称\t优先级数\t服务时间\t当前时间\t进程状态\n");
 31     for(i=0; i<n; i++) {
 32         printf(" %s\t",p[i].name);
 33         printf("\t%d\t",p[i].priority);
 34         printf("\t%d\t",p[i].serveTime);
 35         printf("\t%d\t",p[i].cpuTime);
 36         printf("\t%c\t",p[i].state);
 37         printf("\n");
 38     }
 39 }
 40 
 41 PrioritySort(PCB p[MAX],int n) {
 42     int m=0,i=0,j ;
 43     PCB temp;
 44     m = n;
 45     for(i = 1 ; i < n ; i++) {
 46         m = m - 1 ;
 47         for(j = 0 ; j < m ; j ++) {
 48             if(p[j].priority < p[j+1].priority) {
 49                 temp = p[j];
 50                 p[j] = p[j+1];
 51                 p[j+1] = temp ;
 52             }
 53         }
 54     }
 55 }
 56 
 57 Run(PCB p[MAX] , int n) {
 58     int i ,j ;
 59     int m=0;
 60     for(i = 0 ; i < n ; i ++) {
 61         m = p[i].serveTime+m;
 62     }
 63     for(i = 0 ; i < n ; i ++) {
 64         for(j = 0 ; j < m ; j ++) {
 65             printf("请按回车键继续运行......!\n");
 66             getchar();
 67             p[i].priority--;
 68             p[i].cpuTime++;
 69             p[i].serveTime--;
 70             p[i].state='R';
 71             Output(p,n);
 72             if(p[i].serveTime!=0) {
 73                 p[i].state='R';
 74             } else {
 75                 p[i].state='F';
 76                 printf("********第%d个进程的运行完成!********\n",i+1);
 77                 break;
 78             }
 79         }
 80     }
 81 }
 82 
 83 End(PCB p[MAX] , int n) {
 84     int i ,j ;
 85     for(i = 0 ; i < n ; i ++) {
 86         if(p[i].serveTime==0){
 87             p[i].state='F';
 88         }
 89     }
 90     Output(p,n);
 91     printf("********进程调度结束!********\n",i+1);
 92 }
 93 
 94 main() {
 95     PCB p[MAX];
 96     int n,i;
 97     printf("\n            *************进程调度算法(最高优先数调度算法)************\n\n");
 98     printf("请输入进程数目:");
 99     scanf("%d",&n);
100     printf("\n");
101     Input(p,n);
102     PrioritySort(p,n);
103     Output(p,n);
104     getchar();
105     Run(p,n);
106     End(p,n); 
107 }

总结:

使用优先级调度能更好的安排进程的先后顺序

posted @ 2016-05-09 09:27  44卢全浩  阅读(287)  评论(0编辑  收藏  举报