进程调度算法模拟 实验报告

更新时间:2023-08-28 19:48:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实 验 报 告

课程名称

实验名称 专业班级 学生姓名 指导教师

实验一 进程调度算法模拟,

1.内容:设计一个简单的进程调度算法,模拟OS中的进程调度过程;

2.要求:

① 进程数不少于5个;

② 进程调度算法任选;

可以用动态优先数加时间片轮转法实现进程调度,每运行一个时间片优先数减3; ③ 用C语言编程;

④ 程序运行时显示进程调度过程。

3.步骤:

① 设计PCB及其数据结构:

进程标识数:ID

进程优先数:PRIORITY(优先数越大,优先级越高)

进程已占用时间片:CPUTIME,每得到一次调度,值加1;

进程还需占用时间片:ALLTIME,每得到一次调度,该值减1,一旦运行完毕,

ALLTIME为0)

进程队列指针:NEXT,用来将PCB排成队列

进程状态:STATE(一般为就绪,可以不用)

② 设计进程就绪队列及数据结构;

③ 设计进程调度算法,并画出程序流程图;

④ 设计输入数据和输出格式;

结构格式:当前正运行的进程:0

当前就绪队列:2,1,3,4

⑤ 编程上机,验证结果。

4.提示:

假设调度前,系统中有5个进程,其初始状态如下:

ID 0 1 2 3 4 PRIORITY 9 38 30 29 0 可否考虑用CPUTIME 0 0 0 0 0 数组或链表ALLTIME 3 2 6 3 4 去实现 STATE ready ready ready ready ready ① 以时间片为单位调度运行;

② 每次调度ALLTIME不为0,且PRIORITY最大的进程运行一个时间片; ③ 上述进程运行后其优先数减3,再修改其CPUTIME和ALLTIME,重复②,③ ④ 直到所有进程的ALLTIME均变为0。

5.书写实验报告

① 实验题目;

② 程序中所用数据结构及说明;

③ 清单程序及描述;

④ 执行结果。

实验源代码:

#include<stdio.h>

#include<malloc.h>

typedef int Status;

#define ERROR 0

#define OK 1

typedef struct PCB{

char NAME[10]; //进程名字

int PRIO; //进程优先数

int ROUNT; //轮转时间片

int COUNT; //计数器

int NEEDTIME; //需要的CPU时间

int CPUTIME; //占用cpu时间

char *STATE; //进程状态

}ElemPCB;

typedef struct QNode{

ElemPCB pcb;

struct QNode *next;

}QNode, *QueuePtr;

typedef struct{ //就绪队列

QueuePtr RUN; //当前运行进程指针

QueuePtr READY; //头指针

QueuePtr TAIL; //尾指针

}READYQueue;

typedef struct{ //完成队列

QueuePtr FINISH; //头指针

QueuePtr TAIL; //尾指针

}FINISHQueue;

Status Create(READYQueue &ready);

Status Print(READYQueue ready,FINISHQueue finish);

Status Printr(READYQueue ready,FINISHQueue finish);

Status Fisrt(READYQueue &ready);

Status Insert1(READYQueue &ready);

Status Insert2(READYQueue &ready);

Status Prisch(READYQueue &ready,FINISHQueue &finish);

Status Roundsch(READYQueue &ready,FINISHQueue &finish);

void main(){

char ch;

READYQueue ready;

FINISHQueue finish;

ready.READY=ready.TAIL=(QueuePtr)malloc(sizeof(QNode));

ready.RUN=(QueuePtr)malloc(sizeof(QNode));

ready.RUN->next=NULL;

finish.FINISH=finish.TAIL=(QueuePtr)malloc(sizeof(QNode));

Create(ready);

//创建后就绪对列中

printf("\n就绪对列中初始值:\n");

Print(ready,finish); //存储分配

Fisrt(ready);

printf("请输入要选择调度的算法(p--优先数调度,r--时间片轮转法):\n");

while(1){

do{

ch=getchar();

scanf("%c",&ch);

}while(ch!='p' && ch!='r');

switch(ch){

case 'p':

//优先数调度

Prisch(ready,finish);

break;

case 'r':

//时间片轮转法

Roundsch(ready,finish);

break;

}

}

}

