实验2处理器调度学院:计算机与软件专业:软件工程日期:2014年5月18日姓名:学号:指导老师:
一、实验题目
按时间片轮转法实现处理器调度的模拟设计与实现
二、实验目的
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。
三、实验内容:
(1)实验思想
假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式为:进程名
指针
要求运行时间
已运行时间
状态
其中,进程名——作为进程的标识,假设五个进程的进程名分别为Q1,Q2,Q3,Q4,Q5。每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求
运行时间”
。
把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。例如,当前轮到P2执行,则有:
标志单元
K1Q1K2
2
1
R
PCB1K2Q2K330RPCB2K3Q3K410RPCB3K4Q4K520RPCB4K5Q5K140RPCB5
处理器调度总是选择标志单元指示的进程运行。由于本实验是模拟处理器调
度的功能,所以,对被选中的进程并不实际的启动运行,而是执行:
已运行时间+1
来模拟进程的一次运行,表示进程已经运行过一个单位的时间。
进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修改成“结束”(E)且退出队列。此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。若“就绪”状态的进程队列不为空,则重复上面步骤,直到所有的进程都成为“结束”状态。
(2)流程图
(3)总体设计
(4)详细设计
四、实验结果
1、实验截图
2、实验代码
#include
#include
#include
#include
#definenum5
structPCB
{
charname;//进程名
inttime;//要求运行时间
intpriority;//优先数
charstate;//状态R就绪,E结束
};
voidinit(PCB*p)//PCB初始化子程序
{
printf("\n请分别输入:\n");
for(inti=0;i
{
//为每个进程输入信息
printf("\n输入PCB%d:\n",i+1);
scanf("%s%d%d",&p[i].name,&p[i].priority,&p[i].time);
p[i].state='R';//假设进程初始状态均为就绪R
getchar();
}
}
voidrun(PCB*p)//进程运行子程序
{
intt=0;//t为运行次数
for(intj=0;j
{
t+=p[j].time;
}//运行次数即为各个进程运行时间之和
printf("\n");
printf("\n");
printf("\n运行前进程状态显示:\n");
printf("\n执行前进程信息显示:\n");
printf("********************************************\n");
printf("进程名进程优先级进程运行时间进程状态:\n");
for(inti=0;i
{
printf("\n%s%d%d%c\n"
,&p[i].name
,p[i].priority
,p[i].time
,p[i].state);
}
printf("********************************************\n");
printf("按任意键继续执行:\n");
getchar();//等待输入回车符
while(t>0)
{
for(i=0;i
{
if(p[i].time)//具有最大优先数的进程没有运行完,让其运行
{
p[i].state='r';//将其状态置为r,表示其正在运行
printf("\n子进程信息显示:\n");
printf("********************************************\n");
printf("进程名进程优先级进程运行时间进程状态:\n");
for(j=0;j
{
if(i==j)
{
printf("\n%s%6d%8d%c----->该进程正在
执行\n"
,&p[j].name,p[j].priority,p[j].time,p[j].state);
if(p[j].priority>0)
p[j].priority-=1;//将当前运行进程的优先数减1
p[j].time--;//要求运行时间减1
t--;
if(p[j].time==0)
p[j].state='E';//运行完则将该进程状态置为结束
else
p[j].state='R';//未运行完将其状态置为就绪
}
else
printf("\n%s%6d%8d%c\n",&p[j].name,p[j].priority,p[j].time,p[j].state);
}
printf("********************************************\n");
printf("\n进程正在进行............\n");
}
}
}
printf("\n执行后进程信息显示:\n");
printf("********************************************\n");printf("进程名进程优先级进程运行时间进程状态:\n");for(i=0;i
{
printf("\n%s%d%d%c\n"
,&p[i].name
,p[i].priority
,p[i].time
,p[i].state);
}
printf("********************************************\n");printf("\n进程执行完成\n");
}
voidmain()//按动态优先数调度主程序
{
structPCBp[num];
init(p);
//初始化各个进程PCB
run(p);//进程调度模拟
}
实验2处理器调度学院:计算机与软件专业:软件工程日期:2014年5月18日姓名:学号:指导老师:
一、实验题目
按时间片轮转法实现处理器调度的模拟设计与实现
二、实验目的
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。
三、实验内容:
(1)实验思想
假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式为:进程名
指针
要求运行时间
已运行时间
状态
其中,进程名——作为进程的标识,假设五个进程的进程名分别为Q1,Q2,Q3,Q4,Q5。每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求
运行时间”
。
把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。例如,当前轮到P2执行,则有:
标志单元
K1Q1K2
2
1
R
PCB1K2Q2K330RPCB2K3Q3K410RPCB3K4Q4K520RPCB4K5Q5K140RPCB5
处理器调度总是选择标志单元指示的进程运行。由于本实验是模拟处理器调
度的功能,所以,对被选中的进程并不实际的启动运行,而是执行:
已运行时间+1
来模拟进程的一次运行,表示进程已经运行过一个单位的时间。
进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修改成“结束”(E)且退出队列。此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。若“就绪”状态的进程队列不为空,则重复上面步骤,直到所有的进程都成为“结束”状态。
(2)流程图
(3)总体设计
(4)详细设计
四、实验结果
1、实验截图
2、实验代码
#include
#include
#include
#include
#definenum5
structPCB
{
charname;//进程名
inttime;//要求运行时间
intpriority;//优先数
charstate;//状态R就绪,E结束
};
voidinit(PCB*p)//PCB初始化子程序
{
printf("\n请分别输入:\n");
for(inti=0;i
{
//为每个进程输入信息
printf("\n输入PCB%d:\n",i+1);
scanf("%s%d%d",&p[i].name,&p[i].priority,&p[i].time);
p[i].state='R';//假设进程初始状态均为就绪R
getchar();
}
}
voidrun(PCB*p)//进程运行子程序
{
intt=0;//t为运行次数
for(intj=0;j
{
t+=p[j].time;
}//运行次数即为各个进程运行时间之和
printf("\n");
printf("\n");
printf("\n运行前进程状态显示:\n");
printf("\n执行前进程信息显示:\n");
printf("********************************************\n");
printf("进程名进程优先级进程运行时间进程状态:\n");
for(inti=0;i
{
printf("\n%s%d%d%c\n"
,&p[i].name
,p[i].priority
,p[i].time
,p[i].state);
}
printf("********************************************\n");
printf("按任意键继续执行:\n");
getchar();//等待输入回车符
while(t>0)
{
for(i=0;i
{
if(p[i].time)//具有最大优先数的进程没有运行完,让其运行
{
p[i].state='r';//将其状态置为r,表示其正在运行
printf("\n子进程信息显示:\n");
printf("********************************************\n");
printf("进程名进程优先级进程运行时间进程状态:\n");
for(j=0;j
{
if(i==j)
{
printf("\n%s%6d%8d%c----->该进程正在
执行\n"
,&p[j].name,p[j].priority,p[j].time,p[j].state);
if(p[j].priority>0)
p[j].priority-=1;//将当前运行进程的优先数减1
p[j].time--;//要求运行时间减1
t--;
if(p[j].time==0)
p[j].state='E';//运行完则将该进程状态置为结束
else
p[j].state='R';//未运行完将其状态置为就绪
}
else
printf("\n%s%6d%8d%c\n",&p[j].name,p[j].priority,p[j].time,p[j].state);
}
printf("********************************************\n");
printf("\n进程正在进行............\n");
}
}
}
printf("\n执行后进程信息显示:\n");
printf("********************************************\n");printf("进程名进程优先级进程运行时间进程状态:\n");for(i=0;i
{
printf("\n%s%d%d%c\n"
,&p[i].name
,p[i].priority
,p[i].time
,p[i].state);
}
printf("********************************************\n");printf("\n进程执行完成\n");
}
voidmain()//按动态优先数调度主程序
{
structPCBp[num];
init(p);
//初始化各个进程PCB
run(p);//进程调度模拟
}