《操作系统原理》课程设计报告书题目:进程控制模块的设计与实现专业:网络工程学号:131007111学生姓名:李亚豪指导教师:刘双红完成日期:2015-12-05目录第1章课题概述 (3)1.1 设计要求 (3)1.2 设计理论依据 (3)第2章设计简介和内容 (6)2.1 设计简介 (6)2.2 设计内容 (6)第3章详细设计3.1 设计流程图 (7)3.2 主要程序代码 (9)第4章设计结果及分析 (10)4.1 运行结果截图 (10)4.2 运行结果分析............................................................... 错误!未定义书签。
总结 (15)第1章课题描述1.1设计要求1.叙述要详细。
2.要有条理。
3.各个功能分开阐述。
4.自己可以增加题目要求的功能模块。
5.可以增加自己对题目的理解。
1.2设计理论依据根据作业控制块中的信息,审查系统能否满足用户作业的资源需求,以及按照一定的算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源。
短作业优先调度算法,从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。
第2章设计简介和内容2.1设计简介在多道程序环境下,将系统中的作业组织起来,为每个进入系统的作业建立档案以记录和作业相关的信息,按要求输入作业名、到达时间和服务时间,并为其建立作业控制块(JCB)挂入后备队列。
进行作业调度时,在其后计算出各个作业的开始执行时间、完成时间、周转时间和平均周转时间,利用短作业优先算法进行作业调度,并按照由小到大的顺序显示出来。
2.2 设计内容1)编写程序完成批处理系统中的作业调度,要求采用短作业优先的作业调度算法。
实验具体包括:首先确定作业控制块的内容,作业控制块的组成方式;然后完成作业调度;最后编写主函数对所作工作进程测试。
2)创建作业控制块JCB,定义为结构体,为进入系统的作业建立档案,其中定义了作业名,作业到达时间,作业服务时间,作业开始执行时间,作业完成时间,作业周转时间,作业平均周转时间。
3)首先按各个作业完成时间由小到大排序。
再用输入的到达时间与服务时间按一定算法算出各个作业的开始执行时间、完成时间、周转时间和作业平均周转时间。
第3章详细设计3.1 设计流程图3.2主要代码// 789.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include<stdio.h>#include<conio.h>#include<windows.h>#define MAX 100 //最多能管理的作业数目struct jcb //作业控制块JCB,定义为结构体{char name[10]; //作业名float arrivetime; //作业到达时间float servicetime;//作业服务时间float starttime; //作业开始执行时间float finishtime; //作业完成时间float zztime; //作业周转时间float avezztime; //作业平均周转时间};jcb a[MAX];void input(jcb *p,int N){int i;printf("请分别输入:\n\t作业名,到达时间,服务时间(如:JOB1 5 10)\n\n");for(i=0;i<=N-1;i++){printf("请输入第%d个作业信息:",i+1);scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);printf("\n");}}void Print(jcb *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float avezztime,int N){int k;printf("调度顺序:");printf("%s",p[0].name);for(k=1;k<N;k++){printf("-->%s",p[k].name);}printf("\n\n");printf("\t\t\t作业信息:\n");printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tavezz\n");for(k=0;k<=N-1;k++){printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrivetime,p[k].service time,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].avezztime);}}void sort(jcb *p,int N){for(int i=0;i<=N-1;i++)for(int j=0;j<=i;j++)if(p[i].arrivetime<p[j].arrivetime){jcb temp;temp=p[i]; p[i]=p[j];p[j]=temp;}}void deal(jcb *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &avezztime,int N){int k;for(k=0;k<=N-1;k++){if(k==0){p[k].starttime=p[k].arrivetime;p[k].finishtime=p[k].arrivetime+p[k].servicetime;}else{p[k].starttime=p[k-1].finishtime;p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}}for(k=0;k<=N-1;k++){p[k].zztime=p[k].finishtime-p[k].arrivetime;p[k].avezztime=p[k].zztime/p[k].servicetime;}}void jcbf(jcb *p,int N){float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,avezztime=0;sort(p,N);for(int m=0;m<N-1;m++){if(m==0)p[m].finishtime=p[m].arrivetime+p[m].servicetime;elsep[m].finishtime=p[m-1].finishtime+p[m].servicetime;int i=0;for(int n=m+1;n<=N-1;n++){if(p[n].arrivetime<=p[m].finishtime)i++;}float min=p[m+1].servicetime;int next=m+1;//m+1=nfor(int k=m+1;k<m+i;k++){if(p[k+1].servicetime<min){min=p[k+1].servicetime;next=k+1;}}jcb temp;temp=p[m+1];p[m+1]=p[next];p[next]=temp;}deal(p,arrivetime,servicetime,starttime,finishtime,zztime,avezztime,N);Print(p,arrivetime,servicetime,starttime,finishtime,zztime,avezztime,N);}int main(){while(1){int N;printf("\t\t\t------短作业优先调度算法------\n");printf("请输入作业数目:"); scanf("%d",&N);char ch;if(N>MAX){printf("\t!!输入的作业数目太大,请输入不大于%d的整数\n",MAX);printf("按Q或者q退出程序,按其他任意键继续测试...");ch = getch();if(ch=='Q'||ch=='q'){break;}else continue;}input(a,N);jcb *b=a;jcbf(b,N);printf("按Q或者q退出程序,按其他任意键继续测试...");ch = getch();if(ch=='Q'||ch=='q'){break;}}return 0;}第4章设计结果及分析4.1 运行结果截图1)初始化界面图1-1 初始化初始化作业输入作业的数目,但不可超过进程设置的最大值。
如果输入的作业数超过作业数的最大值,程序就会退出。
输入如果在正确范围的话,程序就会执行,并会出现相应的提示信息,执行情况如下图所示。
2)输入进程数目图1-2 输入进程数目承接上面的页面,输入相应的作业数,输入作业数后程序会给出相应的提示,用户可根据相应的提示,进行操作,进行下一步,如下图所示。
3)输入进程名、到达时间、服务时间图1-3 输入进程各信息用户进入这个界面后,根据相应的提示,输入用户所构造的作业信息。
如作业名、到达时间、服务时间。
根据用户输入相应的值,程序会给出相应的处理,如下图所示。
4)运行结果图1-4 运行结果相应的程序对用户输入的作业信息,做出了相应的处理。
如程序的执行顺序,对应的程序的名字、到达时间、服务时间、开始服务时间、完成时间、周转时间、平均周转时间。
用户可根据执行情况,了解相应的进程的执行情况。
总结1.列出开发过程中遇到的主要困难,并写出解决方法把完成的模块组合到主程序上。