当前位置:文档之家› 操作系统课程设计报告

操作系统课程设计报告

课程设计说明书设计题目:操作系统课程设计班级:信息学管理与信息系统2011级学号: 2姓名:克乾山东科技大学2013年12 月11 日课程设计任务书学院信息科学与工程专业信息学管理与信息系统班级2011-2 克乾一、课程设计题目:操作系统课程设计二、课程设计主要参考资料(1)Abraham Silberschatz & Peter Baer Galvin & Greg Gagne. Operating System Concepts(第七版影印版). 高等教育. 2007.3. (2)c++面向对象程序设计电子工业(3)计算机操作系统(第三版)电子科技大学三、课程设计应解决的主要问题:(1)CPU调度算法的模拟实现(2)死锁相关算法的实现(3)磁盘调度算法的实现四、课程设计相关附件(如:图纸、软件等):(1)程序源代码(2)五、任务发出日期:2013-10-1 课程设计完成日期:2014-1-1指导教师签字:指导教师对课程设计的评语成绩:指导教师签字:年月日设计1 CPU调度算法的模拟实现一、设计目的利用C++编写CPU调度算法,实现先来先服务调度算法FCFS、优先级调度算法PS、短作业优先调度算法SJF、时间片轮转调度算法RR的运行过程和实现的结果,针对模拟进程,利用编写的CPU调度算法对需要运行的进程进行调度。

进行算法评价,计算平均周转时间和平均等待时间。

二、设计要求针对模拟进程,利用CPU调度算法进行调度,最后要进行算法评价,计算平均周转时间和平均等待时间,并且输出调度结果和输出算法评价指标。

调度所需的进程参数由输入产生(手工输入或者随机数产生)。

三、设计说明时间片轮转算法需要输入相应的时间片,所以独立编写一个程序,系统主体结构如下:实现的结构体如下:struct task_struct{char name[10]; /*进程名称*/int number; /*进程编号*/float come_time; /*到达时间*/float run_begin_time; /*开始运行时间*/float run_time; /*运行时间*/float run_end_time; /*运行结束时间*/int priority; /*优先级*/int order; /*运行次序*/int run_flag; /*调度标志*/}tasks[MAX];运用switch语句对输入的进程进行相应的算法运行,进入相应的算法函数后会对进程进行调度并输出结果,并对结果进行评估。

1.先来先服务算法(FCFS)可用于作业调度,也可用于进程调度。

每次调度都是从后备队列中选择一个或者多个最先进入队列的作业或进程,将他们调入存进行分配资源,创建进程,放入就绪队列并开始执行。

实现函数:int fcfs() /*先来先服务*/ 主要实现方法如下:2. 短作业优先调度算法(SJF ),即从后备队列中选择一个或几个估计运行时间最短的作业或进程对其分配资源,并进行调度执行。

实现函数:int sjf() /*短作业优先*/主要实现方法如下:3. 优先级调度算法即在将第一个到达的进程执行完毕后,会在此刻已经到达的进程或作业中选择优先权最高的一个或者几个进程对其进行资源分配并创建进程执行。

实现函数:int ps() /*优先级调度*/主要实现方法如下:4. 在时间片调度算法的模拟实现中,时间片就是分配给进程运行的一段时间。

在轮转法中,系统将所有的可运行(即就绪)进程按先来先服务的原则,排成一个队列,每次调度时把CPU分配给队首进程,并令其执行一个时间片。

当某进程执行的时间片用完时,系统发出信号,通知调度程序,调度程序便据此信号来停止该进程的执行,并将刚运行的进程送到运行队列的末尾,等待下一次执行;然后,把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。

这样就可以保证运行队列中的所有进程,在一个给定的时间,均能获得一时间片的处理机执行时间。

实现函数(单独程序)主要实现方法如下:四、运行结果及分析设有如下3个进程:进程名称到达时间运行时间优先级A 4 5 3B 6 10 1C 5 8 2 注:"优先级"一栏,数字大的表示优先级越高。

根据本例来运行本算法,结果如下:采用先来先服务算法:采用优先级调度:采用短作业优先:时间片轮转算法:本程序已通过测试阶段,未出现进程调度错误情况。

运行程序后,只需按照提示输入相应的进程的信息(进程名尽量输入单个字母)后选择需要的调度算法即可得出相应结果,并且可以循环运行多次。

后期进行相应的美化加工,如需要,可进行可视化改造。

结果分析:对于进程调度后得出的各项数据基本准确,当输入时间或其他数据信息出现精确度较高的数值时可能会出现一些误差,属于误差围之。

程序基本可以实现CPU调度算法的过程解释。

五、总结通过此次课程设计,更深入的理解了各个进程调度算法,及实现过程。

在此过程中,遇到了困难,能及时请教同学,查询相关资料,及时解决了问题,但仍有不足之处,将会在今后学习中更加努力。

