【基础小白】模拟 多级+抢占式 反馈优先队列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 学习愉快!风吹有日晒啊,子悠游自在啊。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值