在Linux下改变进程的优先级
作者:曾老师,华清远见嵌入式学院讲师。 作为多任务的操作系统,Linux内核为每个创建的进程分配时间片并根据其优先级进行调度。当进程被创建时,其对应的task_struct里包含了四个优先级:
struct task_struct {
……
int prio, static_prio, normal_prio;
unsigned int rt_priority;
……
};
在内核头文件include/linux/sched.h中定义了如下宏
#define MAX_USER_RT_PRIO 100
#define MAX_RT_PRIO MAX_USER_RT_PRIO //100
#define MAX_PRIO (MAX_RT_PRIO + 40) //140
内核中规定进程的优先级范围为[, MAX_PRIO-]
实时任务的优先级范围是[, MAX_RT_PRIO-] //[0,99]
非实时任务的优先级范围是[MAX_RT_PRIO, MAX_PRIO-] //[100,139] 优先级值越小,意味着级别越高,任务先被内核调度。
那任务的优先级又是如何确定的呢?和task_struct中的成员是什么关系?
① prio指的是任务当前的动态优先级,其值影响任务的调度顺序。
② normal_prio指的是任务的常规优先级,该值基于static_prio和调度策略计算。
③ static_prio指的是任务的静态优先级,在进程创建时分配,该值会影响分配给任务的时间片的长短和非实时任务动态优先级的计算。
④ rt_priority指的是任务的实时优先级。若为0表示是非实时任务,[, ]表示实时任务,值越大,优先级越高。
static_prio = MAX_RT_PRIO + + nice(nice的缺省值是0,范围[, ])
rt_priority缺省值为0,表示非实时任务。[,]表示实时任务
对于实时任务,prio = normal_prio = static_prio
对于非实时任务 prio = normal_prio = MAX_RT_PRIO – – rt_priority
prio的值在使用实时互斥量时会暂时提升,释放后恢复成normal_prio 下面来了解一下如何在应用程序中改变进程的优先级。
#include <sys/time.h>
#include <sys/resource.h>
int setpriority(int which, int who, int prio);
//该函数可以修改进程、进程组或用户所有进程的nice值从而影响static_prio
which : PRIO_PROCESS // 修改某个进程
PRIO_PGRP // 修改进程组
PRIO_USER // 修改用户所有进程
who : 进程号(0表示当前调用进程)、进程组号或UID
prio : 新的用户态优先级(即nice值,范围[-,])
返回值 : 执行成功返回0,失败返回-1并设置errno if (setpriority(PRO_PROCESS, , ) <0)
{
perror(“fail to setpriority”);
exit(-);
} ************************************************************************
#include <sched.h>
int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param);
struct sched_param
{
int __sched_priority;
};
// 该函数修改某个进程的调度策略和rt_priority
pid : 要修改的进程号,0表示当前调用进程
policy : 调度策略
SCHED_OTHER(针对非实时进程的调度策略)
SCHED_RR(针对实时进程的轮转调度策略)
SCHED_FIFO(针对实时进程的先进先出调度策略)
param : 指向的结构体中存放着要设置的rt_priority
返回值 : 执行成功返回0,失败返回-1并设置errno
……
struct sched_param sp = {};
if (sched_setscheduler(, SCHED_FIFO, &sp) < )
{
perror(“fail to sched_setscheduler”);
exit(-);
}
linux的线程调度策略,linux将进程分为下面两类
实时进程
¢ 对调度延迟的要求最高,要求立即响应并执行
¢ 调度策略:FIFO、Round Robin
普通进程
Ø交互式进程:间或处于睡眠态,对响应速度要求比较高
Ø批处理进程:在后台执行,能够忍受响应延迟
普通进程调度策略使用CFS,CFS是现在被内核采纳的调度器。它从RSDL/SD中吸取了完全公平的思想,不再跟踪进程的睡眠时间,也不再企图区分交互式进程
CFS算法中,每个进程都有一个“虚拟运行时间”表示该进程运行了“多长时间”,而调度器会选择虚拟运行时间最小的进程来运行
虚拟运行时间的计算与进程实际运行时间成正比,而与进程优先级成反比
CFS以虚拟运行时间作为键值构造一棵红黑树,从而实现了快速更新和删除完全公平调度Completely Fair Scheduler 核心思想:根据进程的优先级按比例分配运行时间
(公式1)
 1.分配给进程的运行时间 = 调度周期 * 进程权重 / 所有进程权重之和 
调度周期:将所有处于TASK_RUNNING态进程都调度一遍的时间
CFS对时钟做抽象,引入了虚拟运行时间vruntime的概念,每个进程有自己的vruntime
2.vruntime = 实际运行时间 * NICE_0_LOAD /进程权重
(公式2)
由公式1和2得:
vruntime = (调度周期 * 进程权重/所有进程总权重) * NICE_0_LOAD/进程权重= 调度周期 * NICE_0_LOAD/所有进程总权重
从vruntime的角度,分配给所有进程的时间是一样的
CFS算法,每次选择vruntime最小的进程运行,所有进程的vruntime增长速度宏观上看是同时推进的
CFS 维护了一个以vruntime为顺序的红黑树,可以快速高效地插入或删除任务
调度器每次选择最左侧结点的进程运行,运行结点从树中删除;进程切换时,切换下来的就绪态进程再重新插入树中,
因为换下来的进程一般vruntime比较大所以会靠近树的右侧;总体来说树的内容从右侧迁移到左侧以保持平衡。

