操作系统处理机实验报告.docx
《操作系统处理机实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统处理机实验报告.docx(20页珍藏版)》请在冰点文库上搜索。
操作系统处理机实验报告
操作系统实验报告
姓名
学号
日期
实验室
指导教师
设备编号
设计题目
处理机的调度
一、设计内容
设计一个按优先数调度算法实现处理器调度的程序。
二、设计目的
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。
本实习模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。
三、设计过程
1、数据结构设计
进程结构体,用于描述进程的状态:
typedefstructpcb{
charname[10];//进程名字
charstate;//进程状态
intprior;//进程优先级
intntime;//进程所需时间
pcb*next;//指针
}pcb;
2.算法设计
(1)优先数调度算法实现处理器调度
1)主函数要求用户选择
选1创建进程,
选2运行程序,
选3输出进程,
选4添加进程,
选5退出。
2)选1调用voidcreate()函数(见图1),实现创建进程队列;
3)选2调用voidrunning()函数(见图2),实现运行程序;
4)选3调用voidshuchu()函数(见图3),实现输出进程;
5)选4调用voidcreate2(pcb&*a)函数(见图4),实现再插入进程;
其中create()和running()函数都调用insert(pcb*q)函数如图5。
Y
N
图1voidcreate()函数的流程图
图2voidrunning()函数的流程图
图3voidshuchu()函数的流程图
图4voidcreate2(pcb&*a)函数的流程图
NY
图5voidinsert()函数的流程图
YYYYY
图6主函数main()的流程图
四、程序实现及运行结果
classprocess
{
private:
pcb*head;//头指针
public:
voidcreate2(pcb*&a);
voidshuchu();//输出函数
voidrunning();//运行函数
voidinsert(pcb*q);//插入函数
voidcreate();//创建进程函数
process();
virtual~process();
};
voidprocess:
:
create()//创建进程
intn=0;inti;pcb*q,*p1;
q=newpcb;//q=(pcb*)malloc(sizeof(pcb));
head=q;//头指针head
q->next=NULL;
//printf("输入要插入进程的个数n=");
//scanf("%d",&n);
cout<<"输入要插入进程的个数n=";
cin>>n;
for(i=0;i{p1=newpcb;//p1=(pcb*)malloc(sizeof(pcb));//申请节点p1->next=NULL;//printf("\n输入进程的名称(字符型)优先级所需时间状态(r:就绪e:结束)\n");//scanf("%s%d%d%c",p1->name,&p1->prior,&p1->ntime,&p1->state);cout<<'\n'<<"输入进程的名称(字符串)优先级所需时间状态(r:就绪e:结束)"<<'\n';cin>>p1->name>>p1->prior>>p1->ntime>>p1->state;insert(p1);//调用插入函数}}voidprocess::running()//运行进程函数{pcb*p,*q;p=head;//printf("运行中.....\n");cout<<"运行中....."<<'\n';if(p->next&&p->next->ntime!=0)//当前队列不为空且进程所需时间不为0,{p->next->ntime--;//所需时间减1,p->next->prior--;//优先级减1,q=p->next;//p指向刚运行完的这个进程,if(p->next->ntime!=0&&p->next->next)//当所需时间不为0时并且有后续进程时,{p->next=p->next->next;insert(q);//将q即刚运行完的这个程序重新插入队列中。//printf("一次运行完毕。");}elseif(p->next->ntime==0)//当所需时间为0,即进程运行完毕,{p->next=p->next->next;//printf("%s进程执行完毕。",q->name);cout<name<<"进程执行完毕.";delete(q);//删除此进程。}}cout<<"一次运行完毕.";}voidprocess::shuchu()//输出函数{pcb*p;p=head;if(p->next==NULL)printf("进程运行完毕\n");elsecout<<"进程队列情况:\n";//printf("进程名称优先数所需时间状态\n");cout<<"进程名优先数所需时间状态"<<'\n';{while(p->next){//printf("%s\t%d\t%d\t%c\n",p->next->name,p->next->prior,p->next->ntime,p->next->state);cout<next->name<<'\t';cout<next->prior<<'\t';cout<next->ntime<<'\t';cout<next->state<<'\n';p=p->next;}}}voidprocess::create2(pcb*&a)//插入新进程函数{a=newpcb;//a=(pcb*)malloc(sizeof(pcb));//申请节点a->next=NULL;//printf("\n输入进程的名称(字符串)优先级所需时间状态(r:就绪e:结束)\n");//scanf("%s%d%d%c",a->name,&a->prior,&a->ntime,&a->state);cout<<'\n'<<"输入进程的名称(字符串)优先级所需时间状态(r:就绪e:结束)"<<'\n';cin>>a->name>>a->prior>>a->ntime>>a->state;insert(a);}voidprocess::insert(pcb*q)//插入进程函数{pcb*p;inti=0;//intn;p=head;if(p->next==NULL)//队列为空时,{p->next=q;//直接插入队列中。}else{while((p->next)&&(q->priornext->prior))//队列不为空时,{p=p->next;//若要插入的进程优先级比p->next优先级小,指针后移,}q->next=p->next;p->next=q;//直到找到q优先级比p->next的优先级大时,将q插到p->next的前边。}}主函数#include"stdafx.h"#include"malloc.h"#includeusingnamespacestd;#include"process.h"voidmain(){processq;intn=0;/*inti;*/pcb*a;//printf("选择对进程的操作:\n1:创建进程\n2:运行进程\n3:输出进程\n4:添加进程\n5:结束\n");cout<<"选择对进程的操作:"<<'\n'<<"1:创建进程"<<'\n'<<"2:运行进程"<<'\n'<<"3:输出进程"<<'\n'<<"4:添加进程"<<'\n'<<"5:结束"<<'\n';do{scanf("%d",&n);switch(n){case1:q.create();cout<<"选择下一操作:"<<'\n';break;case2:q.running();cout<<"选择下一操作:"<<'\n';break;case3:q.shuchu();cout<<"选择下一操作:"<<'\n';break;case4:q.create2(a);cout<<"选择下一操作:"<<'\n';break;case5:return;}}while(1);}处理器调度一、实习内容选择一个调度算法,实现处理器调度。二、实习目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实习模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。三、实习题目本实习有两个题,学生可选择其中的一题做实习。第一题:设计一个按优先数调度算法实现处理器调度的程序。[提示]:(1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:进程名指针要求运行时间优先数状态其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。要求运行时间——假设进程需要运行的单位时间数。优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。状态——可假设有两种状态,“就绪”状态和“结束”状态。五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。(2)在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。(3)为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。例:队首标志K2K1P1K2P2K3P3K4P4K5P50K4K5K3K12312415342RRRRRPCB1PCB2PCB3PCB4PCB5(4)处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1”。由于本实习是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:优先数-1要求运行时间-1来模拟进程的一次运行。提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。(5)进程运行一次后,若要求运行时间0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改成“结束”(E),且退出队列。(6)若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。(7)在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进程队列的变化。(8)为五个进程任意确定一组“优先数”和“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。第二题:设计一个按时间片轮转法实现处理器调度的程序。[提示]:(1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式为:进程名指针要求运行时间已运行时间状态其中,进程名——作为进程的标识,假设五个进程的进程名分别为Q1,Q2,Q3,Q4,Q5。指针——进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程的指针指出第一个进程的进程控制块首地址。要求运行时间——假设进程需要运行的单位时间数。已运行时间——假设进程已经运行的单位时间数,初始值为“0”。状态——有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“R”表示。当一个进程运行结束后,它的状态为“结束”,用“E”表示。(2)每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间”。(3)把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。例如,当前轮到P2执行,则有:标志单元,K2K1Q1K2Q2K3Q3K4Q4K5Q5K2K3K4K5K12312410000RRRRRPCB1PCB2PCB3PCB4PCB5(4)处理器调度总是选择标志单元指示的进程运行。由于本实习是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,而是执行:已运行时间+1来模拟进程的一次运行,表示进程已经运行过一个单位的时间。请同学注意:在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。在这时省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。(5)进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修改成“结束”(E)且退出队列。此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。(6)若“就绪”状态的进程队列不为空,则重复上面的(4)和(5)的步骤,直到所有的进程都成为“结束”状态。(7)在所设计的程序中应有显示或打印语句,能显示或打印每次选中进程的进程名以及运行一次后进程队列的变化。(8)为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中的进程名以及进程控制块的动态变化过程。四、实习报告(1)实习题目。(2)程序中使用的数据结构及符号说明。(3)流程图。(4)打印一份源程序并附上注释。(5)打印程序运行时的初值和运行结果。要求如下:ⅰ进程控制块的初始状态。ⅱ选中运行的进程名以及选中进程运行后的各进程控制块状态。对于ⅱ要求每选中一个进程运行后都要打印。
{p1=newpcb;//p1=(pcb*)malloc(sizeof(pcb));//申请节点
p1->next=NULL;
//printf("\n输入进程的名称(字符型)优先级所需时间状态(r:
就绪e:
结束)\n");
//scanf("%s%d%d%c",p1->name,&p1->prior,&p1->ntime,&p1->state);
cout<<'\n'<<"输入进程的名称(字符串)优先级所需时间状态(r:
结束)"<<'\n';
cin>>p1->name>>p1->prior>>p1->ntime>>p1->state;
insert(p1);//调用插入函数
}
running()//运行进程函数
pcb*p,*q;
p=head;
//printf("运行中.....\n");
cout<<"运行中....."<<'\n';
if(p->next&&p->next->ntime!
=0)//当前队列不为空且进程所需时间不为0,
p->next->ntime--;//所需时间减1,
p->next->prior--;//优先级减1,
q=p->next;//p指向刚运行完的这个进程,
if(p->next->ntime!
=0&&p->next->next)//当所需时间不为0时并且有后续进程时,
p->next=p->next->next;
insert(q);//将q即刚运行完的这个程序重新插入队列中。
//printf("一次运行完毕。
");
else
if(p->next->ntime==0)//当所需时间为0,即进程运行完毕,
//printf("%s进程执行完毕。
",q->name);
cout<name<<"进程执行完毕.";
delete(q);//删除此进程。
cout<<"一次运行完毕.";
shuchu()//输出函数
pcb*p;
if(p->next==NULL)
printf("进程运行完毕\n");
cout<<"进程队列情况:
\n";
//printf("进程名称优先数所需时间状态\n");
cout<<"进程名优先数所需时间状态"<<'\n';
while(p->next)
//printf("%s\t%d\t%d\t%c\n",p->next->name,p->next->prior,p->next->ntime,p->next->state);
cout<next->name<<'\t';
cout<next->prior<<'\t';
cout<next->ntime<<'\t';
cout<next->state<<'\n';
p=p->next;
create2(pcb*&a)//插入新进程函数
a=newpcb;//a=(pcb*)malloc(sizeof(pcb));//申请节点
a->next=NULL;
//printf("\n输入进程的名称(字符串)优先级所需时间状态(r:
//scanf("%s%d%d%c",a->name,&a->prior,&a->ntime,&a->state);
cin>>a->name>>a->prior>>a->ntime>>a->state;
insert(a);
insert(pcb*q)//插入进程函数
pcb*p;inti=0;//intn;
if(p->next==NULL)//队列为空时,
p->next=q;//直接插入队列中。
while((p->next)&&(q->priornext->prior))//队列不为空时,
p=p->next;//若要插入的进程优先级比p->next优先级小,指针后移,
q->next=p->next;
p->next=q;//直到找到q优先级比p->next的优先级大时,将q插到p->next的前边。
主函数
#include"stdafx.h"
#include"malloc.h"
#include
usingnamespacestd;
#include"process.h"
voidmain()
processq;intn=0;/*inti;*/pcb*a;
//printf("选择对进程的操作:
\n1:
创建进程\n2:
运行进程\n3:
输出进程\n4:
添加进程\n5:
结束\n");
cout<<"选择对进程的操作:
"<<'\n'<<"1:
创建进程"<<'\n'<<"2:
运行进程"<<'\n'<<"3:
输出进程"<<'\n'<<"4:
添加进程"<<'\n'<<"5:
结束"<<'\n';
do
scanf("%d",&n);
switch(n)
case1:
q.create();cout<<"选择下一操作:
"<<'\n';break;
case2:
q.running();cout<<"选择下一操作:
case3:
q.shuchu();cout<<"选择下一操作:
case4:
q.create2(a);cout<<"选择下一操作:
case5:
return;
}while
(1);
处理器调度
一、实习内容
选择一个调度算法,实现处理器调度。
二、实习目的
三、实习题目
本实习有两个题,学生可选择其中的一题做实习。
第一题:
[提示]:
(1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:
进程名
指针
要求运行时间
优先数
状态
其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。
指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。
要求运行时间——假设进程需要运行的单位时间数。
优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。
状态——可假设有两种状态,“就绪”状态和“结束”状态。
五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。
(2)在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。
(3)为了调度方便,把五个进程按给定的优先数从大到小连成队列。
用一单元指出队首进程,用指针指出队列的连接情况。
例:
队首标志
K2
K1
P1
P2
K3
P3
K4
P4
K5
P5
0
2
3
1
4
5
R
PCB1
PCB2
PCB3
PCB4
PCB5
(4)处理器调度总是选队首进程运行。
采用动态改变优先数的办法,进程每运行一次优先数就减“1”。
由于本实习是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:
优先数-1
要求运行时间-1
来模拟进程的一次运行。
提醒注意的是:
在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。
在这里省去了这些工作。
(5)进程运行一次后,若要求运行时间0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改成“结束”(E),且退出队列。
(6)若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。
(7)在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进程队列的变化。
(8)为五个进程任意确定一组“优先数”和“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。
第二题:
设计一个按时间片轮转法实现处理器调度的程序。
(1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。
进程控制块的格式为:
已运行时间
其中,进程名——作为进程的标识,假设五个进程的进程名分别为Q1,Q2,Q3,Q4,Q5。
指针——进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程的指针指出第一个进程的进程控制块首地址。
已运行时间——假设进程已经运行的单位时间数,初始值为“0”。
状态——有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“R”表示。
当一个进程运行结束后,它的状态为“结束”,用“E”表示。
(2)每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间”。
(3)把五个进程按顺序排成循环队列,用指针指出队列连接情况。
另用一标志单元记录轮到运行的进程。
例如,当前轮到P2执行,则有:
标志单元
,
Q1
Q2
Q3
Q4
Q5
(4)处理器调度总是选择标志单元指示的进程运行。
由于本实习是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,而是执行:
已运行时间+1
来模拟进程的一次运行,表示进程已经运行过一个单位的时间。
请同学注意:
在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。
在这时省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。
(5)进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。
同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。
若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修改成“结束”(E)且退出队列。
此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。
(6)若“就绪”状态的进程队列不为空,则重复上面的(4)和(5)的步骤,直到所有的进程都成为“结束”状态。
(7)在所设计的程序中应有显示或打印语句,能显示或打印每次选中进程的进程名以及运行一次后进程队列的变化。
(8)为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中的进程名以及进程控制块的动态变化过程。
四、实习报告
(1)实习题目。
(2)程序中使用的数据结构及符号说明。
(3)流程图。
(4)打印一份源程序并附上注释。
(5)打印程序运行时的初值和运行结果。
要求如下:
ⅰ进程控制块的初始状态。
ⅱ选中运行的进程名以及选中进程运行后的各进程控制块状态。
对于ⅱ要求每选中一个进程运行后都要打印。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2