Status Print(READYQueue ready,FINISHQueue finish){

队列中的进程状态

QueuePtr p,q;

p=ready.READY;

q=finish.FINISH;

//运行中的进程

if(ready.RUN->next!=NULL)

{

printf("%s",ready.RUN->next->http://www.77cn.com.cn);

printf(":%s\t",ready.RUN->next->pcb.STATE);

printf("优先数:%d\n",ready.RUN->next->pcb.PRIO);

}

//就绪队列的进程

while(p!=ready.TAIL){

printf("%s",p->next->http://www.77cn.com.cn);

printf(":%s\t",p->next->pcb.STATE);

printf("优先数:%d\n",p->next->pcb.PRIO);

p=p->next;

}

//完成队列的进程

while(q!=finish.TAIL){

printf("%s",q->next->http://www.77cn.com.cn);

printf(":%s\t",q->next->pcb.STATE);

printf("优先数:%d\n",q->next->pcb.PRIO);

q=q->next; //打印就绪

}

return OK;

}

Status Printr(READYQueue ready,FINISHQueue finish){ //打印就绪队列中的进程状态

QueuePtr p,q;

p=ready.READY;

q=finish.FINISH;

//运行中的进程

if(ready.RUN->next!=NULL)

{

printf("%s",ready.RUN->next->http://www.77cn.com.cn);

printf(":%s\t",ready.RUN->next->pcb.STATE);

printf("剩余时间:%d\n",ready.RUN->next->pcb.NEEDTIME);

}

//就绪队列的进程

while(p!=ready.TAIL){

printf("%s",p->next->http://www.77cn.com.cn);

printf(":%s\t",p->next->pcb.STATE);

printf("剩余时间:%d\n",p->next->pcb.NEEDTIME);

p=p->next;

}

//完成队列的进程

while(q!=finish.TAIL){

printf("%s",q->next->http://www.77cn.com.cn);

printf(":%s\t",q->next->pcb.STATE);

printf("剩余时间:%d\n",q->next->pcb.NEEDTIME);

q=q->next;

}

return OK;

}

Status Create(READYQueue &ready){

QueuePtr p;

int i=0 ;

int n;

printf("请输入进程个数:");

scanf("%d",&n);

while(i<n)

{

p=(QueuePtr)malloc(sizeof(QNode));

printf("输入第%d进程名:",i+1);

scanf("%s",p->http://www.77cn.com.cn);

printf("输入进程需要的时间:");

scanf("%d",&p->pcb.NEEDTIME);

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

scanf("%d",&p->pcb.PRIO);

p->pcb.STATE="W";

p->pcb.ROUNT=2;

p->pcb.COUNT=0;

i++;

p->next=NULL;

ready.TAIL->next=p;

ready.TAIL=p;

}

return OK;

}

Status Fisrt(READYQueue &ready){

if(ready.READY==ready.TAIL)

return ERROR;

ready.RUN->next=ready.READY->next;

ready.RUN->next->pcb.STATE="RUN"; //修改进程状态

if(ready.TAIL==ready.READY->next)

ready.READY=ready.TAIL;

else

ready.READY->next=ready.READY->next->next; //头指针后移

printf("\n%s被从就绪队列调度运行\n",ready.RUN->next->http://www.77cn.com.cn);

return OK;

}

Status Insert1(READYQueue &ready){

int i=0,j=0;

QueuePtr p=ready.READY,q;

ElemPCB temp;

QueuePtr s=(QueuePtr)malloc(sizeof(QNode));

s->pcb=ready.RUN->next->pcb;

s->next=NULL; //将未完成的进程插入就绪队列

ready.TAIL->next=s;

ready.TAIL=s;

//按优先数从大到小排序

for(p;p!=ready.TAIL;p=p->next)

{

for(q=p->next;q!=ready.TAIL;q=q->next)

{

if(p->next->pcb.PRIO < q->next->pcb.PRIO)

{

temp=p->next->pcb;

p->next->pcb=q->next->pcb;

q->next->pcb=temp;

}

}

}

return OK;

}

Status Insert2(READYQueue &ready){

QueuePtr p=ready.RUN->next;

if(p->pcb.NEEDTIME > 0)

{

ready.TAIL->next=p; //插入到就绪队列

ready.TAIL=p;

ready.RUN->next=NULL;

}

return OK;

}

Status Prisch(READYQueue &ready,FINISHQueue &finish){

int i=0 ;

while(ready.RUN->next!=NULL)

{

ready.RUN->next->pcb.CPUTIME++;

ready.RUN->next->pcb.NEEDTIME--;

ready.RUN->next->pcb.PRIO-=3;

if(ready.RUN->next->pcb.NEEDTIME==0)

{

finish.TAIL->next=ready.RUN->next; //插入到完成队列

finish.TAIL=ready.RUN->next; //尾指针后移

ready.RUN->next->pcb.STATE="FINISH";

ready.RUN->next=NULL;

if(ready.READY!=ready.TAIL)

{

Fisrt(ready);

}

}

else if(ready.READY != ready.TAIL && (ready.RUN->next->pcb.PRIO) (ready.READY->next->pcb.PRIO))

{

ready.RUN->next->pcb.STATE="W";

printf("%s被调到就绪队列里\n",ready.RUN->next->http://www.77cn.com.cn); Insert1(ready);

Fisrt(ready);

}

i++;

printf("\n进程执行第%d个时间片的结果:\n",i);

Print(ready,finish);

} <

return OK;

}

Status Roundsch(READYQueue &ready,FINISHQueue &finish){

int i=0;

while(ready.RUN->next!=NULL)

{

ready.RUN->next->pcb.CPUTIME++;

ready.RUN->next->pcb.NEEDTIME--;

ready.RUN->next->pcb.COUNT++;

if(ready.RUN->next->pcb.NEEDTIME==0)

{

finish.TAIL->next=ready.RUN->next; //插入到完成队列 finish.TAIL=ready.RUN->next; //尾指针后移

ready.RUN->next->pcb.STATE="FINISH";

ready.RUN->next=NULL;

if(ready.READY!=ready.TAIL)

{

Fisrt(ready);

}

}

else if(ready.RUN->next->pcb.COUNT==ready.RUN->next->pcb.ROUNT) {

ready.RUN->next->pcb.COUNT=0;

if(ready.READY != ready.TAIL)

{

ready.RUN->next->pcb.STATE="W";

printf("%s被调到就绪队列里\n",ready.RUN->next->http://www.77cn.com.cn); Insert2(ready);

Fisrt(ready);

}

}

i++;

printf("\n进程执行第%d个时间片的结果:\n",i);

Printr(ready,finish);

}

return OK;

}

运行结果截图:

本文来源:https://www.bwwdw.com/article/tkdi.html

Top