操作系统时间片轮转法进行CPU调度.docx
《操作系统时间片轮转法进行CPU调度.docx》由会员分享,可在线阅读,更多相关《操作系统时间片轮转法进行CPU调度.docx(12页珍藏版)》请在冰豆网上搜索。
操作系统时间片轮转法进行CPU调度
目录
一、设计目的1
二、设计内容2
三、设计原理3
四、算法实现4
五、流程图5
六、源程序6
七、运行示例及结果分析11
八、心得体会13
九、参考资料14
时间片轮转法进行CPU调度
一、设计目的
进程调度是处理机管理的核心内容。
本设计要求用高级语言编写和调试一个简单的进程调度程序。
通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先权调度算法和时间片轮转调度算法的具体实施办法。
并通过课程设计,让我们更好的掌握操作系统的原理以及实现方法,加深对操作系统基础理论和重要算法的理解,加强我们自身的动手能力。
二、设计内容
在多道程序或多任务系统中,系统同时处于就绪状态的进程有若干个,为了使系统中的各进程能有条不紊的进行,选择某种调度策略,以选择一进程占用处理机因此使用时间片轮转算法模拟单处理机调度。
三、设计原理
系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。
时间片的大小从几MS到几百MS。
当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后再把处理机分配给就绪队列中的新的队首进程,同时也让他执行一个时间片。
这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。
换言之,系统能在给定时间内相应所有用户的请求。
四、算法实现
每个程序用一个进程控制块PCB来代表。
PCB代表:
进程名、链接指针、到达时间、估计运行时间和进程状态。
其中进程名既进程标识。
链接指针之处下一个到达进程的进程控制块地址,按照进程到达的顺序排队,统设置一个队头和队尾指针分别指向第一个和最后一个进程,新生成的进程放队尾。
设计者任意指定一个运行时间,进程创建时用户指定到达时间,调度时,总是选择到达时间最早的进程。
进程有就绪和完成状态,进程一创建就处于就绪状态,用R表示,一个程序运行结束时,就将其设置为完成状态,用C表示。
用户为每个程序设定一个要求运行时间和到达时间。
按照进程到达的先后顺序排成一个循环队列,再设一个队首指针指向第一个到达进程的首址。
进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示运行进程。
同时判断该进程剩余运行时间是否为零,不为零则等待下一轮的运行;若该进程的剩余运行时间为零,则该进程完成,状态为C,并退出循环队列。
若就绪队列不为空,则重复以上步骤直到所有进程都运行完为止。
五、流程图
六、源程序
#include
#include
#include
charX;
intstart;
typedefstruct{
charname[20];
intarrtime;
intruntime;
}DataType;
typedefstructnode{
DataTypepcb;
structnode*next;
}ListNode;
typedefListNode*LinkList;
LinkListhead;
voidcreate_insert_LinkList(intf1)
{
ListNode*p,*p1,*p2;
p=(ListNode*)malloc(sizeof(ListNode));
head=p;
p->next=NULL;
while(f1>0)
{
p=(ListNode*)malloc(sizeof(ListNode));
cout<<"请输入以下数据:
\n";
cout<<"进程名到达时间运行时间:
";
cin>>p->pcb.name>>p->pcb.arrtime>>p->pcb.runtime;
cout<p->next=NULL;
p1=head;
p2=p1->next;
while(p2!
=NULL&&p2->pcb.arrtimepcb.arrtime)
{
p1=p2;
p2=p2->next;
}
p1->next=p;
p->next=p2;
f1=f1-1;
}
}
voidpcb_LinkList(intf2)
{
LinkListH;
ListNode*rear,*p,*q;
intT,t,time,m,n;
p=(ListNode*)malloc(sizeof(ListNode));
p=NULL;
H=p;
cout<<"请输入时间片大小:
";
cin>>T;
t=T;
H=head->next;
head->next=head->next->next;
rear=H;
rear->next=NULL;
time=H->pcb.arrtime;
while(f2!
=0)
{
n=0;
while(t!
=0)
{
t=t-1;
time=time+1;
if(head->next!
=NULL)
{
if(head->next->pcb.arrtime<=time)
{
if(H==NULL)
{
H=head->next;
head->next=head->next->next;
rear=H;
rear->next=NULL;
}
else
{
rear->next=head->next;
head->next=head->next->next;
rear=rear->next;
rear->next=NULL;
}
}
}
if(H!
=NULL)
{
H->pcb.runtime=H->pcb.runtime-1;
m=1;//该进程有被执行
n=n+1;
if(H->pcb.runtime==0)//该进程服务完,从执行队列中删除
{
cout<<"在第"<cout<<"进程名"<pcb.name<<"运行了"<完成"<<"完成时间:
"<