进程调度程序设计报告.docx
《进程调度程序设计报告.docx》由会员分享,可在线阅读,更多相关《进程调度程序设计报告.docx(25页珍藏版)》请在冰豆网上搜索。
进程调度程序设计报告
课程设计报告
一、课程设计的目的和要求
1、目的
进程调度是处理机管理的核心内容。
本设计要求用C语言编写和调试一个简单的进程调度程序。
通过设计本可以加深理解有关进程控制块、进程队列的概念,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法的具体实施办法。
2、要求
1)进程调度算法:
采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。
2)每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:
进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
3)进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
4)每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
5)就绪进程获得CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤销该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
6)每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
7)重复以上过程,直到所有进程都完成为止。
二、课程设计环境要求
1、硬件环境
联想系列电脑
Intel(R)Pentium(R)Dual
CPU主频2GHz内存1G
2、软件环境
MicrosoftWindowsXpProfessional版本2002
装有TurboC2.0软件
三、设计任务介绍及系统需求分析
1、设计任务的介绍
根据设计任务书的要求,画出程序设计流程图,确定程序的功能,把整个程序根据功能要求分解为各个子程序,利用TC语言编写程序代码,然后进行上机调试、修改、进行连接、测试,写出设计总结报告。
2、系统需求分析
在多道程序系统中,一个作业被提交后必须经过处理机调度后,方能获得处理机执行。
对于批量型作业而言,通常需要经历作业调度(又称高级调度或长程调度)和进程调度(又称低级调度或短程调度)两个过程后方能获得处理机;对于终端型作业,则通常只需经过进程调度即可获得处理机。
在较完善的操作系统中,为提高内存的利用率,往往还设置了中级调度(又称中程调度)。
对于上述的每一级调度,又都可采用不同的调度方式和调度算法。
在本程序设计中要掌握的是进程调度的其中两种调度算法的应用。
一个是最高优先数优先的调度算法(即把处理机分配给优先数最高的进程),另一个是先来先服务算法。
最高优先数优先调度算法(即把处理机分配给优先数最高的进程)的基本思想是把CPU分配给就绪队列中优先数最高的进程。
采用动态优先数,即优先数在创建进程时给定一个初始值,当进程获得一次CPU后其优先数就减少1,然后把它插入就绪队列等待CPU。
先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。
当在作业调度中采用该算法时,每次调度都是从后备队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。
在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。
该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
四、概要设计
1、最高优先数优先调度算法(即把处理机分配给优先数最高的进程)
实验步骤:
(1)初始化进程信息。
(2)将各个进程按优先数从高到低排列成就绪队列。
(3)检查所有队列是否为空,若空则结束,否则将队首进程调入执行。
(4)检查该运行进程是否运行完毕,若运行完毕,将此进程状态改为完成,插入另一个完成进程队列;否则,将该进程的优先数减1,然后重新对它进行排序,插入就绪队列适当位置后等待CPU。
(5)重复步骤(3)、(4),直到就绪队列为空。
2、先来先服务调度算法
实验步骤:
(1)初始化进程信息。
(2)按先来先服务算法将进程排成就绪队列。
(3)检查所有队列是否为空,若空则结束,否则将队首进程调入执行。
(4)检查该运行进程是否运行完毕,若运行完毕,将此进程状态改为完成;否则,继续运行直到此进程运行完为止,才运行就绪队列的下一个进程。
(5)重复步骤(3)、(4),直到就绪队列为空。
3、程序功能模块图:
(两种算法程序共用)
五、详细设计
1、功能模块设计
(1)主要函数(最高优先数优先调度算法和先来先服务的核心函数相同):
a.主函数
b.初始化进程函数
c.使用户输入仅为正整数的函数
d.排序函数
e.就绪函数
f.查看函数
g.显示函数
(2)程序流程图
a.最高优先数优先调度算法:
b.先来先服务调度算法:
2、数据结构设计
(1)最高优先数优先调度算法:
typedefstructpcb/*定义结构体数组,内部包含进程的信息*/
{
charname[10];/*定义进程名*/
intsuper;/*定义到达时间*/
intneedtime;/*定义进程需要运行的时间*/
intruntime;/*定义进程已用CPU时间*/
charstate;/*定义进程的运行状态*/
structpcb*link;/*进程块的后继指针,用于连接进程队列*/
}PCB;
(2)先来先服务调度算法:
typedefstructpcb/*定义结构体数组,内部包含进程的信息*/
{
charname[10];/*定义进程名*/
intarrivetime;/*定义到达时间*/
intneedtime;/*定义进程需要运行的时间*/
intruntime;/*定义进程已用CPU时间*/
charstate;/*定义进程的运行状态*/
structpcb*link;/*进程块的后继指针,用于连接进程队列*/
}PCB;
3、函数功能描述
(1)最高优先数优先调度算法:
a.main()主函数:
掌控整个程序的运行过程,是程序的主体部分。
b.input()初始化进程函数:
初始化各个进程的基本信息:
如进程个数、进程名、进程需运行的时间、进程的优先数、进程的已运行时间、进程的状态。
c.geti()使用户输入仅为正整数的函数:
使用户输入的进程个数、进程需运行的时间、进程的优先数都为正整数。
d.sort()排序函数:
按优先数由高到低排列成就绪队列,进而等待运行。
e.running()就绪函数:
进程运行时间到,则置就绪状态。
若已运行时间已达到需运行时间,则此进程已完成,插入另一个完成队列中;若未达到,则优先数减1,重新插入就绪队列中排序等待运行。
f.check()查看函数:
查看哪个进程正在执行,哪些进程在就绪队列中,哪些进程已经完成。
g.disp()显示函数:
显示各个进程的信息。
(2)先来先服务调度算法:
a.main()主函数:
掌控整个程序的运行过程,是程序的主体部分。
b.input()初始化进程函数:
初始化各个进程的基本信息:
如进程个数、进程名、进程需运行的时间、进程的到达时间、进程的已运行时间、进程的状态。
c.geti()使用户输入仅为正整数的函数:
使用户输入的进程个数、进程需运行的时间、进程的到达时间都为正整数。
d.sort()排序函数:
按到达时间从先到后排列成就绪队列,进而等待运行。
e.running()就绪函数:
进程运行时间到,则置就绪状态。
若已运行时间已达到需运行时间,则此进程已完成;若未达到,则继续运行直到时间达到为止。
f.check()查看函数:
查看哪个进程正在执行,哪些进程在就绪队列中,哪些进程已经完成。
g.disp()显示函数:
显示各个进程的信息。
六、调试过程
1、最高优先数优先调度算法
(1)先输入各个进程的信息
(2)进程运行的具体情况(部分调试结果)
2、先来先服务调度算法
(1)先输入各个进程的信息
(2)进程运行的具体情况(部分调试结果)
3、当输入进程信息时,应输入正整数的信息输成字符或是其他不规范的数,则显示为:
(两种算法程序都适用)
七、结论与体会
本次实验,成功实现了两种算法的主体功能。
最高优先数优先调度算法(即把处理机分配给优先数最高的进程)的基本思想是把CPU分配给就绪队列中优先数最高的进程。
采用动态优先数,即优先数在创建进程时给定一个初始值,当进程获得一次CPU后其优先数就减少1,然后把它插入就绪队列等待CPU。
先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。
当在作业调度中采用该算法时,每次调度都是从后备队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。
在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。
该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
其实,这两种算法有一些不同之处。
最高优先数优先算法较先来先服务算法多了进程优先数这个进程信息,此算法就是围绕进程优先数进行排序从而运行进程。
当进程获得一次CPU后其优先数就减少1,然后把它插入就绪队列重新排序等待CPU;而先来先服务算法较前者则是多了进程到达时间这个进程信息,此算法则是围绕先进先服务的原则来排序从而运行进程,直到此进程运行完成,才继续运行就绪队列的下一个进程。
这两种算法也有很多共同之处,在初始化进程信息时,要注意有些进程信息必须输入正整数,所以为了实现这个功能,这两种调度算法中都调用了一个函数geti(),使得输入的数仅能为正整数,否则(当无输入或有输入但输入为字符、小数、负数等不符规则的数)必须重新输入才可继续运行程序。
为了方便查看各个进程在每个时间片后的状态与信息,在这两种调度算法中,不仅将正在运行的进程信息和就绪队列的各个进程信息显示出来,还将已经完成的进程排成一个完成队列。
最后将所有进程的信息进行查看与显示,方便用户及时了解各个进程的状态。
八、参考文献
1.《计算机操作系统第三版》汤小丹、梁红兵、哲凤屏、汤子瀛编著,西安电子科技大学出版社
2.《数据结构》严蔚敏,吴伟明。
北京:
清华大学出版社,2006
3.《C语言程序设计》田祥宏主编西安电子科技大学出版社
4.
5.
附件:
源程序清单
最高优先数优先调度算法源程序清单:
#include
#include/*malloc函数的头文件*/
#include/*getchar函数的头文件*/
typedefstructpcb/*定义结构体数组,内部包含进程的信息*