最低松弛度调度算法模拟
实 验 报 告(拓展实验2)
最低松弛度调度算法模拟
课程名称 操作系统实验
学生学院 计算机学院
专业班级 17网络工程一班
学生姓名 陈鸿
指导教师 林穗
2019 年 12 月 7 日
目录
//寻找松弛度 <=0 的抢占进程,替代当前最小松弛度进程 6
Tips:建议打开word【导航视图】与批注阅读,数据结构部分的代码编辑在【批注】内。
拓展实验2:最低松弛度算法模拟
实验目的
分析操作系统的核心功能模块,理解相关功能模块实现的数据结构和算法,并加以实现,加深对操作系统原理和实现过程的理解。本次实验:使用c语言模拟最低松弛度算法的执行过程,并分析在松弛度相同的时候最近最久未使用算法如何发挥作用。
二、实验内容
最低松弛度优先(LLF)算法概述:
该算法是根据任务紧急(或松弛)的程度,来确定任务的优先级。
任务的紧急程度愈高,为该任务所赋予的优先级就愈高,使之优先执行。在实现该算法时要求系统中有一个按松弛度排序的实时任务就绪队列,松弛度最低的任务排在队列最前面,被优先调度。
松弛度的计算公式:
任务的松弛度=必须完成的时间-其本身的运行时间-当前时间
算法特点:
(1)主要用于抢占式调度方式。
(2)抢占时机:松弛度为零时
(3)实用于周期性任务的调度。
三、实现思路
(1)进程循环队列属性及遍历
队列中的进程以数组的形式进程存储;队列的队首为front,队尾为rear,遍历时要考虑队空否,或者输入进程时,要考虑进程是否填满了队列。
循环队列,队空为:front == rear
队满为:(rear+1)%queuesize == front
(2)程序中松弛度的计算
松弛度 = 任务必须完成的时间 — 任务本身的运行时间 — 当前时间;
即松弛度 = 周期*需执行的次数 —(上一次)执行的剩余时间 —当前时间
即松弛度= deadtime× cycle — lefttime — currenttime
而(可能被中断过)进程最迟开始执行时间arivetime = deadtime× cycle —lefttime
所以arivetime— currenttime <=0 ,即为松弛度为0,抢占当前正在运行进程。
(3)最小松弛度的进程
采用遍历队列中当前时间下可以开始运行的进程,即最早开始时间:arivetime=deadtime*( cycle-1) 小于当前时间,比较各进程松弛度,得出最小松弛度的进程。
(4)进程的抢占
由上可知进程的松弛度的计算方法,依旧采用遍历队列的方式,循环寻找松弛度为0 的进程:如果存在就让其跳出循环,返回该进程;否则,队首指针向下,直至队尾,如果遍历完都不存在松弛度为0的进程,则返回当前进程即可。但未考虑松弛度同时为0的进程存在多个的情况。
(5)时钟
由于是实时系统,我们采用时钟计时法。即在每1ms的时间变化时,都要进行LLF进程的选择。即在当前时间currenttime下,currenttime初始为0,循环++,直至到达执行总时间MAXTIME。
(6)最低松弛度相同的若干进程调度
对于出现多个进程松弛度相同且为最小时,选择的原则是,刚刚执行过的进程,此时应不再执行,让给其他具有同样最低松弛度的进程。
最开始选择的是每次都采用最接近队尾的进程。在遍历的过程中,将当前队列赋给一临时队列,对临时队列进行遍历,所以并不改变原队列的队首队尾指针。在每次选择最低松弛度的进程时,我们都是选择离队尾最近的进程,但这样存在着松弛度相同时进程选择的问题。最后选择最近最久未使用(LRU)算法的思想得以解决。即给每一个进程设置一个计数器。
(7)currenttime 在边界值时的情况
在currenttime == MAXTIME时,可能存在进程正好要开始执行,例如题目所给的例子:100ms时,A进程要开始执行,但是我们不应让其开始执行,所以应该临界处理;
同理,可能也存在进程正在执行当中,此时应该输出该进程在没有完成其周期执行时间的下的运行时间段。
(8)当前时刻无进程运行的情况
假若只有一个进程,周期时间是20ms,执行时间是10ms,那么在10—20ms、30—40ms、50—60ms……时,是没有进程运行的情况,即此时最低松弛度的进程为空。
四、主要的数据结构
//头文件与宏定义
#include <stdio.h>
//进程结构体
typedef struct process //进程
//循环队列
typedef struct sqqueue
//初始化n个进程
void Initprocess(process *pro,int n)
//初始化队列(队空)
void InitQueue(sqqueue *que)
//从当前队列中找到最低松弛度的进程
process *llf(sqqueue *dui, int currenttime)
//寻找松弛度 <=0 的抢占进程,替代当前最小松弛度进程
process *leastlaxityfirst(sqqueue *dui,int currenttime)
//从队列中读取进程的过程
void LLF_Process( sqqueue *dui )
//主函数
int main()
五、算法流程图
六、运行与测试
测试一:有抢占进程的情况
数据输入阶段:
进程调度过程:
测试二:截止时,某进程还没运行完
数据输入阶段:
进程调度过程:
七、总结
1. 该算法主要用于可抢占调度方式中,当一任务的最低松弛度减为0时,它必须立即抢占CPU,以保证按截止时间的要求完成任务。
2. 计算关键时间点的各进程周期的松弛度,当进程在当前周期截止时间前完成了任务,则在该进程进入下个周期前,无需计算它的松弛度。
3. 当出现多个进程松弛度相同且为最小时,按照"最近最久未调度"的原则进行进程调度。