linux的进程分为两种

1.实时进程,优先级高,操作系统会优先执行这种进程

2.普通进程,大多数的进程都是这种进程

调度策略

unsigned int policy;

调度策略的定义

#define SCHED_NORMAL 0
#define SCHED_FIFO 1
#define SCHED_RR 2
#define SCHED_BATCH 3
#define SCHED_IDLE 5
#define SCHED_DEADLINE 6

配合调度策略的还有刚才我们说的优先级

int prio, static_prio, normal_prio;
unsigned int rt_priority;

优先级其实就是一个数值,实时进程的取值范围是0-99,普通进程的取值范围是100-139,

数字越小,优先级越高,可以看出来,所有实时进程的优先级都比普通进程的优先级高

实时调度策略

SCHED_FIFO SCHED_RR SCHED_DEADLINE

这三种调度策略都是针对实时进程的调度策略

SCHED_FIFO 这种调度策略是遵从先到先得的规则,

但是如果某个进程的优先级比另一个进程的优先级高

那么可以抢占该进程,也就是说高优先级的进程可以抢占低优先级的进程

SCHED_RR(轮流调度算法),采用时间片的方式,相同优先级的进程用完cpu的时间片后,就会被放到队列尾部,保证公平性

SCHED_DEADLINE

因为对于实时进程来说,进程需要在某个时间周期内执行完,否则就会出错

所以这种策略就是优先执行deadline时间距离当前时间最近的进程

普通调度策略

SCHED_NORMAL:针对普通进程

SCHED_BATCH:针对后台进程

SCHED_IDLE:是特别空闲的时候才跑的进程

我们重点说下普通进程的调度策略

普通进程的调度策略是

fair_sched_class,顾名思义,对于普通进程来说公平是最重要的

完全公平调度算法

linux里面实现了一个基于CFS的算法,全程是完全公平算法

在linux中,每一个进程都有一个vruntime(虚拟运行时间),如果一个进程正在运行,那么该进程的vruntime就会变大,没有运行的进程的vruntime不会改变

显然,那些vruntime少的进程需要优先执行,那么当cpu上当前正在运行的进程可以被抢占时就会选取所有进程中vruntime最小的进程

还有个问题,就是优先级的这个问题咋解决呢

在更新进程的运行统计量的时候可以看出来

/*
* Update the current task's runtime statistics.
*/
static void update_curr(struct cfs_rq *cfs_rq)
{
struct sched_entity *curr = cfs_rq->curr;
u64 now = rq_clock_task(rq_of(cfs_rq));
u64 delta_exec;
......
delta_exec = now - curr->exec_start;
......
curr->exec_start = now;
......
curr->sum_exec_runtime += delta_exec;
......
curr->vruntime += calc_delta_fair(delta_exec, curr);
update_min_vruntime(cfs_rq);
......
}

/*
* delta /= w
*/
static inline u64 calc_delta_fair(u64 delta, struct sched_entity *se)
{
if (unlikely(se->load.weight != NICE_0_LOAD))
/* delta_exec * weight / lw.weight */
delta = __calc_delta(delta, NICE_0_LOAD, &se->load);
return delta;
}

delta_exec = now - curr->exec_start;

实际运行时间=当前时间-当前进程在cpu上运行的开始时间

当时这样得到的只是实际运行时间,需要一定的转化才能得到虚拟运行时间

虚拟运行时间 vruntime += 实际运行时间 delta_exec * NICE_0_LOAD/ 权重

这个权重就是优先级的意思

也就是说通过这个计算公式,对于同样的实际运行时间,给高权重的算少了,给低权重的算多了,但是选取下个进程的时候还是选取vruntime最少的一个进程

这样高权重的进程获得的实际运行时间自然就多了

了解更多:https://www.toutiao.com/c/user/83293539887/#mid=1633933053814798

