最近学了操作系统的 任务调度的 章节。模拟了一些基础调度算法的实现,FCFS,SJF,HRF,TimeSlice,以及这次要记录详细的MFQS(Multilevel Feedback Queue Scheduling)。最近这两个月刚开始os的学习,所用的方法也比较简单和无脑。
任务数据:
进程 | 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 学习愉快!风吹有日晒啊,子悠游自在啊。
本文发布于:2024-01-30 20:34:05,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170661804622654.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |