
1目的与要求:
1)本实验目的是通过对进程调度算法的实现和实验模拟,加深对操作系统进程调度操作功能和进程调度算法的完整理解,培养和提高学生对操作系统开发的兴趣,以及进程调度程序的开发与应用能力;
2)理论上必须深刻理解优先权调度算法和时间片轮转调度算法的基本思想和原理;
3)使用C或VC++编程语言编写优先权调度或时间片轮转算算法调度模拟程序;
4)按照实验题目要求正确地完成实验内容(编写、调试算法程序,提交程序清单及及相关实验数据与运行结果)
5)于2009年10月15日以前提交本次实验报告(含电子和纸质报告,由学习委员以班为单位统一打包提交)。
2 实验内容或题目
1)设计有5个进程并发执行的模拟调度程序,每个程序由一个PCB表示。
2)模拟调度程序可任选两种调度算法之一实现(有能力的同学可同时实现两个调度算法)。
3)程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。
4)本次实验内容(项目)的详细说明以及要求请参见实验指导书。
3 实验步骤与源程序
#include #include #include void Check(); typedef struct node { char name[10]; int span;//轮转时间 int take;//占用时间 int used;//已用的时间 int need;//还需要的时间 char status;//状态 struct node *next; }PCB; PCB *ready,*finish,*tail,*rear; void Print(PCB *p) { while(p!=NULL) { printf("%3s%5d%5d%5d%5d%5c\\n",p->name,p->used,p->need,p->take,p->span,p->status); p=p->next; } } void Creat(int N) { PCB *p; int time; char na[10]; ready=NULL; /*就绪队列头指针*/ finish=NULL; /*完成队列头指针*/ tail=NULL; rear=NULL; printf("Enter name and time of round process \\n"); for(int i=1;i<=N;i++)//创建就绪队列 { p=(PCB *)malloc(sizeof(PCB)); scanf("%s",na); scanf("%d",&time); strcpy(p->name,na); p->span=2; p->take=0; p->used=0; p->need=time; p->status='J'; p->next=NULL; if(ready==NULL){ready=p;tail=p;} else{tail->next=p;tail=p;} } printf("……………………运行结果……………………\n"); } void Print1() {//输出ready与finish队列 PCB *p; p=ready; printf("name,used,need,take,span,state\\n"); Print(p); p=finish; Print(p); } void Run() { Print1(); ready->used+=1; ready->need-=1; ready->take+=1; ready->status='R'; if(ready->need!=0)//进程时间need片是否为0 { if(ready->take /*占用时间是否到轮转时间,没到就继续,到了就排到就绪队列尾*/ {Run();} else { tail->next=ready;ready=ready->next;tail=tail->next; tail->status='J';tail->take=0;tail->next=NULL; Check(); } } else//进程撤销,放入撤销队列 { if(finish==NULL) {finish=ready;rear=finish;} else {rear->next=ready;rear=rear->next;} ready=ready->next;rear->next=NULL;rear->status='F';rear->take=0; Check(); } //Check();由于上多次文调用Run本身递归,此句也会被多调用,产生在结束时的冗余结果; } void Check() { if(ready!=NULL) {Run();} else Print1(); } main() { int N=0; printf("输入进程数目:"); scanf("%d",&N); Creat(N); Check(); } 4 测试数据与实验结果(可以抓图粘贴)
