操作系统原理课程设计进程调度.doc
操作系统原理课程设计进程调度 院 系: 计算机科学技术学院 班 级: 计07-2班 姓 名: 指导教师: 2009年 7 月 10 日操作系统原理课程设计任务书一、题目:进程调度 二、设计要求(1)阚翀(组长),*组成课程设计小组。(2)查阅相关资料,自学具体课题中涉及到的新知识。(3)采用结构化、模块化程序设计方法,功能要完善,具有一定的创新。(4)所设计的程序应有输入、输出。(5)按要求写出课程设计报告,并于设计结束后1周内提交。其主要内容包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件总体设计、详细设计、软件的调试、总结、谢启、附录:带中文注释的程序清单、参考文献。报告一律用A4纸打印,中文字体为宋体,西文字体用Time New Roma,一律用小四号字,行距采用“固定值”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. 先来先服务插入函数insert3(PCB *q)r->next !=NULLr=readyr=r->nextr->next =q q->next =NULL 2. 先来先服务创建进程PCB函数create3(char alg)i=1;i<=N;i+ ready=NULL finish=NULL printf("please printf procss name and run time n") p=(PCB *)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 ready!=NULL Y Ninsert3(p)p->next=ready ready=p printf("first come first serve informationnn") printf("*n") prt(alg) run=ready ready=ready->next run->state='f'输入进程数:输入进程标题和所需时间:进程运行过程:最后结果:返回登入界面:四 程序的调试与运行结果说明 我负责的模块是先来先服务算法,在编写程序和运行过程中,遇到很多困难和调试错误。先来先服务算法在调试过程中遇到的问题:在编码过程中没有定义用到的代码。编译成功但代码错误:编码过程中缺少某个语句或未对某种情况说明。经过对程序的不断调试,运行成功。输入密码:进入登入界面:输入进程数,进程标题和所需时间:运行结果:五 课程设计总结经过一周的坚持不懈的努力,终于完成了自己负责模块的任务,通过参考函数库及其一些书籍及其百度搜索,对进程调度有了深刻的了解。 先来先服务算法:按照进度进入就绪队列的先后次序来分配处理器。先进入就绪对列的进程优先呗挑选,运行进度一旦占有处理器将一直运行下去直到运行结束或被阻塞,这是一种非剥夺式调度。 例如,有三个进程P1、P2和P3先后进入就绪队列,它们的执行期分别是21、6和3个单位时间,执行情况如下:对于P1、P2、P3的周转时间为21、27、30,平均周转时间为26。可见,FIFO算法服务质量不佳,容易引起作业用户不满,常作为一种辅助调度算法。经过一周的时间,我了解到调试是一项复杂而又细致的工作,在调试中不断观察和思考,总结和积累经验。通过程序调试这环节,进一步提高一个人的程序设计能力。编出一个程序最主要的是信心和耐心,有的时候自己找不到错误,就想换个系统重新编辑,但是半途而废总是要花费更多的时间,不管结果怎麽样,自己真的去努力了,会在今后的学习中不断积累经验和知识,从而去解决现在解决不了的问题。 六 后记真诚的感谢在本次实验中帮助过我们的鲁静轩老师与同学们,正是由于在鲁老师与同学的帮助下,我才坚定信念,最终完成了实验,虽然程序做的比较粗糙,但是我也真正的体会到了团结协作的重要意义,我们小组团结协作当遇到困难的时候我们谁都没有泄气而是努力的去查资料找方法,我相信,随着岁月的流逝,我将学到更多的知识与技巧,我承诺我无论是在以后的学习还是工作中我都会认真努力的。到时候会更加理解操作系统的原理以及进程调度的相关知识,对于进程调度的几个算法有了深刻的了解:高优先数进程调度法,时间片轮转法,先来先服务的调度算法,相信随着知识的增加我们会做出更加优秀的程序。七 附录核心代码与部分注释:#include<stdio.h>/*主函数包含的头文件*/#include <conio.h>#include <alloc.h>/*开辟空间的头文件*/#include "string.h"#include <process.h>typedef struct nodechar name10; /*进程标识符*/int prio; /*进程优先数*/int round; /*进程时间轮转时间片*/int cputime; /*进程占用CPU时间*/int needtime; /*进程到完成还要的时间*/int count; /*计数器*/char state; /*进程的状态*/struct node *next; /*链指针*/PCB;PCB *finish,*first,*ready,*tail,*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 cputime 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->name,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);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)&&b) /*根据优先数确定插入位置*/if(p1->prio>=s->prio)r=p1;p1=p1->next;elseb=0;if(r!=p1) /*如果条件成立说明插入在r与p1之间*/r->next=s;s->next=p1;elses->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;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);elsep->next=ready; /*创建就绪队列的第一个PCB*/ready=p;clrscr();printf(" output of priority:n");printf("*n");prt(alg); /*输出进程PCB信息*/run=ready; /*将就绪队列的第一个进程投入运行*/ready=ready->next;run->state='R'/*优先数调度算法*/priority(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) /*如就绪队列不空*/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*/void create2(char alg)PCB *p;int i,time;char na10;ready=NULL;finish=NULL;run=NULL;printf("Enter name and time of round processn");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); /*把进程插入就绪队列*/elsep->next=ready;ready=p;tail=p;clrscr();printf(" output 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;finish=run;run->state='F'run=NULL;if(ready!=NULL)firstin(); /*就绪对列不空,将第一个进程投入运行*/elseif(run->count=run->round) /*如果时间片到*/run->count=0; /*计数器置0*/if(ready!=NULL) /*如就绪队列不空*/run->state='W' /*将进程插入到就绪队列中等待轮转*/insert2(run);firstin(); /*将就绪对列的第一个进程投入运行*/ prt(alg); /*输出进程信息*/*先来先服务插入函数*/void insert3(PCB *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;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("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) /*当运行队列不空时,有进程正在运行*/ 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= /*菜单*/ " please 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,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);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); gotoxy(upperleftx,lowerrighty);putch(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; break; 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(backcolor);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'cprintf("Priority process dispatchnn");printf("n");cprintf("please printf the number of process:"); scanf("%d",&N); 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",&N); create2(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",&N); create3(algo); FCFS(algo) ;int password() char key80; int i=-1; textbackground(4); /*背景颜色 */ textcolor(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); /*背景颜色 */ textcolor(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");