学生学院____ 计算机学院______ 专业班级 13级计科9 学号
学生姓名
指导教师李敏
2015 年12 月29 日
一、课程设计介绍
设计模拟一个实现多道批处理系统的两级调度。
通过具体的作业调度、进程调度、内存分配等功能的实现,加深对多道批处理系统的两级调度模型和实现过程的理解。
作业从进入系统到最后完成,要经历两级调度:作业调度和进程调度。
作业调度是高级调度,它的主要功能是根据一定的算法,从输入井中选中若干个作业,分配必要的资源,如主存、外设等,为它们建立初始状态为就绪的作业进程。
进程调度是低级调度,它的主要功能是根据一定的算法将CPU分派给就绪队列中的一个进程。
在本次课程设计中假定系统可供用户使用的主存空间共100KB,并有4台磁带机。
主存分配采用可变分区分配方式且主存中信息不允许移动,对磁带机采用静态分配策略,作业调度分别采用先来先服务算法和最小作业优先算法,进程调度则采用先来先服务和最短进程优先算法。
二、课程设计环境
1.计算机及操作系统:PC机,WindowsXP系统
2.程序设计使用工具:Microsoft VisualC++ 6.0
3.程序设计语言:C语言
三、课程设计思想
假定“预输入”程序已经把一批作业的信息存放在输入井了,并为它们建立了相应作业表。
测试数据如下:
作业到达时间估计运行时间内存需要磁带机需要
JOB1 10:00 25分钟15K 2台
JOB2 10:20 30分钟60K 1台
JOB3 10:30 10分钟50K 3台
JOB4 10:35 20分钟10K 2台
JOB5 10:40 15分钟30K 2台
本次课程设计采用的是两个作业调度算法:先来先服务算法和短作业优先算法,两个进程调度算法:先来先服务算法,短进程优先算法。
系统根据所选算法组合对输入系统的作业进行两级调度(作业调度,进程调度)。
分别在不同算法控制下运行设计的程序,依次显示被选中作业、内存空闲区和磁带机的情况,输出不同算法作业的选中次序及作业平均周转时间。
作业的数据初始化输入通过读取文件这种方式进行导入。
系统运行是通过设置指针来循环运作。
四、系统结构说明
系统的各个模块之间的关系如下:
五、数据结构说明
1.定义一个显示时间的结构体,成员包括时、分
struct time
{
int hour; //时
int min; //分
};
2.建立作业控制块,具体成员如下所示:
struct jcb
{
char name[10]; //进程名
struct time arr_time; //到达时间
struct time ent_time; //进入内存时间
struct time sta_time; //开始时间
struct time fin_time; //结束时间
int run_time; //估计运行时间
int tr_time; //周转时间
int men; //主存需要
int mac; //磁带机
int sta; //状态位
struct jcb* next;
};typedef struct jcb JCB;
3.进程的链接结构体,成员如下所示:
struct link
{
char name[10]; //进程名
struct time arr_time; //到达时间
struct time ent_time; //进入内存时间
struct time sta_time; //开始时间
struct time fin_time; //结束时间
int run_time; //估计运行时间
int tr_time; //周转时间
int addr; //起始地址
int len; //分区大小
int mac; //磁带机
int state; //状态位,0为空闲,1为被使用
struct link *f; //前指针
struct link *b; //后指针
} ;
六、主要调度算法思想流程图
1.整体算法流程图
2.实现代码
详见CourseDesign.cpp
七、运行测试
1.测试数据(test.txt):
进程名到达运行主存磁带机
JOB1 10:00 25 15 2
JOB2 10:20 30 60 1
JOB3 10:30 10 50 3
JOB4 10:35 20 10 2
JOB5 10:40 15 30 2
2.程序界面
1)算法组合:JFCFS&PFCFS
根据先来先服务,第一个进行调度的是JOB1,到达时间为10:00,运行时间为25分钟,周转时间为25分钟。
为该作业分配内存和磁带机,磁带机由4->2,运行后得到如下图:
实际程序运行所得并不止以上数据,除此以外还有显示内存情况的图表,这里只是为了分析清楚而把主要数据给出,具体数据可运行程序所得,下面分析和以上一样都做了简化。
第二个进行调度的是JOB2,到达时间为10:20,完成时间为10:55,周转时间为35分钟,分配内存和磁带机,如下图所示:
如此类推,最后得出所有作业的运行情况:
此时按回车键返回,重新选择新的算法组合,得到各算法组合的所有作业运行情况
2)算法组合:JFCFS&PSPF:
3)算法组合:JSJF&PFCFS:
4)算法组合:JSJF&PSPF:
得到四种组合的结果后,我们就可以来比较一下四种方式下得到的平均周转时间,在选择调度方式时输入5,程序会运行得到四种方式下的作业运行情况和各自的平均周转时间。
3.退出系统
回车,输入0结束程序。
八、使用说明书
1.运行程序,会显示用户界面,程序左下角会提示用户输入要进行模拟的文件名。
若输入错误,程序会出现错误提示,然后重新输入正确的文件名。
2.输入文件名后,程序会显示文件内容并提示点击任意键继续运行。
3.选择进行调度的方式,分别对应1、2、3、4选项,5选项用来比较四种调度方式的平均周转时间。
0是结束并退出程序。
4.选择要进行的调度方式后,程序自动模拟两级调度情况,显示当前系统时间、内存分配、磁带机分配以及作业调度的情况。
5.点击任意键,返回步骤3选择调度方式,如此类推。
6.注:在显示内存分配情况的图表中,#代表此时并无作业调进内存,除了起始地址、状态、大小有数据之外,其余用0表示其他项并没有数据。
九、课程设计总结
这次的课程设计内容就是实验的前三个内容的组合:进程调度,作业调度,内存分配与回收。
这三个内容都充分地体现了计算机运行作业和程序的各个方面,从而体现了计算机的底层是如何实现进程和作业的分配和使用。
其次,我觉得编程设计是学习软件工程必不可少的也是最重要的一个过程。
通过对课程设计的实现,我学到了很多知识。
原来,学语言是要打牢基础的。
在课程设计的过程中我感觉到自己的语言知识还远远不够,就一个简单的课程设计也能把我搞得头晕。
还有算法的基本思想是要靠平时的积累与体会才能提高的。
看来以
后要多多专研这方面。
希望以后能有更多类似的课程设计,因为我觉得受益匪浅。
源码下载地址:/s/1pK1HcMn。