操作系统原理课程设计进程调度.doc

上传人:土8路 文档编号:10092028 上传时间:2021-04-18 格式:DOC 页数:30 大小:180.50KB
返回 下载 相关 举报
操作系统原理课程设计进程调度.doc_第1页
第1页 / 共30页
操作系统原理课程设计进程调度.doc_第2页
第2页 / 共30页
操作系统原理课程设计进程调度.doc_第3页
第3页 / 共30页
操作系统原理课程设计进程调度.doc_第4页
第4页 / 共30页
操作系统原理课程设计进程调度.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《操作系统原理课程设计进程调度.doc》由会员分享,可在线阅读,更多相关《操作系统原理课程设计进程调度.doc(30页珍藏版)》请在三一文库上搜索。

1、 操作系统原理课程设计 进程调度进程调度进程调度进程调度 院 系: 计算机科学技术学院 班 级: 计 07-2 班 姓 名: 指导教师: 2009 年 7 月 10 日 操作系统原理课程设计任务书操作系统原理课程设计任务书 一、题目:进程调度一、题目:进程调度 二、设计要求二、设计要求 (1)阚翀(组长) ,*组成课程设计小组。 (2)查阅相关资料,自学具体课题中涉及到的新知识。 (3)采用结构化、模块化程序设计方法,功能要完善,具有一定的创新。 (4)所设计的程序应有输入、输出。 (5)按要求写出课程设计报告,并于设计结束后 1 周内提交。其主要内容 包括:封皮、课程设计任务书,指导教师评语

2、与成绩、目录、概述、软件总体 设计、详细设计、软件的调试、总结、谢启、附录:带中文注释的程序清单、 参考文献。报告一律用 A4 纸打印,中文字体为宋体,西文字体用 Time New Roma,一律用小四号字,行距采用“固定值”18 磅,首行缩进 2 字符。总体设 计应配合软件总体模块结构图来说明软件应具有的功能。详细设计应用传统或 N-S 流程图和屏幕抓图说明,调试的叙述应配合出错场景的抓图来说明出现了 哪些错误,如何解决的。 三、课程设计工作量三、课程设计工作量 由于是设计小组团结协作完成设计任务,一般每人的程序量在 200 行有效 程序行左右,不得抄袭。 四、课程设计工作计划四、课程设计工

3、作计划 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 日下午,验收或总结。 指导教师签章: 教研室主任签章 操作系统原理课程设计指导教师评语与成绩 指导教师评语: 课程设计表现成绩: 课程设计验收成

4、绩: 课程设计报告成绩: 课程设计 总成绩: 指导教师签章 2009 年 7 月 10 日 目录目录 一一 概述概述 .1 二二 总体方案设计总体方案设计.2 三三 详细设计详细设计 .4 四四 程序的调试与运行结果说明程序的调试与运行结果说明 .7 五五 课程设计总结课程设计总结.10 六六 后记后记 .11 七七 附录附录 .12 八八 参考文献参考文献 .26 一一 概述概述 一、课程设计的目的。一、课程设计的目的。 1使学生更深入地理解和掌握该课程中的有关基本概念。 2培养学生综合运用所学知识独立完成课题的能力。 3培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验 理论,全

5、方位考虑问题等科学技术人员应具有的素质。 4提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的 基本素质。 5培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人 经验中找到解决问题的新途径的悟性。 6对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程 设计能力、书面及口头表达能力进行考核。 二、课程设计的要求。二、课程设计的要求。 (1)学生自由组成课程设计小组,建议每组最多不超过 3 个学生。 (2)选择课程设计题目中的一个课题,每组独立完成。 (3)查阅相关资料,自学具体课题中涉及到的新知识。 (4)采用结构化程序设计方法或面向对象程序设计方法进行设计,功能

