2007年5月31日星期四

操作系统 实验一进程调度实验

 

 

实验一,进程调度实验

 

实验项目名称:进程调度实验

实验项目性质:综合性实验

所属课程名称:《操作系统》

实验计划学时:2学时

 

一、实验目的

 

用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解.

 

二、实验内容和要求

 

设计一个有 N个进程共行的进程调度程序。

 

进程调度算法:

  编写并调试一个模拟的进程调度程序,采用"最高优先数优先"调度算法对五个进程进行调度和采用"轮转法"调度算法对五个进程进行调度

  每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。

  进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。 进程的运行时间以时间片为单位进行计算。

  每个进程的状态可以是就绪 WWait)、运行RRun)、或完成FFinish)三种状态之一。

  就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。

  如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。

重复以上过程,直到所要进程都完成为止

 

 

 

 

 

 

 

 

三・进程调度之最高优先数优先调度算法的流程图如下 :

 

 

 

 

 

 

 

 

进程调度之简单轮转调度算法的流程图如下 :

五.进程调度部分源程序如下:

#include "stdio.h"

 

#include <stdlib.h>

 

#include <conio.h>

 

#define getpch(type) (type*)malloc(sizeof(type))

 

#define NULL 0

 

struct pcb { /* 定义进程控制块PCB */

 

char name[10];

 

char state;

 

int super;//优先级别

 

int ntime;//需运行时间

 

int rtime; //已经运行时间

 

struct pcb* link;

 

}*ready=NULL,*p;

 

typedef struct pcb PCB;

 

 

 

sort() /* 建立对进程进行fcfs算法排列函数*/

 

{

 

PCB *first, *second;

 

int insert=0;

 

if(ready==NULL) /*优先来者,插入队首*/

 

{

 

p->link=ready;

 

ready=p;

 

} 

 

else/*否则插入队尾*/

 

{

 

first=ready;

 

second=first->link;

 

while(second!=NULL)

 

{

 

first=first->link;

 

second=second->link;

 

}

 

if(insert==0) first->link=p;/* 插入到队尾*/

 

}

}

 

input() /* 建立进程控制块函数*/

 

{

 

int i,num;

 

/*clrscr(); 清屏*/

system("cls");

 

printf("\n 进程调度之简单轮转法.cpp \n\n 请输入"5"再按回车,即进程个数为 5?");

 

scanf("%d",&num);

 

for(i=0;i<num;i++)

 

{

 

printf("\n 进程号No.%d:\n",i);

 

p=getpch(PCB);

 

printf("\n 输入进程名:");

 

scanf("%s",p->name);

 

printf("\n 输入进程优先数:");

 

scanf("%d",&p->super);

 

printf("\n 输入进程运行时间:");

 

scanf("%d",&p->ntime);

 

printf("\n");

 

p->rtime=0;p->state='w';

 

p->link=NULL;

 

sort(); /* 调用sort函数*/

 

}

 

}

 

int space()

 

{

 

int l=0; PCB* pr=ready;

 

while(pr!=NULL)

 

{

 

l++;

 

pr=pr->link;

 

}

 

return(l);

 

}

 

disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/

 

{

 

printf("\n qname \t state \t super \t ndtime \t runtime \n");

 

printf("|%s\t",pr->name);

 

printf("|%c\t",pr->state);

 

printf("|%d\t",pr->super);

 

printf("|%d\t",pr->ntime);

 

printf("|%d\t",pr->rtime);

 

printf("\n");

 

}

check() /* 建立进程查看函数 */

 

{

 

PCB* pr;

 

printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/

 

disp(p);

 

pr=ready;

 

printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/

 

while(pr!=NULL)

 

{

 

disp(pr);

 

pr=pr->link;

 

}

 

}

 

destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/

 

{

 

printf("\n 进程 [%s] 已完成.\n",p->name);

 

free(p);

 

}

 

running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/

 

{

 

(p->rtime)++;

 

if(p->rtime==p->ntime)

 

destroy(); /* 调用destroy函数*/

 

else

 

{

 

(p->super)--;

 

p->state='w';

 

sort(); /*调用sort函数*/

 

}

 

}

 

main() /*主函数*/

 

{

 

int len,h=0;

 

char ch;

 

input();

 

len=space();

 

while((len!=0)&&(ready!=NULL))

 

{

 

ch=getchar();

 

h++;//标志执行的步骤

 

printf("\n The execute number:%d \n",h);

 

p=ready;

 

ready=p->link;

 

p->link=NULL;

 

p->state='R';

 

check();//显示运行及等待队列的状况

 

running();

 

printf("\n 按任一键继续......");

 

ch=getchar();

 

}

 

printf("\n\n 进程已经完成.\n");

 

ch=getchar();

 

}

 

六.运行结果的分析

 

  五个作业所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。如果运行进程用完它的时间片后还为完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕。

  其实除了调度的算法之外,大多部分都是与其他的调度模拟程序一样,只是按要求先初始化五个进程而已!

 

 

没有评论: