1、课 程 设 计 说 明 书设计题目: 操作系统课程设计 班 级: 信息学管理与信息系统级 学 号: 01051012 姓 名: 李克乾 山 东 科 技 大 学12 月 11 日课 程 设 计 任 务 书学院 信息科学与工程 专业 信息学管理与信息系统 班级 -2 姓名 李克乾 一、课程设计题目: 操作系统课程设计 二、课程设计重要参照资料(1)Abraham Silberschatz & Peter Baer Galvin & Greg Gagne. Operating System Concepts(第七版 影印版). 高等教诲出版社. .3. (2) c+面向对象程序设计 电子工业出版社
2、(3)计算机操作系统(第三版) 西安电子科技大学出版社 三、课程设计应解决重要问题:(1)CPU调度算法模仿实现 (2)死锁有关算法实现 (3)磁盘调度算法实现 四、课程设计有关附件(如:图纸、软件等):(1) 程序源代码 (2) 五、任务发出日期: -10-1 课程设计完毕日期: -1-1 指引教师签字: 指引教师对课程设计评语成绩: 指引教师签字: 年 月 日设计1 CPU调度算法模仿实现一、设计目运用C+编写CPU调度算法,实现先来先服务调度算法FCFS、优先级调度算法PS、短作业优先调度算法SJF、时间片轮转调度算法RR运营过程和实现成果,针对模仿进程,运用编写CPU调度算法对需要运营
3、进程进行调度。进行算法评价,计算平均周转时间和平均等待时间。二、设计规定针对模仿进程,运用CPU调度算法进行调度,最后要进行算法评价,计算平均周转时间和平均等待时间,并且输出调度成果和输出算法评价指标。调度所需进程参数由输入产生(手工输入或者随机数产生)。三、设计阐明时间片轮转算法需要输入相应时间片,因此独立编写一种程序,系统主体构造如下: CPU调度算法先来先服务算法优先级调度算法 短作业优先调度算法时间片轮转调度算法实现构造体如下:struct task_struct char name10; /*进程名称*/ int number; /*进程编号*/ float come_time; /
4、*到达时间*/ float run_begin_time; /*开始运营时间*/ float run_time; /*运营时间*/ float run_end_time; /*运营结束时间*/ int priority; /*优先级*/ int order; /*运营顺序*/ int run_flag; /*调度标志*/ tasksMAX;运用switch语句对输入进程进行相应算法运营,进入相应算法函数后会对进程进行调度并输出成果,并对成果进行评估。1. 先来先服务算法(FCFS)可用于作业调度,也可用于进程调度。每次调度都是从后备队列中选取一种或者各种最先进入队列作业或进程,将她们调入内存进
5、行分派资源,创立进程,放入就绪队列并开始执行。实现函数:int fcfs() /*先来先服务*/重要实现办法如下:执行程序输入进程有关信息寻找第一进程将进程保存至调度列,并进行调度判断所有进程都被调度在未调度算法中需找最先到达进程是否打印成果信息2. 短作业优先调度算法(SJF),即从后备队列中选取一种或几种预计运营时间最短作业或进程对其分派资源,并进行调度执行。实现函数:int sjf() /*短作业优先*/重要实现办法如下:执行程序输入进程信息判断最短服务时间进程把进程储存在调度序列并执行在未调度并已到达进程中寻找服务时间最短进程打印调度成果所有进程被调度否是3. 优先级调度算法即在将第一
6、种到达进程执行完毕后,会在此刻已经到达进程或作业中选取优先权最高一种或者几种进程对其进行资源分派并创立进程执行。实现函数:int ps() /*优先级调度*/重要实现办法如下:程序执行输入进程信息判断优先级最高进程把进程存储在调度序列并执行在未调度并已到达进程中寻找优先级最高进程打印调度成果所有进程被调度否是4. 在时间片调度算法模仿实现中,时间片就是分派给进程运营一段时间。在轮转法中,系统将所有可运营(即就绪)进程按先来先服务原则,排成一种队列,每次调度时把CPU分派给队首进程,并令其执行一种时间片。当某进程执行时间片用完时,系统发出信号,告知调度程序,调度程序便据此信号来停止该进程执行,并
7、将刚运营进程送到运营队列末尾,等待下一次执行;然后,把解决机分派给就绪队列中新队首进程,同步也让它执行一种时间片。这样就可以保证运营队列中所有进程,在一种给定期间内,均能获得一时间片解决机执行时间。实现函数(单独程序)重要实现办法如下:四、运营成果及分析设有如下3个进程:进程名称到达时间运营时间优先级A453B6101C582注:优先级一栏,数字大表达优先级越高。依照本例来运营本算法,成果如下:采用先来先服务算法:采用优先级调度:采用短作业优先:时间片轮转算法:本程序已通过测试阶段,未浮现进程调度错误状况。运营程序后,只需按照提示输入相应进程信息(进程名尽量输入单个字母)后选取需要调度算法即可
8、得出相应成果,并且可以循环运营多次。后期进行相应美化加工,如需要,可进行可视化改造。成果分析:对于进程调度后得出各项数据基本精确,当输入时间或其她数据信息浮现精准度较高数值时也许会浮现某些误差,属于误差范畴之内。程序基本可以实现CPU调度算法过程解释。五、总结通过本次课程设计,更进一步理解了各个进程调度算法,及实现过程。在此过程中,遇到了困难,能及时请教同窗,查询有关资料,及时解决了问题,但仍有局限性之处,将会在此后学习中更加努力。六附录(完整代码)#includeusing namespace std;#define MAX 10struct task_struct char name10;
9、 /*进程名称*/ int number; /*进程编号*/ float come_time; /*到达时间*/ float run_begin_time; /*开始运营时间*/ float run_time; /*运营时间*/ float run_end_time; /*运营结束时间*/ int priority; /*优先级*/ int order; /*运营顺序*/ int run_flag; /*调度标志*/ tasksMAX;int counter; /*实际进程个数*/int fcfs(); /*先来先服务*/int ps(); /*优先级调度*/int sjf(); /*短作业优
10、先*/int hrrn(); /*响应比高优先*/int pinput(); /*进程参数输入*/int poutput(); /*调度成果输出*/int main() int option;pinput();printf(请选取调度算法(04):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(对进程按先来先服务调度。nn); fcfs(); brea
11、k;case 2: printf(对进程按优先级调度。nn); ps(); break;case 3: printf(对进程按短作业优先调度。nn); sjf(); break;int fcfs() /*先来先服务*/float time_temp=0;int i;int number_schedul;time_temp=e_time;for(i=0;icounter;i+) tasksi.run_begin_time=time_temp; tasksi.run_end_time=tasksi.run_begin_time+tasksi.run_time; tasksi.run_flag=1;
12、 time_temp=tasksi.run_end_time; number_schedul=i; tasksnumber_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=tasksi.priority;j=1;while (jtasksi.priority) max_priority=tasksj.priority; i=j; j+; /*查找
13、第一种被调度进程*/*对第一种被调度进程求相应参数*/number_schedul=i;tasksnumber_schedul.run_begin_time=tasksnumber_e_time;tasksnumber_schedul.run_end_time=tasksnumber_schedul.run_begin_time+tasksnumber_schedul.run_time;tasksnumber_schedul.run_flag=1;temp_time=tasksnumber_schedul.run_end_time;tasksnumber_schedul.order=1;tem
14、p_counter=1;while (temp_countercounter) max_priority=0; for(j=0;jcounter;j+) if(e_timemax_priority) max_priority=tasksj.priority; number_schedul=j; /*查找下一种被调度进程*/ /*对找到下一种被调度进程求相应参数*/ tasksnumber_schedul.run_begin_time=temp_time; tasksnumber_schedul.run_end_time=tasksnumber_schedul.run_begin_time+ta
15、sksnumber_schedul.run_time;tasksnumber_schedul.run_flag=1;temp_time=tasksnumber_schedul.run_end_time;temp_counter+;tasksnumber_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=tasksi.run_time;j=
16、1;while (jcounter)&(e_time=e_time) if (tasksj.run_timetasksi.run_time) run_time=tasksj.run_time; i=j; j+; /*查找第一种被调度进程*/*对第一种被调度进程求相应参数*/number_schedul=i;tasksnumber_schedul.run_begin_time=tasksnumber_e_time;tasksnumber_schedul.run_end_time=tasksnumber_schedul.run_begin_time+tasksnumber_schedul.run_
17、time;tasksnumber_schedul.run_flag=1;temp_time=tasksnumber_schedul.run_end_time;tasksnumber_schedul.order=1;temp_counter=1;while (temp_countercounter) for(j=0;jcounter;j+) if(e_time=temp_time)&(!tasksj.run_flag) run_time=tasksj.run_time;number_schedul=j;break; for(j=0;jcounter;j+) if(e_time=temp_time
18、)&(!tasksj.run_flag) if(tasksj.run_timerun_time) run_time=tasksj.run_time; number_schedul=j; /*查找下一种被调度进程*/ /*对找到下一种被调度进程求相应参数*/ tasksnumber_schedul.run_begin_time=temp_time; tasksnumber_schedul.run_end_time=tasksnumber_schedul.run_begin_time+tasksnumber_schedul.run_time; tasksnumber_schedul.run_fla
19、g=1; temp_time=tasksnumber_schedul.run_end_time; temp_counter+; tasksnumber_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;elsefor(i=0;icounter;i+) printf(*n); printf(please input
20、 the process of %d th :n,i+1); printf(please input the name:n); scanf(%s,tasksi.name); printf(please input the come_time:n); scanf(%f,&e_time); printf(please input the run_time:n); scanf(%f,&tasksi.run_time); printf(please input the priority:n); scanf(%d,&tasksi.priority); tasksi.run_begin_time=0; t
21、asksi.run_end_time=0; tasksi.order=0; tasksi.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_timen);for(i=0;icounter;i+) f1=tasksi.run_end_time-e_time; turn_round_time+=f1; w+=(f1/ta
22、sksi.run_time); printf( %s, %5.3f, %5.3f, %5.3f, %5.3f, %d, %d, %5.3fn,tasksi.name,e_time,tasksi.run_time,tasksi.run_begin_time,tasksi.run_end_time,tasksi.priority,tasksi.order,f1);printf(average_turn_round_timer=%5.2fn,turn_round_time/counter);printf(weight_average_turn_round_timer=%5.2fn,w/counter
23、);return 0;#include #include #define Myprintf printf(|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|n)typedef struct PCBint ID;int ReachTime;int TotalTime;PCB;/进程号,到达时间和服务时间typedef struct NOTE /备份int ID;int TotalTime;NOTE;PCB A100; /5个进程PCB a100;NOTE temp;int queue50;/记录调度进程int K=0;/调度进程数组标记void INIT(int M)/初
24、始化int i;int m;m=M;for(i=0;im;i+)Ai.ID=-1;int GetNum(int M)/计算进程数int m;m=M;int i;int j=0;for(i=0;im;i+)if(Ai.ID!=-1)j+;return j;int GetReach(int time,int M)/找出到达进程号int i;int m;m=M;for(i=0;im;i+)if(ai.ReachTime=time)ai.ReachTime=100;return i;return -1;int GetInsert(int M)/找出插入位置int i;int m;m=M;for(i=0
25、;im;i+)if(Ai.ID=-1)return i;return -1;void Forward(int num)/前移int i;for(i=0;inum-1;i+)Ai.ID=Ai+1.ID;Ai.TotalTime=Ai+1.TotalTime;Anum-1.ID=-1;void Process(int Jiange)/执行进程 int jiange; jiange=Jiange;queueK=A0.ID;K+;A0.TotalTime=A0.TotalTime+jiange;temp.ID=A0.ID;temp.TotalTime=A0.TotalTime;int main()in
26、t i;int time;int t=0;int reach;int insert;int num;int M;int Jiange;printf(RR算法nn);printf(请输入进程个数n);scanf(%d,&M);printf(请输入R值n);scanf(%d,&Jiange);INIT(M);for(i=0;iM;i+)printf(请输入进程ID:);scanf(%d,&ai.ID);printf(请输入到达时间:);scanf(%d,&ai.ReachTime);printf(请输入服务时间:);scanf(%d,&ai.TotalTime);for(i=0;iM;i+)/运营
27、时间t=t+ai.TotalTime;for(i=0;i50;i+)/初始化queuei=-1;for(time=0;time=t;time+)reach=GetReach(time,M);if(reach!=-1)/有进程到达insert=GetInsert(M);Ainsert.ID=areach.ID;Ainsert.TotalTime=areach.TotalTime;num=GetNum(M);if(num=1)continue;/进程数为1else/进程数不为1Process(Jiange);Forward(num);if(temp.TotalTime!=0)Anum-1.ID=t
28、emp.ID;Anum-1.TotalTime=temp.TotalTime;else/没有进程到达num=GetNum(M);if(num=1)/进程数为1Process(Jiange);if(temp.TotalTime=0)A0.ID=-1;else if(num=0)continue;/进程数为0elseProcess(Jiange);Forward(num);if(temp.TotalTime!=0)Anum-1.ID=temp.ID;Anum-1.TotalTime=temp.TotalTime;printf(n);printf(调度顺序为:n);Myprintf;for(i=0;
29、i50;i+)if(queuei!=-1)printf(|%2d ,queuei);printf(|n);Myprintf;printf(n);return 0;设计2 死锁有关算法实现一、设计目编写算法,实现银行家算法、安全性算法、死锁检测算法判断系统安全状态、判断进程资源祈求与否可以被满足、鉴定系统与否为死锁状态。银行家算法是避免死锁一种重要办法,通过编写一种简朴银行家算法程序,加深理解关于资源申请、避免死锁等概念,并体会和理解死锁和避免死锁详细实行办法。二、设计规定其中算法所需各种参数由输入产生(手工输入或者随机数产生)本模块课程设计基本规定是可以输出各种鉴定成果(与否安全、安全序列、与
30、否死锁、与否容许分派)。三、 设计阐明1、算法思路:先对顾客提出祈求进行合法性检查,即检查祈求与否不不大于需要,与否不不大于可运用。若祈求合法,则进行预分派,对分派后状态调用安全性算法进行检查。若安全,则分派;若不安全,则回绝申请,恢复到本来状态,回绝申请。2、银行家算法环节:(1)如果Requestior =Need,则转向环节(2);否则,以为出错,由于它所需要资源数已超过它所宣布最大值。(2)如果Requestor=Available,则转向环节(3);否则,表达系统中尚无足够资源,进程必要等待。(3)系统试探把规定资源分派给进程Pi,并修改下面数据构造中数值: Available=Av
31、ailable-Requesti; Allocation=Allocation+Request;Need=Need-Request;(4)系统执行安全性算法,检查本次资源分派后,系统与否处在安全状态。 3、安全性算法环节: (1)设立两个向量工作向量Work。它表达系统可提供进程继续运营所需要各类资源数目,执行安全算法开始时,Work=Allocation;布尔向量Finish。它表达系统与否有足够资源分派给进程,使之运营完毕,开始时先做Finishi=false,当有足够资源分派给进程时,令Finishi=true。(2)从进程集合中找到一种能满足下述条件进程:Finishi=falseNe
32、ed0|requestij0)Finish=false判断开始运用c+实现对这三个算法进行实现,通过自定义进程数和进程资源各项数据状况对其进行分派,将其用函数分开,在实现每一步时进行调用。重要函数如下:showdata()/显示资源矩阵int changdata(int i)/进行资源分派int safe()/安全性算法void share()/运用银行家算法对申请资源对进行鉴定int compare(int *request,int *work,int N,int k) /如果Requestiwork则返回false,即对需求与既有资源比较int check(int *work,int *r
33、equest,int *allocation,int *finish,int *p,int m,int n)/调用安全公式进行检测void jiesuo(int *work,int *request,int *allocation,int *finish,int *p,int m,int n) /解锁函数voidoperate(int *work,int *request,int *allocation,int *finish,int *p,int m,int n)/操作函数int main()/主函数四、 运营成果及分析假设系统中有三个进程p,q,r和三类资源a,b,c,各种资源数量分别为1
34、0,5,7,在T0时刻资源分派状况如图资源状况进程Maxa b cAllocationa b cNeeda b c Availablea b c P7 5 3 0 1 07 4 33 3 2 Q3 2 22 0 01 2 2 R9 0 23 0 26 0 0运营程序后输入数据如图使用银行家算法所分派状况和安全检查状况为死锁检测与排除运营成果为这两个程序已经完毕了对进程以资源之间检测与分派功能,并且可以在给出资源分派状况后检测需求与否会发生死锁状况并给出解除方案。运营程序后只需按照提示操作即可观测到进程对资源调用状况。五、 总结 各种进程同步运营时,系统依照各类系统资源最大需求和各类系统剩余资源为进程安排安全序列,使得系统能迅速且安全地运营进程,不至发生死锁。银行家算法是避免死锁重要办法,其思路在诸多方面都非常值得咱们来学习借鉴。通过对算法编写让我理解到计算机在调度进程时详细过程,也明白理解决死锁原理。六、附录#include#include#include#define False 0#define True 1int Max1