6、要 完善,具有一定创新。 利用书本上的知识点,实现了进程调度。 三、程序的主要设计思想三、程序的主要设计思想。 在进行程序设计的时候,一开始要选择编写程序所用的语言以及开发环境,这 里,我选择的是 C 语言,使用的开发环境是 win-tc。 1)进一步掌握 C 或 c+语言集成开发环境。 2)设计一个模拟进程调度的算法。 3)理解进程控制块的结构 4)理解进程运行的并发性 5)掌握进程调度的三种基本方法:优先数调度算法,时间片轮转法调度算 法,先来先服务调度算法。 二二 总体方案设计总体方案设计 1.功能需求:功能需求: 在多道程序运行下,进程数目一般多于处理机数目,使得进程要通过竞争来 使用

7、处理机。这就要求系统要按照某种算法,动态地把处理机分配给就绪队列 中 的一个进程,使之运行,分配处理的任务是由进程调度完成的。一个进程被 创建后,系统为了便于对进程进行管理,将系统中的所有进程按其状态,将其 组织成不同的就绪队列。于是系统中由运行的进程队列,就绪队列,和各种事 件的进程等待队列。根据系统资源分配策略所规定资源分配算法。对于不同系 统和系统分配目标,通常采用不同的调度算法。 2.2.性能需求性能需求: 本软件应该实现以上功能,能够实现用优先数法,时间片轮转法和先来先服务 进程调度法来实现进程调度。使用开发工具 win-tc 或者是 vc+6.0。 该进程调度系统总体模块结构图如下

8、该进程调度系统总体模块结构图如下 进程调度 进程调度 安全登陆模块 优先数调度算法模块 时间片轮转法模块 先来先服务进程调度模块 三三 详细设计详细设计 先来先服务法流程图如下: 1. 先来先服务插入函数 insert3(PCB *q) r-next !=NULL r=ready r=r-next r-next =q q-next =NULL 2. 先来先服务创建进程 PCB 函数create3(char alg) i=1;iname,na) p-cputime=0;p-needtime=time p-state=W p-prio=50-time ready!=NULL Y N insert3

9、(p)p-next=ready ready=p printf(first come first serve informationnn) printf(*n) prt(alg) run=ready ready=ready-next run-state=f 输入进程数: 输入进程标题和所需时间: 进程运行过程: 最后结果: 返回登入界面: 四四 程序的调试与运行结果说明程序的调试与运行结果说明 我负责的模块是先来先服务算法,在编写程序和运行过程中,遇到很多困难 和调试错误。 先来先服务算法在调试过程中遇到的问题: 在编码过程中没有定义用到的代码。 编译成功但代码错误: 编码过程中缺少某个语句或未

10、对某种情况说明。 经过对程序的不断调试,运行成功。 输入密码: 进入登入界面: 输入进程数,进程标题和所需时间: 运行结果: 五五 课程设计总结课程设计总结 经过一周的坚持不懈的努力,终于完成了自己负责模块的任务,通过参考 函数库及其一些书籍及其百度搜索,对进程调度有了深刻的了解。 先来先服务算法:按照进度进入就绪队列的先后次序来分配处理器。先进 入就绪对列的进程优先呗挑选,运行进度一旦占有处理器将一直运行下去直到 运行结束或被阻塞,这是一种非剥夺式调度。 例如,有三个进程 P1、P2 和 P3 先后进入就绪队列,它们的执行期分别 是 21、6 和 3 个单位时间,执行情况如下 :对于 P1、

11、P2、P3 的周转时间为 21、27、30,平均周转时间为 26。可见,FIFO 算法服务质量不佳,容易引 起作业用户不满,常作为一种辅助调度算法。 经过一周的时间,我了解到调试是一项复杂而又细致的工作,在调试中不 断观察和思考,总结和积累经验。通过程序调试这环节,进一步提高一个人的 程序设计能力。编出一个程序最主要的是信心和耐心,有的时候自己找不到错 误,就想换个系统重新编辑,但是半途而废总是要花费更多的时间,不管结果 怎麽样,自己真的去努力了,会在今后的学习中不断积累经验和知识,从而去 解决现在解决不了的问题。 六六 后记后记 真诚的感谢在本次实验中帮助过我们的鲁静轩老师与同学们,正是由于

