时
间
片
轮
转
算
法
实
验
报
告
院系:*****************学院
班级:***********
姓名:********
学号:*************
一、实验题目:时间片轮转算法
二、实验目的
进程调度是处理机管理的核心内容。本实验要求用高级语言编写
模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,
并体会和了解时间片轮转算法的具体实施办法。
三、实验内容及要求
1.设计进程控制块 PCB 的结构,通常应包括如下信息:
进程名、轮转时间片数、进程已占用的 CPU 时间、进程到完成还需
要的时间、进程的状态、当前队列指针等。
2.编写时间片轮转调度算法程序
3.按要求输出结果。
四、实验结果:
五、实验总结:
通过该实验,对进程调度有更深的理解。通过上机实践能把所学
的知识应用于实际应用,更深刻的理解进程的原理,时间片轮转法,
它的实现思想是,系统将所有的就绪进程按先来先服务的原则排成一
个队列,每次调度时,把 CPU 分派给队首进程,并令其执行一个时
间片。当时间片用完时,由一个计时器发出时钟中断请求,调度程序
便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,
再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时
间片。这样那个就可以保证就绪队列中的所有进程在给定的时间片均
能获得一时间片的处理机执行时间。另外,通过实验激发了我学习的
积极性,培养了我独立发现问题、分析问题,解决问题的能力。更增
强我与同学交流沟通和共同解决问题合作的能力。
附录(算法代码):
#include
#include
#include
typedef struct node
{
char name[20];
//int prio;
int round;
//int cputime;
int needtime;
/*进程的名字*/
/*进程的优先级*/
/*分配 CPU 的时间片*/
/*CPU 执行时间*/
/*进程执行所需要的
时间*/
char state;
/*进程的状态,W--就绪
态,R--执行态,F--完成态*/
int count;
struct node *next;
/*记录执行的次数*/
/*链表指针*/
}PCB;
PCB
*ready=NULL,*run=NULL,*finish=NULL;
/*定义三个队列,就绪队列,执行队列和完
成队列*/
/*从就绪队列取得第一
int num;
void GetFirst();
个节点*/
void Output();
void InsertTime(PCB *in);
void InsertFinish(PCB *in);
void TimeCreate();
void RoundRun();
void main()
{
/*输出队列信息*/
/*时间片队列*/
/*时间片队列*/
/*时间片输入函数*/
/*时间片轮转调度*/
printf("时间片轮转调度算法\n");
printf("请输入要创建的进程数目:");
scanf("%d",&num);
getchar();
TimeCreate();
RoundRun();
Output();
}
void GetFirst()
*/
/*取得第一个就绪队列节点
{
run = ready;
if(ready!=NULL)
{
run ->state = 'R';
ready = ready ->next;
run ->next = NULL;
}
}
void Output()
{
/*输出队列信息*/
PCB *p;
p = ready;
printf("进程 名\t 需要 时间\t 进程 状态
\n");
while(p!=NULL)
{
printf("%s\t%d\t\t%c\n",p->name,p->nee
dtime,p->state);
p = p->next;
}
p = finish;
while(p!=NULL)
{
printf("%s\t%d\t\t%c\n",p->name,p->nee
dtime,p->state);
p = p->next;
}
p = run;
while(p!=NULL)
{
printf("%s\t%d\t\t%c\n",p->name,p->nee
dtime,p->state);
p = p->next;
}
}
void InsertTime(PCB *in)
就绪队列尾部 尾插法*/
{
PCB *fst;
fst = ready;
if(ready == NULL)
{
in->next = ready;
ready = in;
}
else
{
}
while(fst->next != NULL)
{
fst = fst->next;
}
in ->next = fst ->next;
fst ->next = in;
/*将进程插入到
}
void InsertFinish(PCB *in)
完成队列尾部*/
{
PCB *fst;
fst = finish;
if(finish == NULL)
{
in->next = finish;
finish = in;
}
else
{
}
while(fst->next != NULL)
{
fst = fst->next;
}
in ->next = fst ->next;
fst ->next = in;
}
void TimeCreate() /*时间片输入函数*/
{
/*将进程插入到
PCB *tmp;
int i;
printf("输入进程名字和进程所需时间:
\n");
for(i = 0;i < num; i++)
{
if((tmp
=
(PCB
*)malloc(sizeof(PCB)))==NULL)
{
perror("malloc");
exit(1);
}
scanf("%s",tmp->name);
getchar();
scanf("%d",&(tmp->needtime));
tmp ->cputime = 0;
tmp ->state ='W';
tmp ->round = 2;
/*假设每个进程
//
所分配的时间片是 2*/
tmp ->count = 0;
InsertTime(tmp);
{
Output();
while(flag)
{
//
run->count++;
run->cputime++;
run->needtime--;
if(run->needtime == 0) /*进程
执行完毕*/
{
}
else
run ->state = 'F';
InsertFinish(run);
flag = 0;
if(run->count
==
run->round)/*时间片用完*/
{
run->state = 'W';
run->count = 0;
/*计数
}
}
void RoundRun()
法*/
{
int flag = 1;
/*时间片轮转调度算
器清零,为下次做准备*/
InsertTime(run);
flag = 0;
}
}
flag = 1;
GetFirst();
GetFirst();
while(run != NULL)
}
}