linux操作系统的调度策略的更多相关文章

  1. 调度器简介,以及Linux的调度策略

    进程是操作系统虚拟出来的概念,用来组织计算机中的任务.但随着进程被赋予越来越多的任务,进程好像有了真实的生命,它从诞生就随着CPU时间执行,直到最终消失.不过,进程的生命都得到了操作系统内核的关照.就 ...

  2. 调度器简介,以及Linux的调度策略(转)

    进程是操作系统虚拟出来的概念,用来组织计算机中的任务.但随着进程被赋予越来越多的任务,进程好像有了真实的生命,它从诞生就随着CPU时间执行,直到最终消失.不过,进程的生命都得到了操作系统内核的关照.就 ...

  3. 如何提高Linux操作系统的安全性 转自https://yq.aliyun.com/articles/24251?spm=5176.100239.blogcont24250.7.CfBYE9

    摘要: Linux系统不论在功能上.价格上或性能上都有很多优点,但作为开放式操作系统,它不可避免地存在一些安全隐患.关于如何解决这些隐患,为应用提供一个安全的操作平台,本文会告诉你一些最基本.最常用, ...

  4. Linux进程调度策略

    linux内核的三种主要调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略(先到先服务)3,SCHED_RR实时调度策略(时间片轮转) 实时进程将得到优先调用 ...

  5. Linux操作系统的简单认识

    1:Linux操作系统的历史 Linux操作系统是由unix操作系统发展而来的,但是Unix是收费的系统,而Linux操作系统的免费的,开源的,所以使用比较广泛,但是它是基于命令行的,不提供图形化用户 ...

  6. Linux操作系统的LILO详解

    LILO是一个在Linux环境编写的Boot Loader程序(所以安装和配置它都要在Linux下).它的主要功能就是引导Linux操作系统的启动.但是它不仅可以引导Linux,它还可以引导其他操作系 ...

  7. 揭开Linux操作系统的Swap交换区之谜

    揭开Linux操作系统的Swap交换区之谜 Swap,即交换区,除了安装Linux的时候,有多少人关心过它呢?其实,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要.通过调整Swap ...

  8. Linux操作系统的文件链接

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++标题:Linux操作系统的文件链接内容:文件链接时间:2019年 ...

  9. Linux操作系统的VI命令

    Linux操作系统的VI命令 VI是Linux系统的一个文本编辑器,该编辑器可以通过使用VI命令来操作,从而完成对文本的编辑.熟练掌握一些常用的VI命令,可以大大简化编辑操作并提高操作Linux文本的 ...

随机推荐

  1. selenium 等待时间3种方式

    强制等待 sleep() -- 最不建议用 缺点:sleep(10)网络不好的情况,到10秒就抛出异常网络很好,1秒钟就响应了,白白等待多9秒 隐式等待 -- 也不是很理想的方法implicitly_ ...

  2. Windows 好用的护眼软件

    目录 1. 按 2. Windows10自带夜间模式 3. Iris Pro 3.1. 介绍 3.1.1. 保护用眼,改善睡眠 3.1.2. ×9 种不同的预设搭配 3.1.3. 计时器 3.1.4. ...

  3. cut 从文本中提取一段文字并输出

    1.命令功能 cut 从每个文件中截取选定部分并输出. 2.语法格式 cut  option  file 参数说明 参数 参数说明 -b (–bytes) 字节 -c (--characters) 字 ...

  4. 【vue】vue不足 待补强

    83719279 9:56:03尤其是路由 声明周期 父子通信 组件通信 以及钩子函数83719279 9:56:17这些我都不敢用,只能用最原始的方法83719279 9:56:32还有es6 js ...

  5. bzoj5118 Fib数列2 二次剩余+矩阵快速幂

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5118 题解 这个题一看就是不可做的样子. 求斐波那契数列的第 \(n\) 项,\(n \leq ...

  6. 在子组件中触发事件,传值给父组件-vue

    1.通过$emit触发事件 在子组件<x-test>中触发事件: <button @click="toSearchProduct()">搜索</but ...

  7. Windows电脑无法识别USB设备怎么办?

    您可能已经注意到,如果您使用USB设备并将其插入计算机,Windows会识别并配置它.然后,如果你拔掉它并将其重新插入另一个USB端口,Windows就会出现一连串的健忘症,并认为这是一个完全不同的设 ...

  8. 三星GT S7562 PIN 解锁方法

    三星GT S7562  PIN 解锁方法 请认真阅读完下文再进行操作,操作基本安全,请保证你手机电池有电续航超过1小时 首先把内存开和电话卡取出(以防万一数据丢失) 关机状态下: 同时按音量上下键 加 ...

  9. VUE 生成二维码插件

    原文:https://www.jianshu.com/p/496fd1cbee8d npm install qrcodejs2 --save 页面中引入 dom 结构 JS 方法编写 export d ...

  10. JMeter-性能测试之报表设定的注意事项

    在使用 Jmeter 执行性能测试时,需要屏蔽以下模块: 结果树 图形结果 断言 具体的说明,可以见官网:http://jmeter.apache.org/usermanual/component_r ...