操作系统实验三时间片轮转法完成进程调度
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三:时间片轮转法完成进程调度
一、实验目的:
(1)加深对进程的理解
(2)理解进程控制块的结构
(3)理解进程运行的并发性
(4)掌握时间片轮转法进程调度算法
实验内容:
(1)建立进程控制块
(2)设计三个链队列,分别表示运行队列、就绪队列和完成队列
(3)用户输入进程标识符以及进程所需的时间,申请空间存放进程PCB言息。
(4)每一个时间片结束输出各进程的进程号,CPU时间(即已经占用的CPU时间),所需时间(即还需要的CPU时间),以及状态(即用W表示等待,R表示运行,F表示完成)
实验程序:
#include
#include
#include
typedef struct node
{
char name[10];/* 进程标识符*/ int prio;/* 进程优先数*/
int round;/* 进程时间轮转时间片*/
int cputime; /*进程占用CPU时间*/
int needtime; /* 进程到完成还要的时间*/
int count;/* 计数器*/
char state; /* 进程的状态*/
struct node *next; /* 链指针*/
}PCB;
PCB *finish,*ready,*tail,*run; // 队列指针
int N,t; // 进程数,时间片的大小
void firstin()
{
run二ready;//就绪队列头指针赋值给运行头指针
run->state='R'; //进程状态变为运行态
ready=ready->next; //就绪队列头指针后移到下一进程
}
void prt1(char a)// 输出标题函数
{
if(toupper(a)=='P')// 优先级法
\n");} printf("进程名占用CPU时间到完成还要的时间轮转时间片状态
void prt2(char a,PCB *q)〃进程PCB输出
if(toupper(a)=='P')// 优先级法的输出
printf("%4s %8d %12d %14d %8c\n",q->name,q->cputime,q->needtime,q->roun d,q->state);
}
void prt(char algo)// 输出函数二、
{
PCB *p;
prt1(algo);// 输出标题
if(run!=NULL)// 如果运行指针不空prt2(algo,run);// 输出当前正在运行的PCB p=ready;// 输出就绪队列PCB while(p!=NULL)
{
prt2(algo,p);
p=p->next;
}
p=finish;// 输出完成队列的PCB while(p!=NULL)
{
prt2(algo,p);
p=p->next;
}
getchar(); // 按住任意键继续
}
void insert(PCB *q)// 时间片轮转的插入算法
{
PCB *p1,*s,*r;
s=q;〃待插入的PCB指针
p仁ready;//就绪队列头指针
r=p1;//*r做pl的前驱指针
while(p1!=NULL)
if(p1->round<=s->round)
{
r=p1;
p1=p1->next;
}
if(r!=p1)
{
r->next=s;
s->next=p1;
else
{
s->next=p1;// 否则插入在就绪队列的头
ready=s;
}
}
void create(char alg)// 时间片轮转法创建链表进程PCB {
PCB *p;
int i,time;
char na[10];
ready=NULL;
finish=NULL;
run=NULL;
printf(" 输入进程名及其需要运行的时间(中间以空格隔开):\n");
for(i=1;i<=N;i++)
{
p=new PCB;
scanf("%s %d",&na,&time); strcpy(p->name,na);
p->cputime=0;
p->needtime=time;
p->state='W';// 进程的状态
p->round=0;
if(ready!=NULL)
insert(p);
else
{ p->next=ready; ready=p;
}
}
printf("************* 时间片轮转法进程调度过程*************\n");
prt(alg);
run=ready;
ready=ready->next;
run->state='R';
}
void timeslicecycle(char alg)〃时间片轮转法