标签:
实验三 进程调度模拟程序
13物联网 201306104131 温天麟
1. 目的和要求
实验目的
用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
实验要求
设计一个有 N(N不小于5)个进程并发执行的进程调度模拟程序。
进程调度算法:“时间片轮转法”调度算法对N个进程进行调度。
2. 实验内容
完成两个算法(简单时间片轮转法、多级反馈队列调度算法)的设计、编码和调试工作,完成实验报告。
1) 每个进程有一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、优先级、到达时间、需要运行时间、已用CPU时间、进程状态等等。
2) 每个进程的状态可以是就绪 r(ready)、运行R(Running)、或完成F(Finished)三种状态之一。
3) 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。
4) 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,应把它插入就绪队列等待下一次调度。
5) 每进行一次调度,程序都打印一次运行进程、就绪队列中各个进程的 PCB,以便进行检查。
6) 重复以上过程,直到所要进程都完成为止。
3.实验结果
4源代码
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define MAX 100 5 6 7 typedef struct 8 { 9 char name[4];//进程 10 int priority;//优先级 11 int sttime;//start time到达系统时间 12 int needtime;//需要运行时间 13 int cputime;//CPU时间 14 char state;//进程状态 15 }pr; 16 17 pr a[MAX]; 18 int n;//进程数 19 int t;//时间片大小 20 void input() 21 { 22 int i; 23 printf("请依次输入进程名-->优先级-->到达系统时间-->运行时间:\n"); 24 for(i=0;i<n;i++) 25 { 26 scanf("%s",&a[i].name); 27 scanf("%d",&a[i].priority); 28 scanf("%d",&a[i].sttime); 29 scanf("%d",&a[i].needtime); 30 a[i].cputime=0; 31 a[i].state=‘W‘; 32 } 33 } 34 35 36 void Sort() 37 { 38 int i,j; 39 pr temp; 40 for(i=0;i<n-1;i++) 41 { 42 for(j=0;j<n-1-i;j++) 43 if(a[j].sttime>a[j+1].sttime)//按到达系统时间排序 44 { 45 46 temp=a[j]; 47 a[j]=a[j+1]; 48 a[j+1]=temp; 49 } 50 } 51 52 for(i=0;i<n-1;i++) 53 { 54 for(j=0;j<n-1-i;j++) 55 if(a[j].priority<a[j+1].priority)//排优先级,数字高优先 56 { 57 temp=a[j]; 58 a[j]=a[j+1]; 59 a[j+1]=temp; 60 } 61 } 62 if (a[0].state!=‘F‘) 63 { 64 a[0].state=‘R‘; 65 66 } 67 } 68 69 void output() 70 { 71 int i; 72 Sort();//排序,输出打印 73 printf("\t进程名--优先级--到达时间--运行时间--已用时间--进程状态-------- \n"); 74 for(i=0;i<n;i++) 75 { 76 printf("%8s%10d%10d%10d%10d%10c\n", a[i].name,a[i].priority,a[i].sttime,a[i].needtime,a[i].cputime,a[i].state); 77 } 78 printf("\n\n"); 79 } 80 81 void RR() 82 { 83 84 do{ 85 if((a[0].needtime-a[0].cputime)>t)//若剩余时间大于时间片 86 { 87 a[0].cputime+=t; 88 a[0].priority--;//优先级减一 89 a[0].state=‘W‘;//执行完一个时间片后变为等待 90 } 91 else 92 { 93 a[0].cputime=a[0].needtime;//已用时间等于运行时间 94 a[0].priority=11111;//优先级为11111,表示完成进程 95 a[0].state=‘F‘; 96 } 97 output();//输出结果 98 } while(a[0].state!=‘F‘); 99 } 100 101 102 int main() 103 { 104 printf("请输入进程数n:"); 105 scanf("%d",&n); 106 printf("\n"); 107 printf("请输入时间片大小t:"); 108 scanf("%d",&t); 109 printf("\n"); 110 input(); 111 output();//输入进程按排序后显示,函数内部含有排序算法 112 RR(); 113 }
5.总结
过程实现:先对输入的进程排序(按到达系统时间和优先级),排好序后对第一个进程的状态设置为R表示运行。
因为任意时刻都是只能运行排好序后的第一个进程。每次运行进程只针对排好序后的第一个进程即第0号元素,当第一个进程运行完一个时间片,优先级减一后再对进程进行按到达系统时间和优先级排序,所以执行完的进程的优先级置为11111后自动排到了后面,最后实现轮转。
在此过程中,我发现对于那时间片排序RR的地方不是很懂,经过询问同学,后来解决了问题,相信以后通过深入的学习,可以更加熟悉时间片的使用和流程。
标签:
原文地址:http://www.cnblogs.com/skyokay/p/5015533.html