最近学了操作系统的 任务调度的 章节。模拟了一些基础调度算法的实现,FCFS,SJF,HRF,TimeSlice,以及这次要记录详细的MFQS(Multilevel Feedback Queue Scheduling)。最近这两个月刚开始os的学习,所用的方法也比较简单和无脑。
从例题引入把:假设存在这样一个批任务
例题三:在某一操作系统中对进程调度采用多级反馈队列调度算法。现设定采用三级反馈队列调度算法,三个队列分别为I、II、III,对应时间片为2、4、8。现有四个进程A、B、C、D,到达时刻分别为0、5、7、12,执行时间分别为7、4、13、9。请写出整个进程调度过程。
关键字:多级反馈 、抢占式
思路
任务数据:
进程 | A | B | C | D |
---|---|---|---|---|
到达时刻 | 0 | 5 | 7 | 12 |
执行时间 | 7 | 4 | 13 | 9 |
剩余时间 | 7 | 4 | 13 | 9 |
就绪队列:
队列 | A | B | C |
---|---|---|---|
优先级 | 0 | 1 | 2 |
时间片 | 2 | 4 | 8 |
关于人工计算的话:
一些规则 :
规则:每个进程如果没指定优先级,默认是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,¶m);
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 学习愉快!风吹有日晒啊,子悠游自在啊。