六.附录(完整代码)#include<iostream>using namespace std;#define MAX 10struct task_struct{char name[10]; /*进程名称*/int number; /*进程编号*/float come_time; /*到达时间*/float run_begin_time; /*开始运行时间*/float run_time; /*运行时间*/float run_end_time; /*运行结束时间*/int priority; /*优先级*/int order; /*运行次序*/int run_flag; /*调度标志*/}tasks[MAX];int counter; /*实际进程个数*/int fcfs(); /*先来先服务*/int ps(); /*优先级调度*/int sjf(); /*短作业优先*/int hrrn(); /*响应比高优先*/int pinput(); /*进程参数输入*/int poutput(); /*调度结果输出*/int main(){int option;pinput();printf("请选择调度算法(0~4):\n");printf("1.先来先服务\n");printf("2.优先级调度\n");printf("3.短作业优先\n");printf("0.退出\n");scanf("%d",&option);switch (option){case 0:printf("运行结束。

\n");break;case 1:printf("对进程按先来先服务调度。

\n\n");fcfs();break;case 2:printf("对进程按优先级调度。

\n\n");ps();break;case 3:printf("对进程按短作业优先调度。

\n\n");sjf();break;}}int fcfs() /*先来先服务*/{float time_temp=0;int i;int number_schedul;time_temp=tasks[0].come_time;for(i=0;i<counter;i++){tasks[i].run_begin_time=time_temp;tasks[i].run_end_time=tasks[i].run_begin_time+tasks[i].run_time;tasks[i].run_flag=1;time_temp=tasks[i].run_end_time;number_schedul=i;tasks[number_schedul].order=i+1;}poutput();return main();}int ps() /*优先级调度*/{float temp_time=0;int i=0,j;int number_schedul,temp_counter;int max_priority;max_priority=tasks[i].priority;j=1;while ((j<counter)&&(tasks[i].come_time==tasks[j].come_time)) {if (tasks[j].priority>tasks[i].priority){max_priority=tasks[j].priority;i=j;}j++;}/*查找第一个被调度的进程*//*对第一个被调度的进程求相应的参数*/number_schedul=i;tasks[number_schedul].run_begin_time=tasks[number_schedul].c ome_time;tasks[number_schedul].run_end_time=tasks[number_schedul].run_ begin_time+tasks[number_schedul].run_time;tasks[number_schedul].run_flag=1;temp_time=tasks[number_schedul].run_end_time;tasks[number_schedul].order=1;temp_counter=1;while (temp_counter<counter){max_priority=0;for(j=0;j<counter;j++){if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag))if (tasks[j].priority>max_priority){max_priority=tasks[j].priority;number_schedul=j;}}/*查找下一个被调度的进程*//*对找到的下一个被调度的进程求相应的参数*/tasks[number_schedul].run_begin_time=temp_time;tasks[number_schedul].run_end_time=tasks[number_schedul].run_ begin_time+tasks[number_schedul].run_time;tasks[number_schedul].run_flag=1;temp_time=tasks[number_schedul].run_end_time;temp_counter++;tasks[number_schedul].order=temp_counter;}poutput();return main();}int sjf() /*短作业优先*/{float temp_time=0;int i=0,j;int number_schedul,temp_counter;float run_time;run_time=tasks[i].run_time;j=1;while ((j<counter)&&(tasks[i].come_time==tasks[j].come_time)) {if (tasks[j].run_time<tasks[i].run_time){run_time=tasks[j].run_time;i=j;}j++;} /*查找第一个被调度的进程*//*对第一个被调度的进程求相应的参数*/number_schedul=i;tasks[number_schedul].run_begin_time=tasks[number_schedul].c ome_time;tasks[number_schedul].run_end_time=tasks[number_schedul].run_ begin_time+tasks[number_schedul].run_time;tasks[number_schedul].run_flag=1;temp_time=tasks[number_schedul].run_end_time;tasks[number_schedul].order=1;temp_counter=1;while (temp_counter<counter){for(j=0;j<counter;j++){if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag)){run_time=tasks[j].run_time;number_schedul=j;break;}}for(j=0;j<counter;j++){if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag))if(tasks[j].run_time<run_time){run_time=tasks[j].run_time;number_schedul=j;}}/*查找下一个被调度的进程*//*对找到的下一个被调度的进程求相应的参数*/tasks[number_schedul].run_begin_time=temp_time;tasks[number_schedul].run_end_time=tasks[number_schedul].run_ begin_time+tasks[number_schedul].run_time;tasks[number_schedul].run_flag=1;temp_time=tasks[number_schedul].run_end_time;temp_counter++;tasks[number_schedul].order=temp_counter;}poutput();return main();}int pinput() /*进程参数输入*/{int i;printf("please input the process counter:\n"); scanf("%d",&counter);if(counter==0)return 0;else{for(i=0;i<counter;i++){ printf("******************************************\n");printf("please input the process of %d th :\n",i+1);printf("please input the name:\n");scanf("%s",tasks[i].name);printf("please input the come_time:\n");scanf("%f",&tasks[i].come_time);printf("please input the run_time:\n");scanf("%f",&tasks[i].run_time);printf("please input the priority:\n");scanf("%d",&tasks[i].priority);tasks[i].run_begin_time=0;tasks[i].run_end_time=0;tasks[i].order=0;tasks[i].run_flag=0;}}return 0;}int poutput() /*调度结果输出*/{int i;float turn_round_time=0,f1,w=0;printf("name come_time run_time run_begin_time run_end_time priority order turn_round_time\n");for(i=0;i<counter;i++){f1=tasks[i].run_end_time-tasks[i].come_time;turn_round_time+=f1;w+=(f1/tasks[i].run_time);printf(" %s, %5.3f, %5.3f, %5.3f, %5.3f, %d, %d, %5.3f\n",tasks[i].name,tasks[i].come_time,tasks[i].run _time,tasks[i].run_begin_time,tasks[i].run_end_time,tasks[i].priority,t asks[i].order,f1);}printf("average_turn_round_timer=%5.2f\n",turn_round_time/count er);printf("weight_average_turn_round_timer=%5.2f\n",w/counter); return 0;}#include <stdio.h>#include <stdlib.h>#define Myprintf printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n")typedef struct PCB{int ID;int ReachTime;int TotalTime;}PCB; //进程号,到达时间和服务时间typedef struct NOTE //备份{int TotalTime;}NOTE;PCB A[100]; //5个进程PCB a[100];NOTE temp;int queue[50]; //记录调度的进程int K=0; //调度进程数组的标识void INIT(int M)//初始化{int i;int m;m=M;for(i=0;i<m;i++){A[i].ID=-1;}}int GetNum(int M)//计算进程数{int m;m=M;int i;int j=0;for(i=0;i<m;i++){if(A[i].ID!=-1){j++;}}return j;}int GetReach(int time,int M)//找出到达进程号{int i;int m;m=M;for(i=0;i<m;i++){if(a[i].ReachTime<=time)a[i].ReachTime=100;return i;}}return -1;}int GetInsert(int M)//找出插入位置{int i;int m;m=M;for(i=0;i<m;i++){if(A[i].ID==-1)return i;}return -1;}void Forward(int num)//前移{int i;for(i=0;i<num-1;i++){A[i].ID=A[i+1].ID;A[i].TotalTime=A[i+1].TotalTime;}A[num-1].ID=-1;}void Process(int Jiange)//执行进程{int jiange;jiange=Jiange;queue[K]=A[0].ID;K++;A[0].TotalTime=A[0].TotalTime+jiange;temp.ID=A[0].ID;temp.TotalTime=A[0].TotalTime; }int main(){int i;int time;int t=0;int reach;int insert;int num;int M;int Jiange;printf("RR算法\n\n");printf("请输入进程个数\n");scanf("%d",&M);printf("请输入R值\n");scanf("%d",&Jiange);INIT(M);for(i=0;i<M;i++){printf("请输入进程ID:");scanf("%d",&a[i].ID);printf("请输入到达时间:");scanf("%d",&a[i].ReachTime);printf("请输入服务时间:");scanf("%d",&a[i].TotalTime);}for(i=0;i<M;i++)//运行时间{t=t+a[i].TotalTime;}for(i=0;i<50;i++)//初始化{queue[i]=-1;}for(time=0;time<=t;time++){reach=GetReach(time,M);if(reach!=-1)//有进程到达{insert=GetInsert(M);A[insert].ID=a[reach].ID;A[insert].TotalTime=a[reach].TotalTime;num=GetNum(M);if(num==1)continue;//进程数为1else{//进程数不为1Process(Jiange);Forward(num);if(temp.TotalTime!=0){A[num-1].ID=temp.ID;A[num-1].TotalTime=temp.TotalTime;}}}else//没有进程到达{num=GetNum(M);if(num==1){//进程数为1Process(Jiange);if(temp.TotalTime==0){A[0].ID=-1;}}else if(num==0)continue;//进程数为0else{Process(Jiange);Forward(num);if(temp.TotalTime!=0){A[num-1].ID=temp.ID;A[num-1].TotalTime=temp.TotalTime;}}}}printf("\n");printf("调度顺序为:\n");Myprintf;for(i=0;i<50;i++){if(queue[i]!=-1)printf("|%2d ",queue[i]);}printf("|\n");Myprintf;printf("\n");return 0;}设计2 死锁相关算法的实现一、设计目的编写算法,实现银行家算法、安全性算法、死锁检测算法判断系统安全状态、判断进程的资源请否可以被满足、判定系统是否为死锁状态。

相关主题