暨南大学本科报告专用纸.docx
- 文档编号:17341899
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:15
- 大小:18.96KB
暨南大学本科报告专用纸.docx
《暨南大学本科报告专用纸.docx》由会员分享,可在线阅读,更多相关《暨南大学本科报告专用纸.docx(15页珍藏版)》请在冰点文库上搜索。
暨南大学本科报告专用纸
暨南大学本科实验报告专用纸
课程名称操作系统程序设计成绩评定
实验项目名称进程调度试验指导教师郝振明
实验项目编号003实验项目类型设计性实验地点宿舍
学生姓名刘永均学号82
学院信息科学技术学院系计算机科学与技术专业软件工程
实验时间06年11月4日午~11月15日午温度29℃湿度40%
进程调度模拟实验
1.实验目的
通过对进程调度算法的模拟加深对进程概念和进程调度过程的理解。
2.实验内容
用C语言、Pascal语言或其他开发工具实现对N(N=5)个进程的调度模拟,要求至少采用两种不同的调度算法(如简单轮转法Round Robin和优先权高者优先算法Highest Priority First),分别进行模拟调度。
每个用来标识进程的进程控制块PCB用结构(记录)来 描述,根据需要,它包括以下字段:
进程标识数ID。
进程优先数Priority,并规定优先数越大的进程,其优先权越高。
采用简单轮转法时该字段无用。
进程已经占用的CPU时间CPUTIME(以时间片为单位,下同)。
进程还需占用的CPU时间ALLTIME。
当进程运行完毕时,ALLTIME变为0。
进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。
进程被阻塞的时间BLOCKTIME,表示已经阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
进程状态STATE。
队列指针NEXT,用来将PCB排成队列。
优先数改变的原则(采用简单轮转法时该字段无用):
进程在就绪队列中等待一个时间片,优先数增加1;
进程每运行一个时间片,优先数减3。
假设在进行调度前,系统中有5个进程,它们的初始状态可以编程输入(更具有灵活性),也可以初始化为如下内容:
ID PRIORITY CPUTIME ALLTIME STARTBLOCK BLOCKTIME STATE
0 9 0 3 2 3 READY
1 38 0 3 -1 0 READY
2 30 0 6 -1 0 READY
3 29 0 3 -1 0 READY
4 0 0 4 -1 0 READY
为了清楚地观察诸进程的调度过程,程序应该将每个时间片内各进程的情况显示出来并暂停,参考格式如下:
运行/Running:
I
就绪队列/Ready Queue:
Idi,Idj,…
阻塞队列/Block Queue:
Idk,Idl,…
======================================================================
进程号 优先数 已运行时间 需要时间 开始阻塞时间 阻塞时间 状态
0 P0 C0 A0 T0 B0 S0
1 P1 C1 A1 T1 B1 S1
2 P2 C2 A2 T2 B2 S2
3 P3 C3 A3 T3 B3 S3
4 P4 C4 A4 T4 B4 S4
======================================================================
3.实验分析和思考
在实际的进程调度中,还有哪些可行的算法,怎样模拟?
在实际的进程调度中,除了按算法选择下一个运行的进程之外,操作系统还应该做哪些工作?
为什么对进程的优先数可以按上述原则进行修改?
有什么好处?
4.实验题目
模拟操作系统四种进程调度算法(先进先出、短进程优先、高优先权优先、简单时间片轮转)
5.外加说明
本实验可以模拟任意一种,可以自定义进程个数、自定义初始化他们的PCB。
6.//C++代码:
#include
#include
#include
usingstd:
:
cout;
usingstd:
:
cin;
usingstd:
:
cerr;
enumStatus{running,ready,blocked};
enumPolicy{fifo,spf,hpf,rr};
typedefclassPCB
{//定义PCB类。
public:
intid,priority,cputime,alltime,startblock,blocktime;
Statusstate;
classPCB*next;
PCB()
{
priority=0;
}
}PCB,*PCBptr,**PCBpp;
charx;
PCBpppp;//两个全局变量
voidPrint(PCBptrhead)
{//打印head为头指针的PCB链表信息。
PCBptrp;
cout<<"\n运行/Running:
";
for(p=head;p->next;p=p->next)
{
if(p->next->state==running)
{
cout<<"ID"<
break;
}
}
cout<<"\n就绪队列/ReadyQueue:
";
for(p=head;p->next;p=p->next)
if(p->next->state==ready)
cout<<"ID"<
cout<<"\n阻塞队列/BlockQueue:
";
for(p=head;p->next;p=p->next)
if(p->next->state==blocked)
cout<<"ID"<
cout<<"\n-----------------------------------------------------------------------\n"
<<" 进程号 优先数 已运行时间 还需要时间 开始阻塞时间 阻塞时间 状态\n";
for(p=head;p->next;p=p->next)
{
cout<<" "<
switch(p->next->state)
{
caseready:
cout<<"就绪";break;
caserunning:
cout<<"运行";break;
caseblocked:
cout<<"阻塞";break;
default:
exit(0);
}
cout<<'\n';
}
cout<<"------------------------------------------------------------------------\n"
<<"按任意键以继续...";
cin>>x;
}
voidDelete(PCBptrhead,PCBptrp)
{//删除以head为头指针的PCB链表中p所指向的结点。
PCBptrq=head;
while(q->next!
=p)q=q->next;
q->next=p->next;
deletep;
}
voidInsertSort(PCBppRdy,PCBppRdyEd,Policyalgthm)
{//直接插入排序。
if(*(Rdy+1))//队列不为空
if(RdyEd-1!
=Rdy+1)
{//Ready+1队列中不只一个。
switch(algthm)
{
casehpf:
if((*(RdyEd-1))->priority>(*(RdyEd-2))->priority)
{
PCBpptt;
*Rdy=*(RdyEd-1);
*(RdyEd-1)=*(RdyEd-2);
for(tt=RdyEd-3;(*Rdy)->priority>(*tt)->priority;tt--)
*(tt+1)=*tt;
*(tt+1)=*Rdy;
}
break;
casespf:
if((*(RdyEd-1))->alltime<(*(RdyEd-2))->alltime)
{
PCBpptt;
*Rdy=*(RdyEd-1);
*(RdyEd-1)=*(RdyEd-2);
for(tt=RdyEd-3;(*Rdy)->alltime<(*tt)->alltime;tt--)
*(tt+1)=*tt;
*(tt+1)=*Rdy;
}
}
}
}
voidRunToBlk(PCBppRun,PCBpp&BlkEd)
{//定义运行态转为阻塞态。
(*Run)->state=blocked;
*BlkEd=*Run;
BlkEd++;
}
voidRdyToRun(PCBpp&Rdy,PCBppRun,Policyalgthm)
{//定义就绪态转为运行态。
if(algthm==hpf||algthm==spf)
{
if(*(Rdy+1))
{
(*(Rdy+1))->state=running;
*Run=*(Rdy+1);
Rdy++;
}
}
else
{
if(*Rdy)
{
(*Rdy)->state=running;
*Run=*Rdy;
Rdy++;
}
}
}
voidRunToRdy(PCBppRun,PCBppRdy,PCBpp&RdyEd,Policyalgthm)
{//定义运行态转为就绪态。
(*Run)->state=ready;
*RdyEd=*Run;
RdyEd++;
if(algthm==hpf||algthm==spf)
InsertSort(Rdy,RdyEd,algthm);
}
intmain()
{
cout<<"*******************实验开始*******************\n\n需要做几个进程并发执行的实验?
";
intn;
if(!
(cin>>n)){cerr<<"错误:
输入不正确!
";exit(0);}
PCBptrListhead,Listp,Listq;//建立n个
Listhead=newPCB;//
Listp=Listhead;//
for(inti=0;i<=n-1;i++)//
{
Listq=newPCB;//
Listp->next=Listq;//
Listp=Listq;//
}
Listp->next=0;//PCB的队列。
Policyalgorithm;
intnum1,num2;
L1:
cout<<"\n请选择算法(0表示FIFO,1表示SPF,2表示HPF,3表示RR):
";
if(!
(cin>>num1)){cerr<<"错误:
输入不正确!
";exit(0);}
algorithm=Policy(num1);
if(algorithm!
=fifo&&algorithm!
=spf&&algorithm!
=hpf&&algorithm!
=rr)
{cout<<"无效的算法不正确!
请重新输入:
\n";gotoL1;}
cout<<"\n现在有"< \n\n"; Listp=Listhead->next; for(i=0;i<=n-1;i++) { cout<<"请输入"< \n"; Listp->id=i; if(algorithm==hpf) { cout<<" 优先数(整数,值越大表明优先权越高): "; if(! (cin>>Listp->priority)){cerr<<"错误: 输入不正确! ";exit(0);} } cout<<" 已占用CPU时间(整数,以时间片为单位): "; if(! (cin>>Listp->cputime)){cerr<<"错误: 输入不正确! ";exit(0);} cout<<" 还需占用CPU时间(整数,以时间片为单位): "; if(! (cin>>Listp->alltime)){cerr<<"错误: 输入不正确! ";exit(0);} cout<<" 开始阻塞时间(整数,以时间片为单位): "; if(! (cin>>Listp->startblock)){cerr<<"错误: 输入不正确! ";exit(0);} cout<<" 阻塞时间(整数,以时间片为单位): "; if(! (cin>>Listp->blocktime)){cerr<<"错误: 输入不正确! ";exit(0);} L2: cout<<" 进程状态(0表示运行,1表示就绪,2表示阻塞): "; if(! (cin>>num2)){cerr<<"错误: 输入不正确! ";exit(0);} if(num2! =0&&num2! =1&&num2! =2){cout<<"状态不正确! 请重新输入: \n";gotoL2;} Listp->state=Status(num2); Listp=Listp->next; } PCBppRun=newPCBptr();// 生成 PCBppReady=newPCBptr[100];// for(i=0;i<=99;i++)*(Ready+i)=0;// 运行 PCBppReadyEnd=Ready;// 就绪 PCBppBlock=newPCBptr[100];// 阻塞 for(i=0;i<=99;i++)*(Block+i)=0;// PCBppBlockEnd=Block;// 队列 if(algorithm==hpf||algorithm==spf)ReadyEnd++;//如果是HPF算法,用直接插入排序,*Ready是哨兵,Ready+1成为队头。 for(Listp=Listhead;Listp->next;Listp=Listp->next) {//把初始化的进程放进各自队列 switch(Listp->next->state) { caserunning: *Run=Listp->next;break; caseready: { *ReadyEnd=Listp->next;ReadyEnd++; if(algorithm==hpf||algorithm==spf) InsertSort(Ready,ReadyEnd,algorithm); break; } caseblocked: *BlockEnd=Listp->next;BlockEnd++;break; } } cout<<"\n现在这"< cin>>x; for(inttime=1;Listhead->next;time++) {//开始并发执行。 cout<<"\n第"<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 暨南大学 本科 报告 专用