1、操作系统 磁盘调度成绩 课程设计报告 题 目 进程调度 课 程 名 称 操作系统课程设计 院 部 名 称 信息技术学院 专 业 10计算机科学与技术 班 级 10计算机科学与技术单 学 生 姓 名 龚 校 丹 学 号 1005202013 课程设计地点 1318 课程设计学时 20 指 导 教 师 李 莉 金陵科技学院教务处制 目录一、课程设计的目的和要求 311课程设计的目的 312课程设计的要求 3二、系统需求分析 3三、概要设计 331系统功能流程图 332主函数与各子函数之间的关系图 4四、详细设计 541数据结构 542 各功能模块分析 5421 sort()函数功能的分析与设计 5
2、422 check()函数功能的分析与设计 6423 disp()函数功能分析与设计 7五、调试与运行 851运行过程描述 852输入进程信息 853显示运行结果 954遇到问题 10六、结论与体会 10七、参考文献 10附件 11一、课程设计的目的和要求11课程设计的目的进程调度是处理机管理的核心内容。本设计要求用C语言编写和调试一个简单的进程调度程序。通过设计本可以加深理解有关进程控制块、进程队列的概念,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法的具体实施办法。12课程设计的要求(1)进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给
3、优先数最高的进程)和先来先服务算法。 (2)每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。 (3)进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。 进程的运行时间以时间片为单位进行计算。 (4)每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。 (5)就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。(6)每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,
4、以便进行检查。 (7)重复以上过程,直到所要进程都完成为止。二、系统需求分析在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程的个数大于处理器数时,就必须依照某种策略决定哪些进程优先占用处理器。本课设模拟在单处理器情况下的处理器调度,加深了解处理器调度的工作。进程是在自身的虚拟地址空间运行的一个单独的程序。进程与程序是有区别的,虽然它由程序产生。程序只是一个静态的指令集合,不占系统的运行资源;而进程是一个随时都可能发生变化的、动态的、使用系统运行资源的程序。而且一个程序可以启动多个进程。进程是程序执行时的一个实例,从用户的观点来看,进程的目的是担当分配系统资源(CPU 时
5、间,存储器等)的实体。进程调度算法用于确定就绪队列中的哪一个进程即将获得CPU。该优先级调度算法为:每一个进程确定一个优先数,进程就绪队列按照优先数排序。根据优先级的顺序模拟执行进程,时间片减一,优先级减一,在进行第二次排序运行。三、概要设计31系统功能流程图下图是根据实验要求以及进程调度程序的功能,画出的程序设计流程图。把3个进程按给定的优先数从大到小连成队列。用一单元指出队首进程。处理器调度总是先对首进程运行。采用动态改变优先数的办法,进程每运行一次,则:优先数-1 要求运行时间-1进程运行完一次后,若要求运行时间不等于0,则要求将它加入队列(按优先数大小插入,且置队首标志);若要求运行时
6、间等于0,则它的状态修改为“结束”,且退出队列。进程调度系统流程图32主函数与各子函数之间的关系图运用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程),设计一个有3个进程共行的进程调度程序。每个进程有一个进程控制块( PCB)表示;每个进程的状态可以是两种状态之一;就绪进程获得 CPU后都只能运行一个时间片;每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查;重复以上过程,直到所要进程都完成为止。下图为函数调用图: 各子函数功能介绍:1)sort()函数: 进程按优先级从大到小排序。读取PCB进程控制块信息,判断它是否为优先级最大者,如果是,则插入
7、队首,如果不是最大,则进行优先级比较, 插入适当位置。结束本次函数调用。2)input()函数功能:建立进程控制块。然后调用sort函数。要求输入以下信息:1.需要输入模拟运行进程数。2.各进程的信息,进程名,进程优先级,进程运行时间。3)disp()函数功能:用于显示当前进程。因为进程有执行和就绪状态,所以各个函数显示信息不一样,所以用if语句判断。4)check()函数功能:查看当前进程以及就绪队列状态,调用disp()函数显示。5)destroy()函数功能:显示撤消进程的进程名字。6)running()函数功能:进程运行时间到,置就绪状态。中间有个判断语句,如果需要的时间和运行的时间相
8、等,则调用destroy函数显示撤销进程。否则将当前进程的优先级减一,并调用sort函数排序。四、详细设计 41数据结构 进程名Pcb指针要求运行时间优先数状态假定系统有3个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式图。 进程名:作为进程的标识,假设五个进程的进程名分别为A,B,C。PCB指针:按优先数的大小把3个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“NULL”。要求运行时间:假设进程需要运行的单位时间数。优先数:赋予进程的优先数,调度时总是选取优先数大的进程先执行。状态:可假设有2种状态,“就绪”状态“执行”状态 。3个进程的初始
9、状态都为“就绪”状态,用“R”表示,“执行”状态用“W”表示。42 各功能模块分析421 sort()函数功能的分析与设计1)功能分析本程序主要是sort()函数的流程图,sort()函数主要是一个建立对进程进行优先级排列函数,通过对当前读取的进程优先级与之前的进程的比较,从而判断出下一个该执行的进程号以及进程队列。2)功能模块图根据对该函数的功能的分析,该功能模块图如下图所示:422 check()函数功能的分析与设计1)功能分析Check ()函数主要是查看并显示当前进程以及就绪队列状态。具体如下:先显示当前的进程,调用disp()函数,然后判断指针是否为空,为空则结束该函数调用,不为空则
10、显示就绪队列,调用disp()函数实现。2)功能模块图根据对该函数的功能的分析,该功能模块图如下图所示:423 disp()函数功能分析与设计1)功能分析:该函数主要是用来显示当前正在运行的进程和就绪状态的进程,当进程块正在运行,disp()函数通过被check()函数调用来显示当前运行进程的相关信息,要是进程不在运行,即在就绪状态也可调用disp()函数显示进程信息。2)功能模块图:根据对该函数的功能的分析,该功能模块图如下图所示:五、调试与运行51运行过程描述1)输入你要模拟运行的进程数,初始化进程PCB。2)输入PCB的信息,包括进程名,优先级,需要运行时间。3)将PCB表中的各项按从前
11、到后的顺序加入至就绪队列中。4)主摸拟过程: while(就绪队列不为空|runProcess不为空) 延时 If(runProcess不为空) 输出当前活动进程的各属性值(如进程名,优先值,需要运行时间) 将当前活动进程的优先值加1,剩余运行时间减1. If(当前进程的剩余运行时间为0) 当前进程状态置1,并加至结束队列中. 更新PCB表中的内容. else if(就绪队列不为空)/为空时就剩下一个进程,无需再加入队列 当前进程状况置为准备状态 根据动态优先数将当前的进程插入到就绪队列的适当的位置更新PCB表. If(runProcess不为空&runProcess-remainSecs=0
12、)/处理只剩下最后一个进程且剩余运行时间0的情况 置 runProcess为NULL. if(就绪队列不为空) 从就绪队列中弹出一个进程给runProcess 置runProcess的状态为运行态. 更新PCB表 52输入进程信息此阶段主要是初始化进程,初始提示如下图:我输入了3,代表我将模拟三个进程调度,然后是输入各个进程的信息。每一次进程都要输入它的名字,优先级以及运行时间,进程名作为进程的标识,3个进程的进程名分别为A,B,C,优先级分别是1,2,3,它们的运行时间是1,2,3。指针按优先数的大小把3个进程连成队列,用指针值初下一个进程的进程控制块的首地址,最后一个进程的指针为“0”。当
13、前运行结果如下 53显示运行结果此图是通过disp函数来显示进程,首先显示运行的次数,接着显示工作正在运行的进程的相关信息,然后显示就绪状态的进程信息,每次一个进程运行完成屏幕会显示“进程?运行结束”。当全部运行完成时,屏幕显示“并发进程模拟调度结束”。 54遇到问题在调试过程中让我们输入进程相关信息时,我把进程的运行时间写的比优先级大,优先级每次减1,最后会成为负数,经过几次实践证明,我发现该进程虽然可以运行,但是不够具有代表性,所以我将所有的运行时间同进程的优先级,最后优先级减下来的结果为0,满足当前系统要求。在刚开始创建进程时,我用了fock()函数来真实创建进程,一直累加,导致进程创建
14、进入死循环,系统崩溃了。六、结论与体会本次实验主要是对进程利用C语言编写程序代码,然后进行上机调试、修改、进行连接,测试,VC不支持mallac函数,不能运行该程序,所以,我下载了个dev_c+,来运行该程序。而且,在编程时一定要细心,不要忘了定义使用的值,一些累加的要设置初值,否则信息出错。通过本次实验对进程的调试,我对课本上有关进程的知识进一步加深了理解,而且也知道了进程该如何运行,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)的具体实施办法。七、参考文献1、计算机操作系统 汤子赢等编著,西安电子科技大学出版社2、操作系统实验教程 张丽芬等编著,清华大学出版社 2
15、006年附件 进程调度系统源程序清单#include stdio.h#include #include #define getpch(type) (type*)malloc(sizeof(type)struct pcb /* 定义进程控制块PCB */char name10;char state;int super;int ntime;int rtime;struct pcb* link;*ready=NULL,*p;typedef struct pcb PCB;int system(const char *string); sort() /* 建立对进程进行优先级排列函数*/PCB *fir
16、st, *second;int insert=0;if(ready=NULL)|(p-super)(ready-super) /*优先级最大者,插入队首*/p-link=ready;ready=p;else /* 进程比较优先级,插入适当的位置中*/first=ready;second=first-link;while(second!=NULL)if(p-super)(second-super) /*若插入进程比当前进程优先数大,*/ /*插入到当前进程前面*/p-link=second;first-link=p;second=NULL;insert=1;Else /* 插入进程优先数最低,则
17、插入到队尾*/first=first-link;second=second-link;if(insert=0) first-link=p;input() /* 建立进程控制块函数*/int i,num;printf(请输入并发的进程数目(09);scanf(t %d,&num);printf(n 请输入进程相关信息n);for(i=1;iname);printf(n 进程优先级:);scanf(%d,&p-super);printf(n 进程运行时间:);scanf(%d,&p-ntime);printf(n);p-rtime=0;p-state=w;p-link=NULL;sort(); /
18、* 调用sort函数*/int space()int l=0; PCB* pr=ready;while(pr!=NULL)l+;pr=pr-link;return(l);disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/if(pr-state=R)printf(n 进程名 进程状态 进程优先级 进程需要时间 进程已运行时间 n);printf( %st ,pr-name);printf(%ct ,pr-state);printf(%dt ,pr-super-1);printf(%dt ,pr-ntime);printf(%dt n,pr-rtime+1);elseprin
19、tf(n 进程名 进程状态 进程优先级 进程需要时间 进程已运行时间 n);printf( %st ,pr-name);printf(%ct ,pr-state);printf(%dt ,pr-super);printf(%dt ,pr-ntime);printf(%dt ,pr-rtime);check() /* 建立进程查看函数 */PCB* pr;printf(n * 当前正在运行的进程为:%s,p-name); /*显示当前运行进程*/disp(p);pr=ready;printf(n *就绪队列状态为 :n); /*显示就绪队列状态*/while(pr!=NULL)disp(pr);
20、pr=pr-link;destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/printf(n 进程%s运行结束. ,p-name);free(p);running() /* 建立进程就绪函数(运行时间到,置就绪状态*/(p-rtime)+;if(p-rtime=p-ntime)destroy(); /* 调用destroy函数*/else(p-super)-;p-state=w;sort(); /*调用sort函数*/main() /*主函数*/int len,h=0;char ch;input();len=space();while(len!=0)&(ready!=NULL)ch=getchar();h+;printf(n 运行次数为:%d n,h);p=ready;ready=p-link;p-link=NULL;p-state=R;check();running();printf(n 请按任意键进入下次运行过程);ch=getchar();printf(n并发进程优先级调度模拟结束n);ch=getchar();