《操作系统概念》
实验报告
项目名称 CPU Scheduling
Allocation & Reclaim
专业班级 软件工程 1203 班
学
姓
号 3901120316
名 孙俊萍
实验成绩:
批阅教师:胡志刚
2013 年 12 月 16 日
实验 1《CPU Scheduling》
实验学时: 4
实验地点: 二综
实验日期:
一、实验目的
多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占
用处理机。本实验模拟实现处理机调度,加深了解处理机调度的工作过程
二、实验内容
选择或者自行设计一个调度算法,实现处理机调度。
1、设计一个按优先权调度算法实现处理机调度的程序
2、设计一个按时间片轮转实现处理机调度的程序
三、实验方法
按优先权调度算法实现处理机调度的程序
四、实验步骤
构建 PCB,内容至少涵盖:
进程名/PID;
要求运行时间(单位时间);
优先权;
状态:
PCB 指针;
1、可随机输入若干进程,并按优先权排序
2、采用动态优先权调度,从就绪队首选进程运行:
优先权-1/要求运行时间-1
要求运行时间为 0 时,撤销该进程
3、重新排序,进行下轮调度
五、实验要求:
最好采用图形界面
可动态增加进程
规定道数,设置后备队列和挂起状态
如果内存中进程数少于规定道数,可自动从后备队列通过作业调度选择一作业进入,
作业调度算法可自行选择
被挂起进程入挂起队列,设置解挂功能用于将指定挂起进程解挂并入就绪队列
每次调度后,显示各进程状态。
六、实验代码:
typedef struct node
{
/*进程的名字*/
/*进程的优先级*/
/*CPU 执行时间*/
/*进程执行所需要的时间*/
char name[20];
int prio;
int cputime;
int needtime;
char state;/*进程的状态,W--就绪态,R--执行态,F--完成态*/
int count;
struct node *next;
}PCB;
/*记录执行的次数*/
/*链表指针*/
//要创建的进程数目
PCB *ready=NULL,*run=NULL,*finish=NULL; /*定义三个队列,ready 就绪队列,run
执行队列和 finish 完成队列*/
int num;
void GetFirst();
void Output();
void InsertPrio(PCB *in);//创建优先级队列规定优先数越小优先级越高
void PrioCreate();
void Priority();
/*从就绪队列取得第一个节点*/
/*输出队列信息*/
/*优先级输入函数*/
/*按照优先级调度*/
int main(void)
{
cout<<"请输入要创建的进程数目:"<
>num;
getchar();
cout<<"优先级调度算法: "<if(ready!=NULL)
{
run ->state = 'R';
ready = ready ->next;
run ->next = NULL;
}
}
/*输出队列信息*/
void Output()
{
PCB *p;
p = ready;
cout<<"进程名\t 优先级\tcpu 时间\t 需要时间\t 进程状态\t 计数器\n";
while(p!=NULL)
{
cout<
name<<"\t"<prio<<"\t"<cputime<<"\t"<needtime<<"\t"<
state<<"\t"<count<next;
}
p = finish;
while(p!=NULL)
{
cout<name<<"\t"<prio<<"\t"<cputime<<"\t"<needtime<<"\t"<
state<<"\t"<count<next;
}
p = run;
while(p!=NULL)
{
cout<
name<<"\t"<prio<<"\t"<cputime<<"\t"<needtime<<"\t"<
state<<"\t"<count<next;
}
}
//创建优先级队列,规定优先数越小,优先级越低
void InsertPrio(PCB *in)
{
PCB *fst,*nxt;
fst = nxt = ready;
if(ready == NULL)
{
in->next = ready;
ready = in;
/*如果队列为空,则为第一个元素*/
}
else
{
/*查到合适的位置进行插入*/
if(in ->prio >= fst ->prio)/*刚进入的进程比第一个还要大,则插入到队头*/
{
in->next = ready;
ready = in;
}
else
{
while(fst->next != NULL)
/*移动指针查找第一个别它小的元素的位置
进行插入*/
{
nxt = fst;
fst = fst->next;
}
if(fst ->next == NULL) /*已经搜索到队尾,则其优先级数最小,将其插入
到队尾即可*/
{
in ->next = fst ->next;
fst ->next = in;
/*插入到队列中*/
nxt = in;
in ->next = fst;
}
else
{
}
}
}
}
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 PrioCreate()
{
PCB *tmp;
int i;
cout<<"输入进程名字和进程所需时间:\n";
for(i = 0;i < num; i++)
{
if((tmp = (PCB *)malloc(sizeof(PCB)))==NULL)
{
perror("malloc");
exit(1);
}
/*吸收回车符号*/
cin>>tmp->name ;
getchar();
cin>>tmp->needtime;
tmp ->cputime = 0;
tmp ->state ='W';
tmp ->prio = 50 - tmp->needtime;
/*设置其优先级,需要的时间越多,优先级越低
tmp ->count = 0;
InsertPrio(tmp);
/*按照优先级从高到低,插入到就绪队列*/
*/
}
}
/*按照优先级调度,每次执行一个时间片*/
void Priority()
{
int flag = 1;
GetFirst();
while(run != NULL)//当就绪队列不为空时,则调度进程如执行队列
{
Output();
/*输出每次调度过程中各个节点的状态*/
while(flag)
{
run->prio -= 3; /*优先级减去三*/
run->cputime++; /*CPU 时间片加一*/
run->needtime--;/*进程执行完成的剩余时间减一 1*/
if(run->needtime == 0)/*如果进程执行完毕,将进程状态置为 F,将其插
入到完成队列*/
{
run ->state = 'F';
run->count++; /*进程执行的次数加一*/
InsertFinish(run);
flag = 0;
/*将进程状态置为 W,入就绪队列*/
run->state = 'W';
run->count++; /*进程执行的次数加一*/
InsertTime(run);
flag = 0;
}
else
{
}
}
flag = 1;
GetFirst();/*继续取就绪队列队头进程进入执行队列*/
}
}