- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
短作业优先调度和时间xxxxxx片轮转调度算
一、实验项目名称:进程调度算法的设计
二、实验原理:
时间片轮转法:系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的队尾;然后,再把处理机分配给就绪队列中的新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程在一个给定的时间内均能获得一时间片的处理机执行时间。
三、实验目的:
通过对进程调度算法的设计,深入理解进程调度的原理
四、实验内容:
1.编写程序实现RR算法
五、实验器材(设备、元器件):
装有VC++6.0的PC机一台
六、实验步骤:
1.打开VC,设计编写程序的源代码
2.编译运行程序的源代码
3.分析检验程序的结果是否正确
4.总结实验结果及结论
时间片轮转法源代码:
#include stdio.h
#define M 5 //物理页数
#define Myprintf printf(|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n)
typedef struct PCB
{
int ID;
int ReachTime;
int TotalTime;
}PCB; //进程号,到达时间和服务时间
typedef struct NOTE //备份
{
int ID;
int TotalTime;
}NOTE;
PCB A[M]; //5个进程
PCB a[M];
NOTE temp;
int queue[50]; //记录调度的进程
int K=0; //调度进程数组的标识
void INIT()//初始化
{
int i;
for(i=0;iM;i++)
{
A[i].ID=-1;
}
}
int GetNum()//计算进程数
{
int i,j=0;
for(i=0;iM;i++)
{
if(A[i].ID!=-1)
{
j++;
}
}
return j;
}
int GetReach(int time)//找出到达进程号
{
int i;
for(i=0;iM;i++)
{
if(a[i].ReachTime=time)
{
a[i].ReachTime=100;
return i;
}
}
return -1;
}
int GetInsert()//找出插入位置
{
int i;
for(i=0;iM;i++)
{
if(A[i].ID==-1)
return i;
}
return -1;
}
void Forward(int num)//前移
{
int i;
for(i=0;inum-1;i++)
{
A[i].ID=A[i+1].ID;
A[i].TotalTime=A[i+1].TotalTime;
}
A[num-1].ID=-1;
}
void Process()//执行进程
{
queue[K]=A[0].ID;
K++;
A[0].TotalTime--;
temp.ID=A[0].ID;
temp.TotalTime=A[0].TotalTime;
}
void main()
{
int i;
int time;
int t=0;
int reach;
int insert;
int num;
printf(RR算法\n\n);
INIT();
for(i=0;iM;i++)
{
printf(请输入进程ID:);
scanf(%d,a[i].ID);
printf(请输入到达时间:);
scanf(%d,a[i].ReachTime);
printf(请输入服务时间:);
scanf(%d,a[i].TotalTime);
}
for(i=0;iM;i++)//运行时间
{
t=t+a[i].TotalTime;
}
for(i=0;i50;i++)//初始化
{
queue[i]=-1;
}
for(time=0;time=t;time++)
{
reach=GetReach(time);
if(reach!=-1)//有进程到达
{
insert=GetInsert();
A[insert].ID=a[reach].ID;
A[insert].TotalTime=a[reach].TotalTime;
num
文档评论(0)