操作系统进程调度.docx
- 文档编号:30212406
- 上传时间:2023-08-07
- 格式:DOCX
- 页数:32
- 大小:139.26KB
操作系统进程调度.docx
《操作系统进程调度.docx》由会员分享,可在线阅读,更多相关《操作系统进程调度.docx(32页珍藏版)》请在冰豆网上搜索。
操作系统进程调度
操作系统原理课程设计
进程调度
院系:
计算机学院计理07-2班
班级:
计理07-2班
姓名:
阚翀
指导教师:
鲁静轩
2009年7月10日
操作系统原理课程设计任务书
一、题目:
进程调度
二、设计要求
(1)阚翀、潘亮组成课程设计小组。
(2)查阅相关资料,自学具体课题中涉及到的新知识。
(3)采用结构化、模块化程序设计方法,功能要完善,具有一定的创新。
(4)所设计的程序应有输入、输出。
(5)按要求写出课程设计报告,并于设计结束后1周内提交。
其主要内容包括:
封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件总体设计、详细设计、软件的调试、总结、谢启、附录:
带中文注释的程序清单、参考文献。
报告一律用A4纸打印,中文字体为宋体,西文字体用TimeNewRoma,一律用小四号字,行距采用“固定值”18磅,首行缩进2字符。
总体设计应配合软件总体模块结构图来说明软件应具有的功能。
详细设计应用传统或N-S流程图和屏幕抓图说明,调试的叙述应配合出错场景的抓图来说明出现了哪些错误,如何解决的。
三、课程设计工作量
由于是设计小组团结协作完成设计任务,一般每人的程序量在200行有效程序行左右,不得抄袭。
四、课程设计工作计划
2009年6月18日,指导教师讲课,学生根据题目准备资料;
2009年6月19日,进行总体方案设计;
2009年6月20日~2009年6月25日,完成程序模块并通过独立编译;
2009年6月26日~2009年6月27日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行;
2009年6月27日~2009年6月29日,验收、撰写报告;
2009年6月29日下午,验收或总结。
指导教师签章:
教研室主任签章
操作系统原理课程设计指导教师评语与成绩
指导教师评语:
课程设计表现成绩:
课程设计验收成绩:
课程设计报告成绩:
课程设计总成绩:
指导教师签章
2009年7月10日
目录
一概述1
二总体方案设计2
三详细设计4
四程序的调试与运行结果说明7
五课程设计总结10
六后记11
七附录12
八参考文献26
一概述
一、课程设计的目的。
1.使学生更深入地理解和掌握该课程中的有关基本概念。
2.培养学生综合运用所学知识独立完成课题的能力。
3.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
4.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。
5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性。
6.对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。
二、课程设计的要求。
(1)学生自由组成课程设计小组,建议每组最多不超过3个学生。
(2)选择课程设计题目中的一个课题,每组独立完成。
(3)查阅相关资料,自学具体课题中涉及到的新知识。
(4)采用结构化程序设计方法或面向对象程序设计方法进行设计,功能要完善,具有一定创新。
利用书本上的知识点,实现了进程调度。
三、程序的主要设计思想。
在进行程序设计的时候,一开始要选择编写程序所用的语言以及开发环境,这里,我选择的是C语言,使用的开发环境是win-tc。
1)进一步掌握C或c++语言集成开发环境。
2)设计一个模拟进程调度的算法。
3)理解进程控制块的结构
4)理解进程运行的并发性
5)掌握进程调度的三种基本方法:
优先数调度算法,时间片轮转法调度算法,先来先服务调度算法。
二总体方案设计
1.功能需求:
在多道程序运行下,进程数目一般多于处理机数目,使得进程要通过竞争来使用处理机。
这就要求系统要按照某种算法,动态地把处理机分配给就绪队列中的一个进程,使之运行,分配处理的任务是由进程调度完成的。
一个进程被创建后,系统为了便于对进程进行管理,将系统中的所有进程按其状态,将其组织成不同的就绪队列。
于是系统中由运行的进程队列,就绪队列,和各种事件的进程等待队列。
根据系统资源分配策略所规定资源分配算法。
对于不同系统和系统分配目标,通常采用不同的调度算法。
2.性能需求:
本软件应该实现以上功能,能够实现用优先数法,时间片轮转法和先来先服务进程调度法来实现进程调度。
使用开发工具win-tc或者是vc++6.0。
该进程调度系统总体模块结构图如下
进程调度
进程调度
安全登陆模块
优先数调度算法模块
先来先服务进程调度模块
时间片轮转法模块
三详细设计
先来先服务法流程图如下:
1.时间片轮转插入函数insert2(PCB*p2)
tail->next=p2
tail=p2
p2->next=NULL
2.轮转法创建进程PCBcreate2(charalg)
输入进程数:
输入进程标题和所需时间:
进程运行过程:
最后结果:
返回登入界面:
四程序的调试与运行结果说明
我负责的模块是先来先服务算法,在编写程序和运行过程中,遇到很多困难和调试错误。
先来先服务算法在调试过程中遇到的问题:
在编码过程中没有定义用到的代码。
编译成功但代码错误:
编码过程中缺少某个语句或未对某种情况说明。
经过对程序的不断调试,运行成功。
输入密码:
进入登入界面:
输入进程数,进程标题和所需时间:
运行结果:
五课程设计总结
经过2周的坚持不懈的努力,终于完成了自己负责模块的任务,通过参考函数库及其一些书籍及其XX搜索,对进程调度有了深刻的了解。
先来先服务算法:
按照进度进入就绪队列的先后次序来分配处理器。
先进入就绪对列的进程优先呗挑选,运行进度一旦占有处理器将一直运行下去直到运行结束或被阻塞,这是一种非剥夺式调度。
例如,有三个进程P1、P2和P3先后进入就绪队列,它们的执行期分别是21、6和3个单位时间,执行情况如下:
对于P1、P2、P3的周转时间为21、27、30,平均周转时间为26。
可见,FIFO算法服务质量不佳,容易引起作业用户不满,常作为一种辅助调度算法。
经过2周的时间,我了解到调试是一项复杂而又细致的工作,在调试中不断观察和思考,总结和积累经验。
通过程序调试这环节,进一步提高一个人的程序设计能力。
编出一个程序最主要的是信心和耐心,有的时候自己找不到错误,就想换个系统重新编辑,但是半途而废总是要花费更多的时间,不管结果怎麽样,自己真的去努力了,会在今后的学习中不断积累经验和知识,从而去解决现在解决不了的问题。
六后记
真诚的感谢在本次实验中帮助过我们的胡老师与同学们,正是由于在老师与同学的帮助下,我才坚定信念,最终完成了实验,虽然程序做的比较粗糙,但是我也真正的体会到了团结协作的重要意义,我们小组团结协作当遇到困难的时候我们谁都没有泄气而是努力的去查资料找方法,我相信,随着岁月的流逝,我将学到更多的知识与技巧,我承诺我无论是在以后的学习还是工作中我都会认真努力的。
到时候会更加理解操作系统的原理以及进程调度的相关知识,对于进程调度的几个算法有了深刻的了解:
高优先数进程调度法,时间片轮转法,先来先服务的调度算法,相信随着知识的增加我们会做出更加优秀的程序。
七附录
核心代码与部分注释:
#include
#include
#include
#include"string.h"
#include
typedefstructnode
{
charname[10];/*进程标识符*/
intprio;/*进程优先数*/
intround;/*进程时间轮转时间片*/
intcputime;/*进程占用CPU时间*/
intneedtime;/*进程到完成还要的时间*/
intcount;/*计数器*/
charstate;/*进程的状态*/
structnode*next;/*链指针*/
}PCB;
PCB*finish,*first,*ready,*tail,*run;/*队列指针*/
intN;/*进程数*/
/*将就绪队列中的第一个进程投入运行*/
firstin()
{
run=ready;/*就绪队列头指针赋值给运行头指针*/
run->state='R';/*进程状态变为运行态*/
ready=ready->next;/*就绪对列头指针后移到下一进程*/
}
/*标题输出函数*/
voidprt1(chara)
{
if(toupper(a)=='P')/*优先数法*/
printf("namecputimeneedtimeprioritystate\n");
elseif(toupper(a)=='R')
printf("namecputimeneedtimecountroundstate\n");
else
printf("namecputimeneedtimestate\n");
}
/*进程PCB输出*/
voidprt2(chara,PCB*q)
{
if(toupper(a)=='P')/*优先数法的输出*/
printf("%-10s%-10d%-10d%-10d%c\n",q->name,
q->cputime,q->needtime,q->prio,q->state);
else/*轮转法的输出*/
if(toupper(a)=='R')
printf("%-10s%-10d%-10d%-10d%-10d%-c\n",q->name,
q->cputime,q->needtime,q->count,q->round,q->state);
else
printf("%-10s%-10d%-10d%-c\n",q->name,q->cputime,q->needtime,q->state);
}
/*输出函数*/
voidprt(charalgo)
{
PCB*p;
prt1(algo);/*输出标题*/
if(run!
=NULL)/*如果运行指针不空*/
prt2(algo,run);/*输出当前正在运行的PCB*/
p=ready;/*输出就绪队列PCB*/
while(p!
=NULL)
{
prt2(algo,p);
p=p->next;
}
p=finish;/*输出完成队列的PCB*/
while(p!
=NULL)
{
prt2(algo,p);
p=p->next;/*把进程指针移到下个进程*/
}
getch();/*压任意键继续*/
}
/*优先数的插入算法*/
insert1(PCB*q)
{
PCB*p1,*s,*r;
intb;
s=q;/*待插入的PCB指针*/
p1=ready;/*就绪队列头指针*/
r=p1;/*r做p1的前驱指针*/
b=1;
while((p1!
=NULL)&&b)/*根据优先数确定插入位置*/
if(p1->prio>=s->prio)
{
r=p1;
p1=p1->next;
}
else
b=0;
if(r!
=p1)/*如果条件成立说明插入在r与p1之间*/
{
r->next=s;
s->next=p1;
}
else
{
s->next=p1;/*否则插入在就绪队列的头*/
ready=s;
}
}
/*优先数创建初始PCB信息*/
voidcreate1(charalg)
{
PCB*p;
inti,time;
charna[10];
ready=NULL;/*就绪队列头指针*/
finish=NULL;/*完成队列头指针*/
run=NULL;/*运行队列指针*/
printf("Enternameandtimeofprocess\n");/*输入进程标识和所需时间创建PCB*/
for(i=1;i<=N;i++)
{
p=malloc(sizeof(PCB));
scanf("%s",na);
scanf("%d",&time);
strcpy(p->name,na);
p->cputime=0;
p->needtime=time;
p->state='w';
p->prio=50-time;
if(ready!
=NULL)/*就绪队列不空调用插入函数插入*/
insert1(p);
else
{
p->next=ready;/*创建就绪队列的第一个PCB*/
ready=p;
}
}
clrscr();
printf("outputofpriority:
\n");
printf("************************************************\n");
prt(alg);/*输出进程PCB信息*/
run=ready;/*将就绪队列的第一个进程投入运行*/
ready=ready->next;
run->state='R';
}
/*优先数调度算法*/
priority(charalg)
{
while(run!
=NULL)/*当运行队列不空时,有进程正在运行*/
{
run->cputime=run->cputime+1;
run->needtime=run->needtime-1;
run->prio=run->prio-3;/*每运行一次优先数降低3个单位*/
if(run->needtime==0)/*如所需时间为0将其插入完成队列*/
{
run->next=finish;
finish=run;
run->state='F';/*置状态为完成态*/
run=NULL;/*运行队列头指针为空*/
if(ready!
=NULL)/*如就绪队列不空*/
firstin();/*将就绪对列的第一个进程投入运行*/
}
else/*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
if((ready!
=NULL)&&(run->prio))
{
run->state='W';
insert1(run);
firstin();/*将就绪队列的第一个进程投入运行*/
}
prt(alg);/*输出进程PCB信息*/
}
}
/*轮转法插入函数*/
insert2(PCB*p2)
{
tail->next=p2;/*将新的PCB插入在当前就绪队列的尾*/
tail=p2;
p2->next=NULL;
}
/*轮转法创建进程PCB*/
voidcreate2(charalg)
{
PCB*p;
inti,time;
charna[10];
ready=NULL;
finish=NULL;
run=NULL;
printf("Enternameandtimeofroundprocess\n");
for(i=1;i<=N;i++)
{
p=malloc(sizeof(PCB));
scanf("%s",na);
scanf("%d",&time);
strcpy(p->name,na);
p->cputime=0;
p->needtime=time;
p->count=0;/*计数器*/
p->state='w';
p->round=2;/*时间片*/
if(ready!
=NULL)
insert2(p);/*把进程插入就绪队列*/
else
{
p->next=ready;
ready=p;
tail=p;
}
}
clrscr();
printf("outputofround\n");
printf("************************************************\n");
prt(alg);/*输出进程PCB信息*/
run=ready;/*将就绪队列的第一个进程投入运行*/
ready=ready->next;
run->state='R';
}
/*时间片轮转法*/
roundrun(charalg)
{
while(run!
=NULL)
{
run->cputime=run->cputime+1;
run->needtime=run->needtime-1;
run->count=run->count+1;
if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/
{
run->next=finish;
finish=run;
run->state='F';
run=NULL;
if(ready!
=NULL)
firstin();/*就绪对列不空,将第一个进程投入运行*/
}
else
if(run->count==run->round)/*如果时间片到*/
{
run->count=0;/*计数器置0*/
if(ready!
=NULL)/*如就绪队列不空*/
{
run->state='W';/*将进程插入到就绪队列中等待轮转*/
insert2(run);
firstin();/*将就绪对列的第一个进程投入运行*/
}
}
prt(alg);/*输出进程信息*/
}
}
/*先来先服务插入函数*/
voidinsert3(PCB*q)
{
PCB*r;
r=ready;/*就绪队列赋给进程r*/
while(r->next!
=NULL)
{
r=r->next;
}
r->next=q;
q->next=NULL;
}
/*先来先服务创建进程PCB*/
voidcreate3(charalg)
{
PCB*p;
inti,time;
charna[10];
ready=NULL;/*就绪队列头指针*/
finish=NULL;/*完成队列头指针*/
printf("pleaseprintfprocssnameandruntime\n");
/*输入进程标识和所需时间创建PCB*/
for(i=1;i<=N;i++)
{
p=(PCB*)malloc(sizeof(PCB));
scanf("%s",na);
scanf("%d",&time);
strcpy(p->name,na);
p->cputime=0;p->needtime=time;
p->state='W';
if(ready!
=NULL)/*如就绪队列不空*/
insert3(p);
else
{
p->next=ready;
ready=p;
}
}
printf("firstcomefirstserveinformation\n\n");
printf("*********************************\n");
prt(alg);/*输出进程PCB信息*/
run=ready;/*将就绪队列的第一个进程投入运行*/
ready=ready->next;
run->state='f';
}
voidFCFS(charalg)
{
while(run!
=NULL)/*当运行队列不空时,有进程正在运行*/
{
run->cputime=run->needtime;
run->needtime=0;
if(run->needtime==0)/*如所需时间为0将其插入完成队列*/
{
run->next=finish;
finish=run;
run->state='F';/*置状态为完成态*/
run=NULL;/*运行队列头指针为空*/
if(ready!
=NULL)/*如就绪队列不空*/
firstin();/*将就绪对列的第一个进程投入运行*/
}
prt(alg);/*输出进程PCB信息*/
}
}
voidmenu()
{charmenustr[]=/*菜单*/
"pleaseselectprocessdispatch\n\n\n\r"/*请选择进程调度的算法*/
"............................................\n\r"
"1.Priorityprocessdispatch\n\n\n\r"
"2.timeofroundprocessdispatch\n\n\n\r"
"3.firstcomefirstserveprocessdispatch\n\n\n\r"
"Q.Qiut\n\r"
"............................................\n\r"
"\n\r";
cprintf(menustr);
}
voidframe(intupperleftx,intupperlefty,intlowerrightx,intlowerrighty,intframcolor,intbackcolor)/*窗口边框*/
{inti;
constintupleft=201,/*or218,左上角,const:
函数返回值做引用*/
horizonbar=205,/*or196,水平线,注解中数字为单线框*/
upright=187,/*or191,右上角*/
vertbar=120,/*or179,竖线*/
lowerleft=200,/*or192,左下角*/
lowright=187;/*or196,右下角*/
window(1,1,80,25);
textcolor(framcolor);
textbackground(backcolor);
gotoxy(upperleftx,upperlefty);
putch(upleft);
for(i=upperleftx+1;i<=(lowerrightx-1);i++)
putch(horizonbar);
putch(upright);
for(i=(upperlefty+1);i<=(lowerrighty-1);i++)
{gotoxy(upperleftx,i);
putch(vertbar);
gotoxy(lowerrightx,i);putch(vertbar);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 进程 调度