12、 在鲁老师与同学的帮助下,我才坚定信念,最终完成了实验,虽然程序做的 比较粗糙,但是我也真正的体会到了团结协作的重要意义,我们小组团结协 作当遇到困难的时候我们谁都没有泄气而是努力的去查资料找方法,我相信, 随着岁月的流逝,我将学到更多的知识与技巧,我承诺我无论是在以后的学 习还是工作中我都会认真努力的。到时候会更加理解操作系统的原理以及进 程调度的相关知识,对于进程调度的几个算法有了深刻的了解:高优先数进 程调度法,时间片轮转法,先来先服务的调度算法,相信随着知识的增加我 们会做出更加优秀的程序。 七七 附录附录 核心代码与部分注释: #include/*主函数包含的头文件*/ #inclu

13、de #include /*开辟空间的头文件*/ #include string.h #include typedef struct node char name10; /*进程标识符*/ int prio; /*进程优先数*/ int round; /*进程时间轮转时间片*/ int cputime; /*进程占用 CPU 时间*/ int needtime; /*进程到完成还要的时间*/ int count; /*计数器*/ char state; /*进程的状态*/ struct node *next; /*链指针*/ PCB; PCB *finish,*first,*ready,*ta

14、il,*run; /*队列指针*/ int N; /*进程数*/ /*将就绪队列中的第一个进程投入运行*/ firstin() run=ready; /*就绪队列头指针赋值给运行头指针*/ run-state=R; /*进程状态变为运行态*/ ready=ready-next; /*就绪对列头指针后移到下一进程*/ /*标题输出函数*/ void prt1(char a) if(toupper(a)=P) /*优先数法*/ printf( name cputime needtime priority staten); else if(toupper(a)=R) printf( name cpu

15、time needtime count round staten); else printf(name cputime needtime staten); /*进程 PCB 输出*/ void prt2(char a,PCB *q) if(toupper(a)=P) /*优先数法的输出*/ printf( %-10s%-10d%-10d%-10d %cn,q-name, q-cputime,q-needtime,q-prio,q-state); else/*轮转法的输出*/ if(toupper(a)=R) printf( %-10s%-10d%-10d%-10d%-10d %-cn,q-na

16、me, q-cputime,q-needtime,q-count,q-round,q-state); else printf(% -10s% -10d% -10d% -cn,q-name ,q-cputime ,q-needtime ,q-state ); /*输出函数*/ void prt(char algo) PCB *p; prt1(algo); /*输出标题*/ if(run!=NULL) /*如果运行指针不空*/ prt2(algo,run); /*输出当前正在运行的 PCB*/ p=ready; /*输出就绪队列 PCB*/ while(p!=NULL) prt2(algo,p);

17、 p=p-next; p=finish; /*输出完成队列的 PCB*/ while(p!=NULL) prt2(algo,p); p=p-next; /*把进程指针移到下个进程*/ getch(); /*压任意键继续*/ /*优先数的插入算法*/ insert1(PCB *q) PCB *p1,*s,*r; int b; s=q; /*待插入的 PCB 指针*/ p1=ready; /*就绪队列头指针*/ r=p1; /*r 做 p1 的前驱指针*/ b=1; while(p1!=NULL) p1=p1-next; else b=0; if(r!=p1) /*如果条件成立说明插入在 r 与

18、p1 之间*/ r-next=s; s-next=p1; else s-next=p1; /*否则插入在就绪队列的头*/ ready=s; /*优先数创建初始 PCB 信息*/ void create1(char alg) PCB *p; int i,time; char na10; ready=NULL; /*就绪队列头指针*/ finish=NULL; /*完成队列头指针*/ run=NULL; /*运行队列指针*/ printf(Enter name and time of processn); /*输入进程标识和所需时间创建 PCB*/ for(i=1;iname,na); p-cpu

