一、 实验目的
用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
二、 实验内容和要求
设计一个有 N个进程并发执行的进程调度模拟程序。
进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法。
(1). 每个进程有一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、优先级、到达时间、需要运行时间、已用CPU时间、进程状态等等。
(2). 进程的优先级及需要的运行时间可以事先人为地指定,进程的运行时间以时间片为单位进行计算。
(3). 每个进程的状态可以是就绪 r(ready)、运行R(Running)、或完成F(Finished)三种状态之一。
(4). 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。
(5). 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待调度。
(6). 每进行一次调度程序都打印一次运行进程、就绪队列中各个进程的 PCB,以便进行检查。
(7). 重复以上过程,直到所要进程都完成为止。
主要程序段及其解释:
#include<stdio.h> #include<stdlib.h> #define M 24 struct PCB{ char name;//作业名 int r;//优先级 int ct;//需要CPU(运行)时间 int ht;//已占用CPU时间 char s;//进程状态 }p[M]; //输出函数 void Output(int a) { int i; printf(" 作业名 优先级 所需CPU时间 已占用的CPU时间 进程状态 "); for(i=0;i<a;i++) { printf("%c ",p[i].name); printf(" %d ",p[i].r); printf(" %d ",p[i].ct); printf(" %d ",p[i].ht); printf(" %c ",p[i].s); } } //输入函数 int Input() { int i,n,b=0; int init,k; int j=1; struct PCB f; do{ printf("请输入n个作业(n>=5):"); scanf("%d",&n); if(n>=5) break; }while(j=1); for(i=0;i<n;i++) { printf("Please enter name:"); scanf("%s",&p[i].name); printf("Please enter ct:"); scanf("%d",&p[i].ct); printf("Please enter r:"); scanf("%d",&p[i].r); p[i].s='r'; p[i].ht=0; } for(i=0;i<n;i++)//按优先级别从高到低排序 { init=p[b].r; f=p[b]; for(k=b;k<n;k++) { if(p[k].r>init) { f=p[k]; p[k]=p[b]; p[b]=f; init=p[b].r; } } b++; }printf("---------------作业按优先级别从高到低排序输出------------"); Output(n);//按优先级别从高到低排序 return n; } char Select(struct PCB a[M],int t,int n) { int i,j,init,k=0; char s; struct PCB f; init=a[0].r; f=a[0]; for(i=0;i<n;i++) { if(a[k].r>init) { f=a[k]; a[k]=a[0]; a[0]=f; init=a[0].r; } } return a[0].name; } void Start(int t) { int i,j; int k=0,m=0,n=0,q=0,x=0; char l; int now=4,y=0,z=0; struct PCB a[M],b[M],c[M];//a为就绪队列,b为已完成的作业队列,c为等待队列 j=Input(); for(i=0;i<j;i++) a[i]=p[i]; while(now>0) { if(a[0].name==a[1].name) { for(i=0;i<j;i++) a[i]=c[i]; x=0; } l=Select(a,now,j); for(i=0;i<j;i++) { if(a[i].name==l) { for(y=i;y<j;y++) a[y]=a[y+1]; break; } } for(i=0;i<j;i++) { if(p[i].name==l) { p[i].s='R'; printf("--------------作业调度中---------------"); Output(j); p[i].ht=p[i].ht+4; if(p[i].ht>p[i].ct) p[i].ht=p[i].ct; if(p[i].ht>=p[i].ct) { p[i].s='F'; printf("--------------一个作业完成---------------"); Output(j); b[n]=p[i]; n++; } else { p[i].r=p[i].r-1; p[i].s='r'; c[x]=p[i]; x++; } break; } } now=now+4; if(b[j-1].s=='F') break; } } int main() { int i=1; char a; int tp=4; do{ Start(tp); printf("Do you want to continue?(y or n):"); scanf(" %c",&a); if(a=='n') break; }while(i=1); printf("The end! "); return 0; }
总结:刚开始编写代码的时候不知该从何下手,但理清思路了后面就没什么问题了。