历程调理算法的分析、设计与实现(110)
一、 本实验采取的调理算法设计理论形貌(10分)
- FCFS(先来先服务):当在历程调理中采取该算法时,系统将按照历程到达的先后顺序来举行调理,大概说它是优先思量在系统中期待时间最长的历程,而不管该历程所需执行的时间的是非,从后备队列中选择几个最先进入该队列的历程,将他们调入内存,为他们分配资源和创建历程,然后把它放入停当队列。每次调理是从停当的历程队列中选择一个最先进入该队列的历程,为之分配处置惩罚机,使之投入运行。该历程一直运行到完成或发生某事件而阻塞后,历程调理程序才将处置惩罚机分配给其他历程 。
- SPF(短历程优先):以历程的是非来盘算优先级,历程越短其优先级越高。历程的是非是以历程所要求的运行时间来权衡的。SPF算法可以用于历程调理。把短历程优先调理算法用于历程调理时,它将从外存的历程后备队列中选择若干个估计运行时间最短的历程,优先将它们调入内存运行。
- RR(时间片轮转):系统根据FCFS计谋,将所有的停当历程排成一个停当队列,并可设置每隔一定时间隔断即产生一次中断,激活系统中的历程调理顺序,完成一次调理,将CPU分配给队首历程,令其执行。当该历程的时间片耗尽或运行完毕时,系统再次将CPU分配给新的队首历程(或新到达的告急历程).由此,可包管停当队列中的所有历程在一个确定的时间段内,都可以或许获得一次CPU执行。
- HPF(优先级调理算法):
非抢占式优先权调理算法
系统一旦把处置惩罚机分配给优先权最高的历程后,便一直执行下去,至完成。
- 抢占式优先权调理算法
只要系统中出现一个新的停当历程,就举行优先权比力。若出现优先权更高的历程,则立刻停止当前执行,并将处置惩罚机分配给新到的优先权最高的历程。
- HRRN(高响应比优先调理算法):高响应比优先调理算法的基本思想是把CPU分配给停当队列中响应比最高的历程,既思量作业的执行时间也思量作业的期待时间,综合了先来先服务和最短作业优先两种算法的特点。
该算法中的响应比是指作业期待时间与运行比值,响应比公式界说如下:
响应比 =(期待时间+要求服务时间)/ 要求服务时间
即:响应比盘算:Ri = (Tw/Ts)+1 此中:Tw:期待时间;Ts:服务时间
二、数据布局模子及算法形貌(必须画流程图)(15分)
1.PCB的界说(5分)
系统利用PCB来形貌历程的基本情况和运动过程,进而控制和管理历程,PCB中记录了利用系统所需要的、用于形貌历程情况及控制历程运行所需要的全部信息,PCB是历程实体的一部分,是利用系统中最重要的记录型数据布局。
PCB的数据布局
struct pcb{ // 界说一个布局体,内里包罗的有一个历程相关的信息
char name[10]; //历程名称
float arrivetime; //到达时间
float servicetime; //服务时间
float starttime; //开始时间
float finishtime; //结束时间
float zztime; //周转时间=finishtime-arrivetime
float dqzztime; //带权周转时间=zztime/servicetime
};
算法形貌
- 先来先服务算法FCFS
void FCFS(pcb *p,int N)
按照作业进入系统的先后序次来挑选作业,先进入系统的作业优先被挑选
- 短作业优先SJF
void sjff(pcb *p,int N)
对短作业大概短历程优先调理的算法,将每个历程与其估计运行时间举行关 联选取估计盘算时间最短的作业投入运行。
- 时间片轮转调理算法RR
void RunProcess()
每个历程被分配一个时间段,称作它的时间片,如果在时间片结束时历程还在运行,则CPU将被剥夺并分配给另一个历程。如果历程在时间片结束前阻塞或结束,则CPU当即举行切换。
- 高优先级调理算法HPF
void HPF()
在优先级调理算法中,优先执行高优先级的历程。在算法实现中,默认数值大的体现优先级高
- 高响应比优先调理算法HRRN
int hrrn(Node node,int t)
盘算历程响应比,选择高响应比的历程执行
2.流程图(10分)
先来先服务算法FCFS
短历程优先算法SPF
时间片轮转算法RR
优先级调理算法HPF
高响应比优先算法HRRN
三、源代码(可以另附C源程序文件)(40分)
1) FCFS.cpp(实现先来先服务算法)
[code]//先来先服务#include #include struct pcb{ // 界说一个布局体,内里包罗的有一个历程相关的信息 char name[10]; //历程名称 (输入) float arrivetime; //到达时间 (输入) float servicetime; //服务时间 (输入) float starttime; //开始时间 float finishtime; //结束时间 float zztime; //周转时间=finishtime-arrivetime float dqzztime; //带权周转时间=zztime/servicetime}; //输入历程信息void input(pcb *p, int N) //p为pdb数组名, N为pcb数组的元素个数 { int i; printf("\n"); printf("请输入历程的名字 到达时间 服务时间:\n"); for(i=0; i |