19、time=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( output of priority:n); printf(*n); prt(alg); /*输出进程 PCB 信息*/ run=ready; /*将就绪队列的第一个进程投入运行*/ ready=ready-next; run-state=R; /*优先数调度算法*/ p

20、riority(char alg) 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) /*如就绪队列不空*/

21、 firstin(); /*将就绪对列的第一个进程投入运行*/ else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/ if(ready!=NULL) insert1(run); firstin(); /*将就绪队列的第一个进程投入运行*/ prt(alg); /*输出进程 PCB 信息*/ /*轮转法插入函数*/ insert2(PCB *p2) tail-next=p2; /*将新的 PCB 插入在当前就绪队列的尾*/ tail=p2; p2-next=NULL; /*轮转法创建进程 PCB*/ void create2(char alg) PCB *p; int

22、i,time; char na10; ready=NULL; finish=NULL; run=NULL; printf(Enter name and time of round processn); for(i=1;iname,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( outpu

23、t of roundn); printf(*n); prt(alg); /*输出进程 PCB 信息*/ run=ready; /*将就绪队列的第一个进程投入运行*/ ready=ready-next; run-state=R; /*时间片轮转法*/ roundrun(char alg) 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; fin

24、ish=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); /*输出进程信息*/ /*先来先服务插入函数*/ void insert3(P

25、CB *q) PCB *r; r=ready;/*就绪队列赋给进程 r*/ while(r-next !=NULL) r=r-next ; r-next =q; q-next =NULL; /*先来先服务创建进程 PCB*/ void create3(char alg) PCB *p; int i,time; char na10; ready=NULL; /*就绪队列头指针*/ finish=NULL; /*完成队列头指针*/ printf(please printf procss name and run time n); /*输入进程标识和所需时间创建 PCB*/ for(i=1;inam

26、e,na); p-cputime=0;p-needtime=time; p-state=W; if(ready!=NULL) /*如就绪队列不空*/ insert3(p); else p-next=ready; ready=p; printf(first come first serve informationnn); printf(*n); prt(alg); /*输出进程 PCB 信息*/ run=ready; /*将就绪队列的第一个进程投入运行*/ ready=ready-next; run-state=f; void FCFS(char alg) while (run!=NULL) /

27、*当运行队列不空时,有进程正在运行*/ 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 信息*/ void menu() char menustr= /*菜单*/ p

28、lease select process dispatch nn nr /*请选 择进程调度的算法 */ .nr 1. Priority process dispatchnnnr 2. time of round process dispatchnnnr 3.first come first serve process dispatch nn nr Q.Qiut nr .nr nr ; cprintf(menustr); void frame(int upperleftx, int upperlefty,int lowerrightx,int lowerrighty,int framcolor

29、,int backcolor) /*窗口边框*/ int i; const int upleft=201, /* or 218, 左上角,const:函数返回值做引用*/ horizonbar=205, /* or 196, 水平线,注解中数字为单线框*/ upright=187, /* or 191, 右上角*/ vertbar=120, /* or 179, 竖线 */ lowerleft=200, /* or 192, 左下角*/ lowright=187; /* or 196, 右下角*/ window(1,1,80,25); textcolor(framcolor); textbac

30、kground(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); gotoxy(upperleftx,lowerrighty); putc

31、h(lowerleft); for (i=(upperleftx+1);i=(lowerrightx-1);i+) putch(horizonbar); for (i=(upperleftx+1);i=(lowerrightx-1);i+) putch(lowright); void selectwindow(int windowno) /*置颜色和窗口*/ int x1,y1,x2,y2,charcolor,backcolor; switch(windowno) case 0:x1=1;y1=1;x2=80;y2=24; charcolor=BLACK,backcolor=YELLOW; b

