1、第一章 概述1.1选定的题目基于FCFS和SPF的进程管理系统的设计1.2课程设计意义 课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。计算机操作系统一门重要的专业课,是开发操作系统和软件系统的理论和应用基础。1.3课程设计的目的本设计的目的是:加深对进程概念及进程管理各部分内容的理解;熟悉FCFS和SPF两种进程调度算法。1.4课程设计的要求(1)设计一个完整的进程调度系统,系统中至少包括5个进程;(2)定义PCB;(3)采用链表管理就绪队列;(
2、4)结果要能够显示出进程的调度序列及进入系统的时间、运行时间等必要信息。第二章 系统分析本系统实现的功能有:在OS中调度的实质一种资源分配,因此调度算法是指:根据系统的资源分配策略所规定的资源分配算法。先来先服务调度算法是一种最简单的调度算法,在进程调度中采用FCFS算法时,每次调度是从就绪队列中选择一个最先进入该队列的的进程,位置分配处理机,使之投入运行。该进程一直运行到完成或发生某件事而阻塞后才放弃处理机。短进程优先调度算法,是指对短进程进行优先调度的算法。段进程优先调度算法从就绪队列中选出一个估计运行时间最短的进程,将处理及分配给它,使他执行并一直执行到完成,或发生某事件而被阻塞放弃处理
3、及时再度重新利用。第三章 系统设计3.1 功能模块设计 进程创建模块 此模块用来创建进程实体,设置进程的到达时间、服务时间、开始时间。 就绪队列模块 此模块用链式队列来实现,用来存放已经创建的进程,为下面的两个模块来服务。 FIFO模块 此模块是先进先出算法的实现模块,此模块遍历模块2中的就绪队列来找到到达时间的从小到的大的序列。 SPF模块 此模块是短进程优先调度算法的实现模块,此模块遍历2中的就绪队列来找到服务时间从小打到的序列。3.2 PCB创建模块typedef struct PCB char name50; /*进程名字*/ int flag; long size; int arri
4、ve; /到达时间 int start; /开始时间 int server; /服务时间 struct PCB *next; /*链指针*/PCB,*PCBNode;结束选择调度算法(P/R)输入进程数量输入进程名称和时间输出优先级按任意键输出结果开始结束选择调度算法(P/R)输入进程数量输入进程名称和时间输出优先级按任意键输出结果开始结束选择调度算法(P/R)输入进程数量输入进程名称时间输出优先级按任意键输出结果开始第四章 程序设计流程图开始创建进程输入进程名称、大小、创建时间、服务时间就绪队列查看选择调度算法(FCFS/SPF)输出结果结束第五章 源程序清单#include struct.
5、h#include stdio.h#include stdlib.h#include string.h#include #include iomanip#define null 0#define OVERFLOW -2#define ERROR 0#include iostreamusing namespace std;class PCBQueuepublic: PCB *front;public: PCB *rear;/int mutex;PCBQueue() front=rear=(PCB*)malloc(sizeof(PCB); if (!front) exit(OVERFLOW); e
6、lse strcpy(front-name,nullqueue); front-flag=-1;front-size=0;front-server=0;front-arrive=-1;front-start=0;front-next=null; bool inqueue(PCBNode &p)p-next=null; rear-next=p; rear=p;return true;bool outqueue(PCBNode &p)if(front=rear) return false;p=front-next;front-next=p-next;if (rear=p) rear=front;r
7、eturn true;bool isnull()if (front=rear) return true;elsereturn false;int number() int i=0;PCBNode p=front;while(p!=rear) p=p-next; i+;return i;void traverse()if(isnull()cout就绪队列为空。endl;elsecout就绪进程数为:number()next;for(int i=0;inumber();i+)cout进程名字:namet进程标识符:flagnext;/bool tellprocessmessage(int flag
8、)PCBNode p;p=findprocess(flag);if(p)cout进程 名字:nameendl;cout进程标识符:flagendl;cout进程 大小:sizeendl;cout进程创建时间:arriveendl;cout进程服务时间:serverflag!=flag) p=p-next;elsebreak; if(!p) cout没有此进程。endl; return p;PCBQueue()if(front)free(front);if(rear)free(rear);typedef struct PCB char name50; /*进程名字*/ int flag; lon
9、g size; int arrive; /到达时间 int start; /开始时间 int server; /服务时间 struct PCB *next; /*链指针*/PCB,*PCBNode;#define default_memorysize 20*1024 /默认内存大小MB#define default_blocksize 1024 /默认物理块大小KB#define default_blockmaxnumber 2000#define fangcunxuliesize 10#include iostream#include process.h#include #include #
10、include windows.husing namespace std;#define error 0class syspublic: int n; int time; PCBQueue ready; /就绪队列 PCBNode ExecuteProcess;sys() n=0; time=0;ExecuteProcess=null; PCBNode createprocess()PCBNode p;p=new PCB; cout请输入进程名字:pname; strcpy(p-name,pname); p-flag=+n; cout请输入进程的大小:psize; p-size=psize;
11、cout输入创建时间:p-arrive; if(p-arrive0) return null; cout输入服务时间:p-server; cout进程创建成功。endl;return p;void FIFO() time=0;cout-endl;coutsetiosflags(ios:left);coutsetw(4)序号setw(10)进程名setw(10)进程标识setw(10)到达时间setw(10)开始时间setw(10)服务时间setw(10)周转时间setw(10)带权周转时间endl;int j=0;while(!ready.isnull() PCB *p,*q; ready.o
12、utqueue(p); for(int i=0;iarrivearrive) ready.inqueue(q); if(p-arriveq-arrive) ready.inqueue(p);p=q; ExecuteProcess=p;while(ExecuteProcess-arrivetime) time+;ExecuteProcess-start=time;coutsetw(4)jsetw(10)namesetw(10)flagsetw(10)arrivesetw(10)startsetw(10)serversetw(10)start-ExecuteProcess-arrive+Execu
13、teProcess-serversetw(10)start-ExecuteProcess-arrive+ExecuteProcess-server)/ExecuteProcess-server)server;j+;cout-endl;void SPF() time=0;cout-endl;coutsetiosflags(ios:left);coutsetw(4)序号setw(10)进程setw(10)进程标识setw(10)到达时间setw(10)开始时间setw(10)服务时间setw(10)周转时间setw(10)带权周转时间endl;int j=0;while(!ready.isnull
14、() PCB *p,*q; ready.outqueue(p); for(int i=0;iarrivearrive) ready.inqueue(q); if(p-arrive=q-arrive) if(p-serverserver) ready.inqueue(q);else ready.inqueue(p);p=q; if(p-arriveq-arrive) ready.inqueue(p);p=q; ExecuteProcess=p;while(ExecuteProcess-arrivetime) time+; ExecuteProcess-start=time;coutsetw(4)
15、jsetw(10)namesetw(10)flagsetw(10)arrivesetw(10)startsetw(10)serversetw(10)start-ExecuteProcess-arrive+ExecuteProcess-serversetw(10)start-ExecuteProcess-arrive+ExecuteProcess-server)/ExecuteProcess-server)server;j+;cout-endl;sys() if(ExecuteProcess)free(ExecuteProcess);#include Sys_tem.hvoid disply1(
16、)system(color 0A);cout基本分页存储管理系统endl;cout 1.创建进程endl;cout 2.进程信息endl;cout 3.就绪队列查看endl;cout 4.FIFOendl;cout 5.SPFendl;cout 6.示例endl;cout 7.退出endl;coutendl;void maindisplay(sys &System)start:system(cls); disply1();coutendl;int check;cincheck;switch(check)case 1: system(cls);PCBNode pp=System.createpr
17、ocess();if(pp)System.ready.inqueue(pp);system(pause);goto start;case 2:system(cls);coutfg;System.ready.tellprocessmessage(fg);system(pause);goto start;case 3:system(cls);System.ready.traverse();system(pause);goto start;case 4:system(cls);System.FIFO();system(pause);goto start;case 5:system(cls);if(!
18、System.ready.isnull()System.SPF();system(pause);goto start; case 6:system(cls);system(pause);goto start;case 7:break;default :cout输入错误,请重新输入。endl;system(pause);goto start;#include display.h#include mywindow.hint main() sys System; maindisplay(System);exit(-2);第六章 调试过程中的问题及系统测试情况6.1操作界面测试结果如下图:6.2创建进
19、程页面如下图:6.3进程信息查看界面如下6.4就绪队列查看6.5FCFS调度结果如下6.6SPF调度结果如下第七章 结束语通过紧张而又充实的一周的操作系统课程设计,使我再次回顾了操作系统学习中的相关内容,对设计和调试相应的程序的基础步骤和方法有了更深的认识。首先我谈一下我对本设计的看法,在做这项课程设计的过程中,通过思考摸索与查阅资料相结合,并与同组的其他同学讨论,相互学习,熟练的运用C语言,使我比较成功的设计了这个系统,一方面通过不断的思考,查阅资料,不断的发现错误并纠正,反复的完善自己的设计,基本上完成了设计的要求,在一次次的动手与动脑中,学会了把课本上的知识成功的运用到实际应用中,巩固了自己关于操作系统的知识。另一方面,我在设计与查阅资料中,发现了操作系统这门课的非常强大的功能,及其广泛的应用性,并深深的体会到了自己设计出一个成功的系统的乐趣,并且积累了编写程序的经验,受益匪浅 由于第一次接触比较大的系统程序,原理上比较好理解,然而在具体语言的实现上比较困难。通过这次课程设计,加深了我对操作系统这门课程的理解,尤其是进程的管理。虽然我的这个进程管理系统功能很少,模拟的真实性不高,但毕竟是这几天的劳动成果。在课程设计的过程中,问题挺多的,但是在同学的帮助下一一克服了,在此对他们表示感谢。 .15