进程的优先级 与 CFS 进程调度的更多相关文章

  1. 二十一、Linux 进程与信号---进程查看和进程状态、进程调度和进程状态变化、进程标识

    21.1 进程查看和进程状态 21.1.1 ps 指令 ps 指令通常可以查看到进程的 ID.进程的用户 ID.进程状态和进程的 Command ps:查看当前用户启动的进程 ps -ef:详细查看后 ...

  2. EPROCESS 进程/线程优先级 句柄表 GDT LDT 页表 《寒江独钓》内核学习笔记(2)

    在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB.把它们放到一起是因为这三个数据结构及其外延和w ...

  3. 第11讲- Android中进程及其优先级

    第11讲Android中进程及其优先级 进程与线程: 进程:操作系统结构的基础,资源分配的最小单元,一个操作系统包括多个进程: 线程:线程存在于进程当中,是操作系统调试执行的最小单元,一个进程包括多个 ...

  4. mfc 进程的优先级

    知识点:  进程优先级  获取当前进程句柄  优先级设置  优先级变动  优先级获取 一.进程优先级(优先级等级) 简单的说就是进程(线程)的优先级越高,那么就可以分占相对多的CPU时间片. ...

  5. 改变进程的优先级,nice,getpriority,setpriority

    int getpriority(int which, int who);返回一组进程的优先级 参数which和who确定返回哪一组进程的优先级 The value which is one of PR ...

  6. RHCE7 管理II-5管理进程的优先级

    进程的优先级值称为进程的nice值,共有40种不同的取值(用数字-20到19表示) nice值越大,表示进程的优先级越低. 进程的nice值,只允许root用户来设置负的nice:其他用户只允许设置正 ...

  7. Linux中进程的优先级

    Linux採用两种不同的优先级范围,一种是nice值.还有一种是实时优先级. 1.nice值 nice值得范围是-20~19,默认值是0. 越大的nice值意味着更低的优先级.也就是说nice值为-2 ...

  8. android中进程的优先级

    android中进程的优先级

  9. Linux基础进程管理优先级

    一.进程优先级 Linux进程调度及多任务 每个cpu(或者cpu核心)在一个时间点上只能处理一个进程,通过时间片技术,Linux实际能够运行的进程(和线程数)可以超出实际可用的cpu及核心数量.Li ...

随机推荐

  1. UIActionViewController 详解 iOS8

    iOS8推出了几个新的“controller”,主要是把类似之前的UIAlertView变成了UIAlertController,这不经意的改变,貌似把我之前理解的“controller”一下子推翻了 ...

  2. Ipv6_Only-b

    网上好多关于ipv6的资料,说半天ipv6是什么,怎么建立测试环境,,,可是没有看到具体的操作和解决的方案,这里,为大家提供一种方案,希望给大家带来帮助吧. 总的来说有三个方面需要进行检查和修改: 1 ...

  3. “未能加载文件或程序集file:///E:/MoneySet.dll或它的某一个依赖项,试图加载格式不正确的程序,行203,位置5. 文件:MReportSet.resx”,

    http://bbs.csdn.net/topics/390334265 1.右键卸载项目2.右键选择编辑工程文件,在打开的文件的最后一行</project>之前加以下内容: <Pr ...

  4. L1、L2范式及稀疏性约束

    L1.L2范式及稀疏性约束 假设需要求解的目标函数为: E(x) = f(x) + r(x) 其中f(x)为损失函数,用来评价模型训练损失,必须是任意的可微凸函数,r(x)为规范化约束因子,用来对模型 ...

  5. Two shortest

    sgu185:http://acm.sgu.ru/problem.php?contest=0&problem=185 题意:找两条最短路径,没有边相交的最短路劲,并且输出路径. 题解:这一题和 ...

  6. Spring整合CXF,发布RSETful 风格WebService

    原文地址:http://www.cnblogs.com/hoojo/archive/2012/07/23/2605219.html 这篇文章是承接之前CXF整合Spring的这个项目示例的延伸,所以有 ...

  7. ADI加速度计基础原理

  8. Qt 中update()和repaint()的区别

    void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽]通过立即调用paintEvent()来直接重新绘制 ...

  9. druid配置(转)

    java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色的性能,也 ...

  10. linux内核学习-

    我的博客:www.while0.com 1.端口地址的设置主要有统一编址和独立编址.  cat /proc/ioports 可以查询linux主机的设备端口. 2.数据传输控制方式有循环查询,中断和D ...