32、reak; case 1:x1=1;y1=1;x2=80;y2=80; charcolor=LIGHTGREEN,backcolor=BLUE;break; case 2:x1=1;y1=1;x2=75;y2=80; charcolor=RED, backcolor=LIGHTGRAY;break; case 3:x1=1;y1=1;x2=60;y2=80; charcolor=MAGENTA, backcolor=BLACK; break; frame(x1,y1,x2,y2,WHITE,BLUE); /*边框*/ textcolor(charcolor); textbackground(b

33、ackcolor); window(x1+1,y1+1,x2-1,y2-1); /*框中设窗口*/ clrscr(); /*清窗口*/ void choosemenu(char *question,char *choice, char *defaultanswer) cprintf(%sdefault is %s,question,defaultanswer); cscanf(%c,choice); if (*choice=r)*choice=*defaultanswer; /*菜单选答,默认值*/ void subprogram1() /*示意性子程序 1*/ char algo=p; cp

34、rintf(Priority process dispatchnn); printf(n); cprintf(please printf the number of process:); scanf(%d, create1(algo); priority(algo); void subprogram2() /*示意性子程序 2*/ char algo=r; cprintf(nnnr, time of round process dispatch n); printf(n); cprintf(please printf the number of process:); scanf(%d, cre

35、ate2(algo); /*轮转法*/ roundrun(algo); void subprogram3() /*示意性子程序 3*/ char algo=f; cprintf(nr first come first serve process dispatch n); printf(n); cprintf(please printf the number of process:); scanf(%d, create3(algo); FCFS(algo) ; int password() char key80; int i=-1; textbackground(4); /*背景颜色 */ te

36、xtcolor(7); /* 文本颜色*/ gotoxy(25,13); /*位置的坐标,单位是像素 */ cprintf(n Please enter the password : ); for(i = 0;i 80; i+) keyi = getch(); if(keyi = r) keyi=0; break; if(keyi = b) printf(b b); else printf(*); if(strcmp(key,abcd)=0) return 1; else while(1) clrscr();/*清屏 */ textbackground(0); /*背景颜色 */ textco

37、lor(5); /* 文本颜色*/ gotoxy(15,12); /*位置的坐标,单位是像素 */ cprintf(n password is wrong! Please enter the password : ); for(i = 0;i 80; i+) keyi = getch(); if(keyi = r) keyi=0; break; if(keyi = b) printf(b b); else printf(*); if(strcmp(key,abcd)=0) return 1; void main() /*主函数*/ char *choice; int stop; int key

38、; /*定义 kout 判断密码是否为真*/ int password(char *s); /*声明 password 自定义函数*/ choice=(char*)malloc(2);/*开辟空间*/ clrscr();/*清屏*/ do key = password(abcd); clrscr(); if(key=0) printf(nPassword error!); if(key=1) printf(nnnnnnnnnnnttttWELLCOM!n); break;while(key!=1); do selectwindow(0); stop=0; menu(); /*显示菜单*/ ch

39、oosemenu(please select1-3,Q,choice,1); /*选择*/ switch(*choice) /*按选择分流*/ case 1:selectwindow(1); subprogram1(); break; case 2:selectwindow(2); subprogram2(); break; case 3:selectwindow(3); subprogram3(); break; caseq: case Q: stop=1;break; /*准备退出*/ while(!stop); /*检查退出条件*/ clrscr();/*清屏 */ cprintf(nnnntThank you for using goodbye!nr press .); getch(); 八八 参考文献参考文献 参考资料 1、清华大学出版张尧学计算机操作系统教程中实例以及的其“习题解答与 实验指导”中有关函数和设计范例。 2.清华大学出版任爱华操作系统实用教程中的实例设计。 3.科学出版社周苏操作系统原理实验中的实例设计。 4.计算机操作系统教程(第 2 版) 张尧学、史美林编著 清华大学出版社 5.操作系统习题与解析 曾平 、李春葆编著 清华大学出版社 6.操作系统系统教程(第 2 版)习题解答与实验指导 张尧学、史美林编著 清华大学出版社

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1