提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、 实验目的
  • 二、 实验原理
  • 结果截图

前言

提示:这里可以添加本文要记录的大概内容:


提示:以下是本篇文章正文内容,下面案例可供参考

一、 实验目的

LLF 算法:该算法是根据任务紧急(或松弛)的程度,来确定任务的优
先级。任务的紧急程度愈高,为该任务所赋予的优先级就愈高,以使
之优先执行。例如,一个任务在 200ms 时必须完成,而它本身所需的
运行时间就有 100ms,因此,调度程序必须在 100ms 之前调度执行,
该任务的紧急程度(松弛程度)为 100ms。又如,另一任务在 400ms 时
必须完成,它本身需要运行 150ms,则其松弛程度为 250ms。在实现
该算法时要求系统中有一个按松弛度排序的实时任务就绪队列,松弛
度最低的任务排在队列最前面,调度程度总是选择就绪队列中的队首
任务执行。

二、 实验原理

!

完成时间 = 开始时间 + 需要运行时间周转时间 = 完成时间 - 到达时间
平均周转时间 = (完成时间 - 到达时间)/进程数
平均带权周转时间 = (周转时间 / 需要运行时间)/进程数

include <iostream>
#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <random>
#include <ctime>
#include <functional>
#include <algorithm>
#include <queue>using namespace std;
static int MAXCUM = 5;//RR算法-定义进程最多为5个
static int  currentTime = 0;//初始化当前时间为0
#define E 0//表示进程处于End状态
#define W 1//表示进程处于wait状态
static int NameSeed[20] {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
static int flagA = 0;//进程名字标记
static int flagB = 0;
static int timeSlice = 0;//初始化时间片值为0class process
{public:process(string processName, int runTime, int status){this->m_ProcessName = processName;this->m_RunTime =  runTime;this->m_Status = status;}string m_ProcessName;int m_MinimumTolerance;//最小容忍度int m_NeedRunTime;//还需要的运行时间int m_HaveRunTime;//已经运行的时间int m_RunTime;//运行时间int m_Looseness;//松弛度int m_Status;//W和E的状态标记int m_Deadline;//截止时间int m_ArriveTime;int m_FinishTime;int m_TurnaroundTime;//周转时间double m_AuthorityTurnaroundTime;//带权周转时间bool operator<( const process &p)const{return m_ArriveTime<p.m_ArriveTime;}
};int calcuLoose(process p, int currentTime)
{p.m_Looseness= p.m_Deadline - currentTime - p.m_NeedRunTime;return p.m_Looseness;
}
int calcuNeedRunTime(process p, int currentTime)
{p.m_NeedRunTime = p.m_RunTime - p.m_HaveRunTime;return p.m_NeedRunTime;
}
int calcuMinimumTolerance(process p, int currentTime)
{p.m_MinimumTolerance = p.m_Deadline - p.m_NeedRunTime;return p.m_MinimumTolerance;
}
int calcuTurnaroundTime(process p)
{p.m_TurnaroundTime = p.m_FinishTime - p.m_ArriveTime;return p.m_TurnaroundTime;
}
double calcuAuthorityTurnaroundTime(process p)
{p.m_AuthorityTurnaroundTime = p.m_TurnaroundTime / p.m_RunTime;return p.m_AuthorityTurnaroundTime;
}
void LLF(process p1,process p2)
{for (int i = 0; i < 10; i++){if (calcuLoose(p1, currentTime) == 0)//立刻执行p1{cout << " " << p1.m_ProcessName << NameSeed[flagA] << "从"<<currentTime<<"执行到";currentTime = p1.m_Deadline;cout << currentTime;p1.m_ArriveTime += 20;flagA++;//通过更改名字的方式仿佛利用2个进程实现进程的创建p1.m_Deadline += 20;//创建第二个进程p1.m_MinimumTolerance = p1.m_Deadline - 10;calcuNeedRunTime(p1, currentTime);//以下代码均为更新数据calcuMinimumTolerance(p1, currentTime);calcuLoose(p1, currentTime);calcuNeedRunTime(p2, currentTime);calcuMinimumTolerance(p2, currentTime);calcuLoose(p2, currentTime);if (p1.m_ArriveTime > currentTime){p1.m_Status = E;}else{p1.m_Status = W;}}else if (calcuLoose(p2, currentTime) == 0)//立刻执行p2{cout << " " << p2.m_ProcessName << NameSeed[flagB] << "从" << currentTime << "执行到";currentTime = p2.m_Deadline;cout << currentTime;p2.m_ArriveTime += 50;flagB++;p2.m_Deadline += 50;p2.m_MinimumTolerance = p2.m_Deadline - 25;calcuNeedRunTime(p2, currentTime);calcuMinimumTolerance(p2, currentTime);calcuLoose(p2, currentTime);calcuNeedRunTime(p1, currentTime);calcuMinimumTolerance(p1, currentTime);calcuLoose(p1, currentTime);if (p2.m_ArriveTime > currentTime){p2.m_Status = E;}else{p2.m_Status = W;}}else{while ((calcuLoose(p1, currentTime) < calcuLoose(p2, currentTime)) || p1.m_Status == E)//p1抢占执行{for (; calcuNeedRunTime(p1, currentTime) != 0; currentTime++)//正在执行p1{while (currentTime == calcuMinimumTolerance(p2, currentTime))//当p1正在执行但未执行完时,时间达到了p2的最低容忍时间,执行p2{cout << " " << p2.m_ProcessName << NameSeed[flagB] << "从" << currentTime << "执行到";currentTime = p2.m_Deadline;cout << currentTime;flagB++;p2.m_ArriveTime += 50;p2.m_Deadline += 50;p2.m_MinimumTolerance = p2.m_Deadline - 25;p2.m_HaveRunTime = 0;calcuNeedRunTime(p2, currentTime);calcuMinimumTolerance(p2, currentTime);calcuLoose(p2, currentTime);calcuNeedRunTime(p1, currentTime);calcuMinimumTolerance(p1, currentTime);calcuLoose(p1, currentTime);if (p2.m_ArriveTime > currentTime){p2.m_Status = E;}else{p2.m_Status = W;}break;}cout << " " << p1.m_ProcessName << NameSeed[flagA] << "执行";cout << "-" << currentTime << " ";p1.m_HaveRunTime += 1;calcuNeedRunTime(p1, currentTime);calcuMinimumTolerance(p1, currentTime);calcuLoose(p1, currentTime);}p1.m_ArriveTime += 20;flagA++;p1.m_Deadline += 20;p1.m_MinimumTolerance = p1.m_Deadline - 10;p1.m_HaveRunTime = 0;calcuNeedRunTime(p1, currentTime);calcuMinimumTolerance(p1, currentTime);calcuLoose(p1, currentTime);calcuNeedRunTime(p2, currentTime);calcuMinimumTolerance(p2, currentTime);calcuLoose(p2, currentTime);if (p1.m_ArriveTime > currentTime){p1.m_Status = E;}else{p1.m_Status = W;}break;}while ((calcuLoose(p2, currentTime) < calcuLoose(p1, currentTime)) || p1.m_Status == E)//p2抢占执行{for (; calcuNeedRunTime(p2, currentTime) != 0; currentTime++)//正在执行p2{while (currentTime == calcuMinimumTolerance(p1, currentTime))//当p2正在执行但未执行完时,时间达到了p1的最低容忍时间,执行p1{cout << " " << p1.m_ProcessName << NameSeed[flagA] << "从" << currentTime << "执行到";currentTime = p1.m_Deadline;cout << currentTime;p1.m_ArriveTime += 20;flagA++;p1.m_Deadline += 20;p1.m_MinimumTolerance = p1.m_Deadline - 10;p1.m_HaveRunTime = 0;calcuNeedRunTime(p1, currentTime);calcuMinimumTolerance(p1, currentTime);calcuLoose(p1, currentTime);calcuNeedRunTime(p2, currentTime);calcuMinimumTolerance(p2, currentTime);calcuLoose(p2, currentTime);if (p1.m_ArriveTime > currentTime){p1.m_Status = E;}else{p1.m_Status = W;}break;}cout << " " << p2.m_ProcessName << NameSeed[flagB] << "执行";cout << "-" << currentTime << " ";p2.m_HaveRunTime += 1;calcuNeedRunTime(p2, currentTime);calcuMinimumTolerance(p2, currentTime);calcuLoose(p2, currentTime);}p2.m_ArriveTime += 50;flagB++;p2.m_Deadline += 50;p2.m_MinimumTolerance = p2.m_Deadline - 25;p2.m_HaveRunTime = 0;calcuNeedRunTime(p2, currentTime);calcuMinimumTolerance(p2, currentTime);calcuLoose(p2, currentTime);calcuNeedRunTime(p1, currentTime);calcuMinimumTolerance(p1, currentTime);calcuLoose(p1, currentTime);if (p2.m_ArriveTime > currentTime){p2.m_Status = E;}else{p2.m_Status = W;}break;}}}
}int CompareRunTime(vector<int> v)
{sort(v.begin(), v.end(), greater<int>());//sort默认升序排序,加greater后变为降序排序return v[0];
}int main()
{//LLF算法部分cout << "--------------LLF算法部分-----------" << endl;currentTime = 0;//初始化时间片为0process A("进程A",10,W);//初始化进程名字 进程的运行时间 进程的状态process B("进程B",25,W);A.m_Deadline = 20;B.m_Deadline = 50;A.m_Looseness = 10;B.m_Looseness = 25;A.m_HaveRunTime = 0;B.m_HaveRunTime = 0;A.m_NeedRunTime = 10;B.m_NeedRunTime = 25;A.m_MinimumTolerance = 10;B.m_MinimumTolerance = 25;A.m_ArriveTime = 0;B.m_ArriveTime = 0;LLF(A, B);system("pause");return 0;

结果截图

结果是丑了点~~~,但是代码是自己纯手写,无任何抄袭,结果保证是对的。
部分代码看不懂的,应该是对英文命名规则不了解,可以自己翻译下就好理解了。

C++操作系统LLF算法实现相关推荐

  1. 操作系统 先来先服务算法(FCFS)、最短寻到时间优先算法(SSTF)、扫描算法(电梯算法,SCAN)、循环扫描算法(CSCAN)

    操作系统 先来先服务算法(FCFS).最短寻到时间优先算法(SSTF).扫描算法(电梯算法,SCAN).循环扫描算法(CSCAN)和N步扫描算法(NStepScan)的程序实现 复制到本地即可运行 # ...

  2. 最早截止时间有限(EDF)算法、最低松弛度优先(LLF)算法

    最早截止时间有限(EDF)算法: 截止时间越早,优先级越高 最低松弛度优先(LLF)算法: 松弛度=完成截止时间-仍需运行时间-当前时间 松弛度越低优先级越高,当正在执行时有其他松弛度更低的进程进入队 ...

  3. 计算机操作系统——先到先服务算法(C#))

    计算机操作系统--先到先服务算法(C#) 什么是先到先服务 周转时间以及带权周转时间 流程图 源代码 运行截图 什么是先到先服务 如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,那 ...

  4. 2021-06-04 操作系统FIFO算法C语言实现

    操作系统FIFO算法C语言实现 前言 本机为微软Surface pro4,为64位,所用操作系统为Windos 10.本机虚拟机版本为Oracle VM VirtualBox 6.1.8,所用操作系统 ...

  5. 操作系统FIFO算法(先进先出算法)

    操作系统FIFO算法(先进先出算法) 简介:本文章是作者学习操作系统期间所创作的FIFO算法. import java.util.*; /** 这是一个分页算法FIFO* */public class ...

  6. 操作系统——银行家算法(银行家和房地产开发商的爱恨情仇)

    操作系统--银行家算法 什么是银行家算法 银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避 ...

  7. 超硬核!学霸把操作系统经典算法给敲完了!要知行合一

    上期的笔记,浏览快1万了,既然关注的人很多,那就发出来承诺过的算法全模拟,希望帮到你们. 上期的操作系统学霸笔记,考试复习面试全靠它 一.模拟进程调度 功能 data.h #ifndef _Data_ ...

  8. 深入理解 操作系统 LRU算法(以洛谷P1540题为例)

    LRU算法 LeastRecentlyUsedLeast Recently UsedLeastRecentlyUsed 算法,意为"最近最少使用",这是操作系统内存管理部分重要的一 ...

  9. 操作系统银行家算法计算机四级,【NCRE四级网络工程师】操作系统多选题

    友情提示:此篇文章大约需要阅读 7分钟54秒,不足之处请多指教,感谢您的阅读. 保存在进程控制块中的是 进程标识符 进程当前状态 代码段指针 PCB的内容可以分为调度信息和现场信息两大部分.调度信息供 ...

最新文章

  1. 剑指offer:翻转单词顺序列
  2. daily scrum 12.1
  3. Vue.js-Day05【安装路由(vue-router)、如何使用vue-router、404配置、激活class、动态路由、编程式导航、路由嵌套、路由元信息、导航拦截】
  4. mysql clob转string_Java获取Oracle中CLOB字段转换成String
  5. 微软 Ignite 大会 PowerBI 划重点
  6. 在落雨的鼓浪屿打着伞到处走走找个地方坐坐
  7. Linux学习笔记-标准库中的管道操作
  8. oracle 的控制结构
  9. 2021湖南高考成绩分段查询,2021年湖南高考成绩排名查询系统,湖南高考位次排名查询...
  10. 动态规划 之 完全背包
  11. 支付宝对账单和微信对账单下载保存数据库
  12. 读书随记——《傲慢与偏见》(4)
  13. Linux卸载挂载点时,会遇到“device is busy”提示
  14. python模拟蚂蚁森林能量产生过程代码_用Python实现定时自动化收取蚂蚁森林能量,再也不用担心忘记收取了...
  15. linux debian u盘安装,Debian U盘安装盘,debian安装盘
  16. P1926 小书童——刷题大军
  17. GCC 命令行详解 -L -l
  18. 航空航天工业科研项目管理探析
  19. win10通过命令或通过控制面板关闭防火墙
  20. 笔记本怎么查看hdmi版本_涨知识丨一文看懂笔记本电脑HDMI接口

热门文章

  1. m1 android emulator 无法共享复制剪切板
  2. 今日股市笔记-20200309
  3. GRIT: Consistent Distributed Transactions across Polyglot Microservices with Multiple Databases
  4. vue修改浏览器标签名的办法
  5. ondblclick
  6. 华傲数据正式加入openGauss社区
  7. torch.optim.Adam参数
  8. 1752年9月奇怪的日历
  9. 计算机相关双人相声,二人相声!搞笑的相声剧本《我的好兄弟》
  10. 作为部门领导,自己天天撸代码忙成狗,下属却没事干,怎么办?丨管理课推荐...