计算机操作系统处理机调度实验报告.docx
《计算机操作系统处理机调度实验报告.docx》由会员分享,可在线阅读,更多相关《计算机操作系统处理机调度实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
计算机操作系统处理机调度实验报告
中南大学
实验名称:
处理机调度
课程名称:
计算机操作系统
学生姓名盛希玲
学号0903060215
学院信息科学与工程学院
专业班级电子信息工程0602
完成时间2008年10月12日
目录
一实验内容2
二实验目的2
三实验题目2
四基本思想2
五算法分析2
六流程图3
七算法描述4
八运行输出结果9
一实验内容
选择一个调度算法,实现处理机调度。
二实验目的
多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。
本实验模拟实现处理机调度,以加深了解处理机调度的工作。
三实验题目
设计一个按优先权调度和时间片轮转算法实现处理机调度的程序。
四基本思想
先选择时间片的个数和每个时间片需要的时间,正在运行的进程每运行一秒其优先权数目加一,即其优先权减小。
每个时间片运行结束后,选择进入时间片进程优先权数目最小的进程,开始下一个时间片的运行。
如果有进程运行结束,则离开,再在就绪队列中选择优先权数目最小的进程进入。
在运行期间,如果有新的进程来到,按优先权大小放入就绪队列中。
五算法分析
定义一个结构体,此包含了PCB的信息:
structPCB
{
charPID[5];/*进程名*/
intneedtime;/*要求运行的时间*/
intcputime;/*已运行时间*/
intpriority;/*优先权(越小越高)*/
intstarttime;/*进入就绪队列的时间*/
intovertime;/*运行完成的时间*/
intstate;/*状态:
1就绪2运行3完成*/
structPCB*next;
};
子函数structPCB*create(intnum,intn)用来建立一个按优先级大小排列的就绪进程链表和一个按时间先后循序排列的将进入就绪进程的链表。
main()函数中用一while循环输出进入时间片的进程状态。
六流程图
七算法描述
#defineNULL0
#defineLENsizeof(structPCB)
#include"stdio.h"
#include"stdlib.h"
structPCB
{
charPID[5];/*进程名*/
intneedtime;/*要求运行的时间*/
intcputime;/*已运行时间*/
intpriority;/*优先权(越小越高)*/
intstarttime;/*进入就绪队列的时间*/
intovertime;/*运行完成的时间*/
intstate;/*状态:
1就绪2运行3完成*/
structPCB*next;
};
structPCB*create(intnum,intn)
/*创建进程,并将进程按优先级顺序插入队列中*/
{
structPCB*head,*p,*p1,*p2;
inti;
head=NULL;/*头指针指零*/
for(i=1;i<=num;i++)/*循环建立所有进程*/
{
printf("请输入第%d个进程的信息\n",i);
p=(structPCB*)malloc(LEN);/*开辟一个空间*/
printf("进程名:
");/*输入进程名*/
scanf("%s",p->PID);
printf("要求运行的时间:
");/*输入要运行的时间*/
scanf("%d",&p->needtime);
p->cputime=0;/*占用处理机的时间赋为零*/
printf("优先权:
");/*输入优先权*/
scanf("%d",&p->priority);
if(n==1)
p->starttime=0;/*进入就绪队列的时间赋为零*/
else
{
printf("进入就绪队列时间:
");/*输入进入就绪队列的时间*/
scanf("%d",&p->starttime);
}
p->overtime=-1;/*运行没有结束所以运行完成的时间赋为-1*/
p->state=1;/*状态赋为就绪状态*/
p1=head;/*p1指针指向头指针*/
if(head==NULL)/*如果头指针为零将头指针指向新建立的进程*/
{head=p;head->next=NULL;}
else/*头指针不为零的情况*/
{
if(n==1)
while(p1!
=NULL&&p->priority>p1->priority)/*查找插入点*/
{p2=p1;
p1=p1->next;
}
else
while(p1!
=NULL&&p->starttime>p1->starttime)/*查找插入点*/
{p2=p1;
p1=p1->next;
}
if(head==p1)/*优先权的值最小作为表头*/
{p->next=head;p2=head=p;}
else/*否则的话插入*/
{p2->next=p;p->next=p1;}
}
}
return(head);
}
voidmain()
{
charnow[5];
intcho,num,num1,timepiece,time,i,j,k,flag,choo,clock=0;
structPCB*head,*head1,*over,*later,*l,*l1,*l2,*p,*p0,*p1,*p2,*q,*q1,*q2,*q3;
over=NULL;
printf("初始化进程...\n");
printf("输入总的就绪进程数:
");
scanf("%d",&num);
head=create(num,1);/*建立就绪进程的链表*/
printf("输入将会就绪的进程数:
");
scanf("%d",&num1);/*建立将会进入就绪进程的链表*/
later=create(num1,2);
printf("cpu是否开始运行:
1是2不是--");
scanf("%d",&cho);
if(cho==1)/*处理机开始进行调度*/
{
printf("现在的时间是:
");
scanf("%s",now);
printf("显示所有就绪的进程:
\n");
p2=head;
printf("进程名\t要求运行时间\t已运行时间\t优先权\t状态(1就绪2运行3结束)\n");
while(p2!
=NULL)
{
printf("%s\t%d\t\t%d\t\t%d\t%d\n",p2->PID,p2->needtime,p2->cputime,p2->priority,p2->state);
p2=p2->next;
}
printf("请输入时间片总数:
");
scanf("%d",&timepiece);
printf("请输入时间片的时间:
");
scanf("%d",&time);
printf("运行正式开始!
\n");
head1=head;
printf("\t\t进程名\t要求运行时间\t已运行时间\t优先权\t状态\n");
for(i=1;i<=timepiece;i++)/*将进入时间片运行的进程用头指针head1指示,并改变就绪进程头指针head的指向*/
{
if(head!
=NULL)
{
p=head;
head=head->next;
}
elsebreak;
}
p->next=NULL;
while(head1!
=NULL)/*就绪进程头指针不为零就循环*/
{
head1->state=2;/*状态:
1就绪2运行3完成*/
for(j=1;j<=time;j++)/*每个时间片所需时间的循环*/
{
clock++;/*定时器每秒加1*/
if(later!
=NULL&&clock==later->starttime)
/*如果将进入就绪队列的进程时间到达加入就绪队列*/
{l=later;
l1=head;
later=later->next;
if(head==NULL)
{head=l;head->next=NULL;}
else
{
while(l1!
=NULL&&l1->priority<=l->priority)
{l2=l1;l1=l1->next;}
if(l1==head)
{
l->next=head;
head=l;
}
else
{
l2->next=l;
l->next=l1;
}
}
}
flag=0;
printf("\n%3d秒时间片第%d秒",clock,j);
q=head1;
if(head1->needtime>head1->cputime)/*以运行时间和优先权都加1*/
{
head1->cputime++;
head1->priority++;
while(q)/*运行队列不为零输出其信息*/
{if(q==head1)
printf("%s\t%d\t\t%d\t\t%d\t%d\n",q->PID,q->needtime,q->cputime,q->priority,q->state);
else
printf("\t\t%s\t%d\t\t%d\t\t%d\t%d\n",q->PID,q->needtime,q->cputime,q->priority,q->state);
q=q->next;
}
}
if(head1->needtime==head1->cputime)
/*运行完成将其放入over为头指针的链表中*/
{
head1->state=3;
head1->overtime=clock;
if(over==NULL)
{over=head1;head1=head1->next;over->next=NULL;}
else
if(over!
=NULL&&head1!
=NULL)
{
p1=head1->next;
p0=over;
over=head1;
over->next=p0;
head1=p1;
}
flag=1;
}
if(flag==1)break;
}
if(flag==1)/*有进程结束的情况*/
{
if(head!
=NULL)/*就绪队列不为零将优先权最高的放入运行链表中*/
{q1=head;
head=head->next;
q2=head1;
while(q2!
=NULL&&q2->priority<=q1->priority)
{q3=q2;q2=q2->next;}
if(q2==head1)
{
q1->next=head1;
head1=q1;
}
else
{
q3->next=q1;
q1->next=q2;
}
}
}
else/*无进程结束的情况,寻找优先权最高的运行*/
{
head1->state=1;
q1=head1;
head1=head1->next;
q2=head1;
while(q2!
=NULL&&q2->priority<=q1->priority)
{q3=q2;q2=q2->next;}
if(q2==head1)
{q1->next=head1;head1=q1;}
else
{q3->next=q1;q1->next=q2;}
}
}
}
printf("cpu结束运行!
\n");
printf("是否输出所有结束的进程:
1是2不是--");
scanf("%d",&choo);
if(choo==1)/*输出所有完成运行的进程*/
{
printf("开始时间:
%s\n",now);
printf("进程名\t要求运行时间\t进入就绪队列的时间\t运行完成的时间\n");
while(over!
=NULL)
{
printf("%s\t%d\t\t%d\t\t\t%d\n",over->PID,over->needtime,over->starttime,over->overtime);
over=over->next;
}
}
}
八运行输出结果
初始化进程如右图
显示现在的时间和所有就绪的进程
输入时间片的总数和每个时间片的时间
运行时显示的信息