博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CFS: 虚拟运行时间
阅读量:5878 次
发布时间:2019-06-19

本文共 2122 字,大约阅读时间需要 7 分钟。

http://edsionte.com/techblog/archives/4331

 

nice和prio的关系如下:

#define NICE_TO_PRIO(nice) (MAX_RT_PRIO+nice+20)

#define PRIO_TO_NICE(prio) (prio-MAX_RT_PRIO-20)

 

其中,MAX_RT_PRIO=100,nice的值在-20到19之前,那么优先级就在100 -139之间。

prio和weight之间的转换关系参见prio_to_weight。

 

CFS可实现几种不同的公平策略,这些策略是根据调度的对象的不同来区分的。

默认的是不开组调度的公平策略,即调度的单位是每个调度实体。我们来详细看一下是怎么调度的:

  假设现在系统有A,B,C三个进程,A.weight=1,B.weight=2,C.weight=3.那么我们可以计算出整个公平调度队列的总权重是cfs_rq.weight = 6,很自然的想法就是,公平就是你在重量中占的比重的多少来你的重要性,那么,A的重要性就是1/6,同理,B和C的重要性分别是2/6,3/6.很显然C最重要就应改被先调度,而且占用的资源也应该最多,即假设A,B,C运行一遍的总时间假设是6个时间单位的话,A占1个单位,B占2个单位,C占三个单位。这就是CFS的公平策略。

 

 linux内核采用了计算公式:

    ideal_time = sum_runtime *se.weight/cfs_rq.weight

        ideal_time:每个进程应该运行的时间

        sum_runtime:运行队列中所有任务运行完一遍的时间

        se.weight:当前进程的权重

        cfs.weight:整个cfs_rq的总权重

 

这里se.weight和cfs.weight根据上面讲解我们可以算出

 

sum_runtime是怎们计算的呢,linux内核中这是个经验值:

    经验公式是:

(1) sum_runtime=sysctl_sched_min_granularity *nr_running(if 进程数 > 5)

(2) sum_runtime=sysctl_sched_latency = 20ms           (if 进程数 <=5)

注:sysctl_sched_min_granularity =4ms

 

linux内核代码中是通过一个叫vruntime的变量来实现上面的原理的,即:

每一个进程拥有一个vruntime,每次需要调度的时候就选运行队列中拥有最小vruntime的那个进程来运行,

vruntime在时钟中断里面被维护,每次时钟中断都要更新当前进程的vruntime,

 

即vruntime以如下公式逐渐增长:

  (1) vruntime +=  delta* NICE_0_LOAD/se.weight;(if curr.nice!=NICE_0_LOAD)

  (2) vruntime += delta;                        (ifcurr.nice=NICE_0_LOAD)

delta:为进程增加的实际运行时间
在用户态进程的优先级nice值与CFS调度器中的权重又有什么关系? 在内核中通过prio_to_weight数组进行nice值和权重的转换。1static const int prio_to_weight[40] = {2 /* -20 */     88761,     71755,     56483,     46273,     36291,3 /* -15 */     29154,     23254,     18705,     14949,     11916,4 /* -10 */      9548,      7620,      6100,      4904,      3906,5 /*  -5 */      3121,      2501,      1991,      1586,      1277,6 /*   0 */      1024,       820,       655,       526,       423,7 /*   5 */       335,       272,       215,       172,       137,8 /*  10 */       110,        87,        70,        56,        45,9 /*  15 */        36,        29,        23,        18,        15,10};而在内核中,进程的虚拟运行时间是自进程诞生以来进行累加的,每个时钟周期内一个进程的虚拟运行时间是通过下面的方法计算的:一次调度间隔的虚拟运行时间=实际运行时间*(NICE_0_LOAD/权重)其中,NICE_0_LOAD是nice为0时的权重。 也就是说,nice值为0的进程实际运行时间和虚拟运行时间相同。 通过这个公式可以看到,权重越大的进程获得的虚拟运行时间越小,那么它将被调度器所调度的机会就越大。

 

转载地址:http://qrdix.baihongyu.com/

你可能感兴趣的文章
远程主机探测技术FAQ集 - 扫描篇
查看>>
C++中调用python函数
查看>>
Nomad添加acl认证
查看>>
“TI门外汉”网路知识笔记一 OSI参考模型
查看>>
你不需要jQuery(五)
查看>>
DatanodeDescriptor说明
查看>>
ServlertContext
查看>>
eclipse编辑器生命周期事件监听
查看>>
Python WOL/WakeOnLan/网络唤醒数据包发送工具
查看>>
sizeof(long)
查看>>
pxe网络启动和GHOST网克
查看>>
2.5-saltstack配置apache
查看>>
http状态响应码大全(复制转帖)
查看>>
django数据库中的时间格式与页面渲染出来的时间格式不一致的处理
查看>>
Python学习笔记
查看>>
java String
查看>>
renhook的使用
查看>>
Linux学习笔记(十二)--命令学习(用户创建、删除等)
查看>>
DOCKER windows 7 详细安装教程
查看>>
养眼美女绿色壁纸
查看>>