操作系统课程设计进程调度模拟设计先来先服务优先.docx
- 文档编号:24742297
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:37
- 大小:239.14KB
操作系统课程设计进程调度模拟设计先来先服务优先.docx
《操作系统课程设计进程调度模拟设计先来先服务优先.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计进程调度模拟设计先来先服务优先.docx(37页珍藏版)》请在冰豆网上搜索。
操作系统课程设计进程调度模拟设计先来先服务优先
操作系统课程设计进程调度模拟设计先来先服务,优先
课程设计
课程名字
系统软件开发实训A
题目
进程调度模拟设计——先来先服务、优先级法
学院
运算机科学与技术学院
专业
运算机科学与技术专业
班级
姓名
指导教师
李玉强
2021
年
01
月
13
日
课程设计任务书
学生姓名:
专业班级:
指导教师:
李玉强工作单位:
运算机科学与技术学院
题目:
进程调度模拟设计——先来先服务、优先级法
初始条件:
1.预备内容:
阅读操作系统的处理机治理章节内容,对进程调度的功能以及进程调度算法有深入的明白得。
2.实践预备:
把握一种运算机高级语言的使用。
要求完成的要紧任务:
〔包括课程设计工作量及其技术要求,以及说明书撰写等具体要求〕
1.模拟进程调度,能够处理以下的情形:
⑴能够选择不同的调度算法〔要求中给出的调度算法〕;
⑵能够输入进程的差不多信息,如进程名、优先级、到达时刻和运行时刻等;
⑶依照选择的调度算法显示进程调度队列;
⑷依照选择的调度算法运算平均周转时刻和平均带权周转时刻。
2.设计报告内容应说明:
⑴课程设计目的与功能;
⑵需求分析,数据结构或模块说明(功能与框图);
⑶源程序的要紧部分;
⑷测试用例,运行结果与运行情形分析;
⑸自我评判与总结。
时刻安排:
设计安排3周:
查阅、分析资料1天
系统软件的分析与建模4天
系统软件的设计5天
系统软件的实现3天
撰写文档1天
课程设计验收答辩1天
设计验收安排:
设计周的第三周的指定时刻到实验室进行上机验收。
设计报告书收取时刻:
课程设计验收答辩完结时。
〔本卷须知:
严禁抄袭,一旦发觉,抄与被抄的一律按0分记〕
指导教师签名:
2021年12月10日
系主任〔或责任教师〕签名:
2021年12月10日
课程设计报告书
1.需求分析
1.1设计目的
(1)阅读操作系统的处理机治理章节内容,对进程调度的功能以及进程调度算法有深入的明白得。
(2)把握一种运算机高级语言的使用。
要求完成的要紧任务:
〔包括课程设计工作量及其技术要求,以及说明书撰写等具体要求〕
1.2程序流程图
1.3设计要求
(1)能够选择不同的调度算法〔要求中给出的调度算法〕;
(2)能够输入进程的差不多信息,如进程名、优先级、到达时刻和运行时刻等;
(3)依照选择的调度算法显示进程调度队列;
(4)依照选择的调度算法运算平均周转时刻和平均带权周转时刻。
2.功能设计
2.1数据结构
1.进程的结构定义:
structprocess
{
charname[10];//进程名
intno;//进程序号
doublearrivetime;//进程达到时刻
doubleneedtime;//进程运行时刻
doublestarttime;//进程开始时刻
doubleendtime;//进程终止时刻
intstate;//进程状态,0表示未执行,1表示已执行
intpriority;//进程优先级
process*next;
process*head=Null;
intcount;
};
2.使用链表储备进程并按照到达时刻排序
、
voidinsert(process*current)
{
if(head!
=Null)
{
if(head->next==Null)
//假如只有一个节点
{
if(current->arrivetime
{
current->next=head;
head=current;
}
else
{
current->next=Null;
head->next=current;
}
}
else
//假如至少两个节点
{
process*p1=head;
if(head->arrivetime>current->arrivetime)
{
current->next=head;
head=current;
}
else
{
intflag=1;
while(p1->next!
=Null)//当head后面不为空时一直做
{
//假如在两个节点间
if(p1->arrivetime
{
current->next=p1->next;
p1->next=current;
flag=0;
break;
}
elsep1=p1->next;
}
//假如到达时刻最大,那么插到链尾
if(flag=1)
{
p1->next=current;
current->next=Null;
}
}
}
}
elsehead=current;
}
2.2先来先服务算法设计
1.FCFS算法说明
将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理,是一种最普遍和最简单的方法。
在该算法中,每个作业或进程按照它们在队列中等待时刻长短来决定它们是否优先享受服务。
在没有专门理由要优先调度某类作业或进程时,从处理的角度来看,FCFS方式是一种最合适的方法,因为不管是追加依旧取出一个队列元素在操作上差不多上最简单的。
2.创建进程
voidcreateFCFS()
{
process*q1=newprocess;
cout<<"请输入进程总数目";
cin>>count;
cout< intnumber=1; while(number<=count) { q1=newprocess; q1->no=number; cout<<"进程序号"< cout<<"进程名称"; cin>>q1->name; cout<<"进程到达时刻"; cin>>q1->arrivetime; cout<<"进程运行时刻"; cin>>q1->needtime; q1->next=NULL; insert(q1); number++; cout< } } 3.进程调度及输出结果 voidprintFCFS() { process*p=newprocess; doublesystime=0;//记录系统时刻 doubleturn=0;//平均周转时刻 doubleturnw=0;//平均带权周转时刻 if(head==NULL) cout<<"没有进程调度"< //处理第一个 elseif(head! =NULL) { head->starttime=head->arriveTime; head->endtime=head->arrivetime+head->needtime; systime=head->endtime; turn=turn+(head->endtime-head->arrivetime); turnw=turnw+(head->endtime-head->arrivetime)/head->needtime; p=head->next; while(p! =NULL) { if(p->arrivetime>systime)//假如前一个终止后一个还没到达 { p->starttime=p->arrivetime; p->endtime=p->starttime+p->needtime; systime=p->endTime; turn=turn+(p->endtime-p->arrivetime); turnw=turnw+(p->endtime-p->arrivetime)/p->needtime; p=p->next; } else//假如前一个未终止时后一个差不多到达 { p->starttime=systime; p->endtime=p->starttime+p->needtime; systime=p->endtime; turn=turn+(p->endtime-p->arrivetime); turnw=turnw+(p->endtime-p->arrivetime)/p->needtime; p=p->next; } } } cout.setf(ios: : left);//设置对齐方式为left cout< process*temp=head; while(temp! =NULL) { cout.setf(ios: : left); cout< temp=temp->next; } cout<<"平均周转时刻"< while(head->next! =NULL)//回收空间 { process*t=newprocess; t=head->next; head->next=t->next; deletet; } head=NULL; } 2.3优先级算法的设计 1.PIRO算法及说明 优先级法可被用作作业或进程的调度策略。 第一,系统或用户按某种原那么为作业或进程指定一个优先级来表示该作业或进程所享有的调度优先权。 该算法的核心是确定进程或作业的优先级。 确定优先级的方法可分为两类。 即动态法和静态法静态法依照作业或进程的静态特性,在作业或进程开始执行之前就确定它们的优先级,一旦开始执行之后就不能改变。 动态法那么不然,它把作业或进程的静态特性和动态特性结合起来确定作业或进程的优先级,随着作业或进程的执行过程,其优先级不断变化。 静态优先级中,能够由用户自己依照作业的紧急程度输入一个适当的优先级,为防止各用户都将自己的作业冠以高优先级,系统应对高优先级用户收取较高的费用;也能够由系统或操作员依照作业类型指定优先级。 动态优先级中,基于静态优先级的调度算法实现简单,系统开销小,但由于静态优先级一旦确定之后,直到执行终止为止始终保持不变,从而系统效率较低,调度性能不高。 现在的操作系统中,假如使用优先级调度的话,那么大多采纳动态优先级的调度策略。 2.创建进程 voidcreatePRIO() { process*q1=newprocess; cout<<"请输入进程总数目"; cin>>count; cout< intnumber=1; while(number<=count) { q1=newprocess; q1->no=number; cout<<"进程序号"< cout<<"进程名称"; cin>>q1->name; cout<<"优先级"; cin>>q1->priority; cout<<"进程到达时刻"; cin>>q1->arriveTime; cout<<"进程运行时刻"; cin>>q1->needTime; q1->next=NULL; insert(q1); number++; cout< } } 3.把最先达到的进程的排在链头,后面的进程按优先级大小重新排序 voidchangePRIO(doublesystime) { //把最先到达的放到链头然后后面的结点按照优先级来排序 //排序的前提是结点数至少是3个从第二个开始和后面的比较 if(count>2) { process*n0=head; process*n1=n0->next; process*n2=n1->next; for(inti=0;i { while(n1! =NULL&&n2! =NULL&&n1->arrivetime<=systime&&n2->arrivetime<=systime) { //假如前面的优先级大于后面的优先级,那么交换 if(n1->priority { n1->next=n2->next; n0->next=n2; n2->next=n1; n1=n0->next; n2=n0->next->next; } n0=n1; n1=n2; n2=n2->next; } } } } 4.输出调度结果 voidprintPRIO() { process*p=newprocess; doublesysTime=0;//记录系统时刻 doubleturn=0;//平均周转时刻 doubleturnw=0;//平均带权周转时刻 if(head==NULL) cout<<"没有进程调度! "< else { //先把最先到达的输出,然后再依照系统时刻和优先级判定后续的进程 head->starttime=head->arrivetime; head->endtime=head->arrivetime+head->needtime; head->state=1; systime=head->endtime; turn=turn+(head->endtime-head->arrivetime); turnw=turnw+(head->endtime-head->arrivetime)/head->needtime; //判定后面的 for(inti=0;i { p=head->next; while(p! =NULL) { changePRIO(doublesystime); //假如优先级最大的进程差不多到达,那么执行 if(p->arrivetime<=systime&&p->state==0) { p->starttime=systime; p->endtime=p->arrivetime+p->needtime; systime=p->endtime; p->state=1; turn=turn+(p->endtime-p->arrivetime); turnw=turnw+(p->endtime-p->arrivetime)/p->needtime; p=p->next; } elsep=p->next; } } } process*temp=head; cout.setf(ios: : left); cout< while(temp! =NULL) { cout< temp=temp->next; } cout<<"平均周转时刻: "< "< while(head->next! =NULL) { process*t=newprocess; t=head->next; head->next=t->next; deletet; } head=NULL; } 3.源程序的要紧部分 主程序要紧完成调用各个函数完成相应的功能,以及选择调度算法的输出提示,依照提示并完成相应的算法实现过程。 //程序要紧部分 intmain() { intchoice;//选择服务 intgo=1; while(go) { cout< cout<<"1.先来先服务算法"< cout<<"请选择: "; cin>>choice; switch(choice) { case1: FCFS();break;//调用先来先服务算法 case2: PRIO();break;//调用优先运算法 case3: cout<<"退出"< default: cout<<"选择有误,请重新输入选择! "< } } system("pause"); return0; } voidFCFS() { createFCFS(); printFCFS(); } voidPRIO() { createPRIO(); //changePRIO(); printPRIO(); } 4.程序测试 4.1先来先服务测试用例 进程序号 进程名称 到达时刻 执行时刻 1 a 0 4 2 b 1 3 3 c 2 2 4 d 3 3 4.2先来先服务运行结果 进程序号 进程名称 优先级 到达时刻 执行时刻 1 a 1 0 4 2 b 4 1 6 3 c 2 2 4 4 d 3 3 5 4.3先来先服务测试用例 4.4优先级算法运行结果 5.自我评判与总结 本次课程设计的内容差不多上是老师在课堂上所讲的,因此我依旧比较熟悉先来先服务算法和优先级算法。 看到那个题目时,我依旧感受相当轻松的,因为我依旧比较熟悉该内容,比较熟悉算法思想。 设计过程中要注意流程的条理清晰,易于读明白和规划,程序编写完成以后,实现了预期的成效,达到了设计的要求。 界面设计比较清晰明了,易于阅读和明白得。 本程序中,有些地点有重复,能够通过设计函数来简化程序,例如程序的创建,能够通过函数调用来实现,从而不必在两个算法中分别编写。 编写程序时要先画出程序的流程图是专门有必要的,依照流程图的顺序来实现程序,并要注意合理的使用函数调用来使程序得到简化,同时易读易明白。 编写程序的时候一定要先画流程图,对应流程图设计函数来简化程序。 这次课程设计中比较失败的地点确实是优先级算法的输出开始时刻和终止时刻出了点问题。 这次课程设计使得我受益匪浅,专门是对优先级调度分析方法有了更深的明白得和把握。 通过这次课程设计,我的编程能力又得到了进一步的提高,同时也培养了我的思维能力。 总的说来,这次课程设计不仅丰富了我的理论知识,也加强了我的动手能力,还锤炼了我的思维能力。 在实验程序编写和调试过程中我学会了专门多,也认识到了自己的不足,我还需要进一步的努力,以致取得更大的进步。 我需要的确实是要对自己有信心,脚踏实地,持之以恒,遇到困难时要平复摸索,勇敢面对,直到得出结果。 在实验设计过程中,我也养成了较好地适应,先有框架,然后跟着框架进展,最后确实是要注重细节,要做到严谨和缜密。 不可否认这种好适应让我受益无限,我也必须拥有它,以致我获得更多。 6.源程序 #include #include #include structprocess { charname[10];//进程名 intno;//进程序号 doublearrivetime;//进程达到时刻 doubleneedtime;//进程运行时刻 doublestarttime;//进程开始时刻 doubleendtime;//进程终止时刻 intstate;//进程状态 intpriority;//进程优先级 process*next; process*head=Null; intcount; }; voidFCFS(); voidPRIO(); voidcreateFCFS(); voidinsert(process*current); voidprintFCFS(); voidcreatePRIO(); voidchangePRIO(doublesystime); voidprintPRIO(); //程序要紧部分 intmain() { intch
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 进程 调度 模拟 设计 先来先 服务 优先