【基础小白】模拟 多级+抢占式 反馈优先队列MRLA的思路解析(Linux + C)福利:基础调度模拟实现代码

阅读: 评论:0

【基础小白】模拟 多级+抢占式 反馈优先队列MRLA的思路解析(Linux + C)福利:基础调度模拟实现代码

【基础小白】模拟 多级+抢占式 反馈优先队列MRLA的思路解析(Linux + C)福利:基础调度模拟实现代码

最近学了操作系统的 任务调度的 章节。模拟了一些基础调度算法的实现,FCFS,SJF,HRF,TimeSlice,以及这次要记录详细的MFQS(Multilevel Feedback Queue Scheduling)。最近这两个月刚开始os的学习,所用的方法也比较简单和无脑。

模拟多级反馈优先队列MRLA

  • 思路
    • 代码
      • 测试结果

从例题引入把:假设存在这样一个批任务
例题三:在某一操作系统中对进程调度采用多级反馈队列调度算法。现设定采用三级反馈队列调度算法,三个队列分别为I、II、III,对应时间片为2、4、8。现有四个进程A、B、C、D,到达时刻分别为0、5、7、12,执行时间分别为7、4、13、9。请写出整个进程调度过程。
关键字:多级反馈 、抢占式

思路

任务数据:

进程ABCD
到达时刻05712
执行时间74139
剩余时间74139

就绪队列:

队列ABC
优先级012
时间片248

关于人工计算的话:
一些规则
规则:每个进程如果没指定优先级,默认是0;数值越大优先级越低。
① 抢占进程会被放在最高优先级队列,因为它默认是非常紧急的
② 被抢占的进程会被重新插入到 当前队列的末尾重新排队,继续使用剩下的时间片时间。
③ 进程在时间片时间内提前完成,则可以提前切换进程。
因此,每一个任务的执行过程有两种:
          ① 不会被抢占:这种情况又可以分两种,时间片用完了还没完成该作业,则exectime=时间片; 进程降级,进入下一个较低的就绪队列尾部等待调度。
时间片未用完进程就结束了,则exectime=进程剩下的执行时间time_left.,设置状态为结束。

          ②会被抢占:执行到一半被高优先级的进程抢了cpu资源。这种情况可以分两中,在抢占之前进程就结束了,完成执行了。因此exec=left_time;,设置状态为结束;
被抢占时,进程未完成,则exec=抢占时间-开始执行时间。注意,注意这里,同优先级的进程来的时候,不会发生抢占,而是默默排到同优先级队列末尾,等待进程执行完后,再按照顺序调度。将抢占进程放入最高队列排队执行,被抢占进程则进入当前队列重新排队。

流程应该是这样子的
对已经到达的任务,按照时间大小从小到大排序。
(1) 先将第一个到达的任务放进 最高优先级队列,等待调度。
(2) 从高到低判断队列是否为空,取到非空队列的第一个任务:分析可执行时间
(3) 计算出真实的时间后,执行进程就可以被执行了。
重复(2)(3)步骤,直到所有的任务都完成。

**手工计算示例结果: **

略丑略丑,随笔写的。。。
关于一些具体代码实现问题:
例如,被抢占的任务,怎么续上之前的时间片?我这里用的是一个time_used变量记录 每个任务已用的时间片长度。具体如果操作看代码:

代码

一个彩蛋 福利:所有的基本 调度算法 实现都附上了

//FCFS  +  SJF+ HRF+TimeSlice+MFQL  代码实现都在这里有
```c
#include<sched.h>
#include<unistd.h>
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
/** argv :num ,priority,policy*/
int main(int argc,char* argv[])
{if(argc<3){perror("error!n");return 0;}int priority =atoi(argv[1]);int policy =atoi(argv[2]);printf("i am pid %d,pripority=%d,policy=%d[fifo:1,rr:2]n",getpid(),priority,policy);struct sched_param param;param.sched_priority = priority;int ret=sched_setscheduler(getpid(),policy,&param);if(ret<0){printf("set scheduler failed n");return -4;}	unsigned int count=0;int flag=1;while(1){count++;if(flag&&count>777777777){flag=0;count=0;}if(count>99999999&&flag==0){count=0;flag=1;time_t t;time(&t);if(policy==SCHED_FIFO)printf("SCHED_FIFO =====pid:%d; t:%s",getpid(),ctime(&t));else if(policy==SCHED_RR)printf("SCHED_RR ~~~~~pid:%d; t:%s",getpid(),ctime(&t));}}return 0;}

测试结果

单纯测试 多级反馈的代码
调度的顺序为:AAB CABC DCDAC D

代码执行结果是:


过程如下:



代码里面还调节了 色系,
- 红色是执行完成,
- 绿色是正在执行
- 蓝色是执行到一般被抢占
- 紫色是 正常执行完一个时间片
····
END 学习愉快!风吹有日晒啊,子悠游自在啊。

本文发布于:2024-01-30 20:34:05,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170661804622654.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:基础   队列   福利   思路   反馈
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23