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