出处:https://blog.csdn.net/u010317005/article/details/80531985

linux内核目前实现了6中调度策略(即调度算法), 用于对不同类型的进程进行调度, 或者支持某些特殊的功能,其中SCHED_NORMAL和SCHED_BATCH调度普通的非实时进程, SCHED_FIFO和SCHED_RR和SCHED_DEADLINE则采用不同的调度策略调度实时进程, SCHED_IDLE则在系统空闲时调用idle进程.

linux优先级
#define MAX_NICE        19
#define MIN_NICE        -20
#define NICE_WIDTH      (MAX_NICE - MIN_NICE + 1)
#define MAX_USER_RT_PRIO        100
#define MAX_RT_PRIO             MAX_USER_RT_PRIO
#define MAX_PRIO                (MAX_RT_PRIO + NICE_WIDTH)
#define DEFAULT_PRIO            (MAX_RT_PRIO + NICE_WIDTH / 2)
    程序的优先级范围为[0,139],有效的实时优先级(RT priority)范围为[0,99],SCHED_NORMAL和SCHED_BATCH这两个非实时任务的优先级为[100,139]。[100,139]这个区间的优先级又称为静态优先级(static priority)。之所以称为静态优先级是因为它不会随着时间而改变,内核不会修改它,只能通过系统调用nice去修改。静态优先级用进程描述符中的static_prio表示。优先级的值越低,表示具有更高的优先级,0的优先级最高。

优先级范围    描述
0——99    实时进程(RT priority)优先级范围
100——139    非实时进程(非实时调度器SCHED_NORMAL和SCHED_BATCH)优先级范围
    MAX_USER_RT_PRIO的值(默认为100)让用户态的优先级范围区别于实时优先级的最大值(99)。这样设计的好处是任何内核态线程的优先级都大于用户态的任务线程。注意:最大实时优先级(MAX_RT_PRIO)不得小于用户态优先级(MAX_USER_RT_PRIO)。
    用户的nice值[-20,19]对应于静态优先级的[100,139],也就是说,nice值越小,优先级越低。用户的nice值与优先级的转化关系为

#define NICE_TO_PRIO(nice)      ((nice) + DEFAULT_PRIO)
#define PRIO_TO_NICE(prio)      ((prio) - DEFAULT_PRIO)
    其中DEFAULT_PRIO的值为120,对应的nice值为0

一个进程可以间接地通过使用进程的nice级别来改变静态优先级。一个具有更高级别的静态优先级进程会具有更长的时间片(进程在一个处理器上运行多长时间)。也就说,在用户空间通过nice命令设置进程的静态优先级, 这在内部会调用nice系统调用, 进程的nice值在-20~+19之间. 值越低优先级越高。setpriority系统调用也可以用来设置进程的优先级。它不仅能够修改单个线程的优先级, 还能修改进程组中所有进程的优先级, 或者通过制定UID来修改特定用户的所有进程的优先级


                                                          图1- 优先级

nice time为cpu处理nice过的进程所耗费的时间

top中的PR和NI
    top中的PR表示优先级,但是跟上述的值不是直接对等的。在top中,实时优先级的[0,99]没有具体的表示,统一用RT来表示。而静态优先级和top中的优先级关系为

top_PR = static_Priority - 100
也就是说,top中的PR取值为[0,39],对应图1的优先级[100,139]

top中的NI表示nice等级,nice的取值为[-20,19],对应图1中的优先级为[100,139],也就是说nice等级可以改变用户进程(非实时进程的优先级)。在top界面中,输入r即可启动nice系统,先输入进程id,回车后再输入nice等级即可修改

修改了nice等级的top进程

ps中的PRI  
    ps中的PRI也是表示优先级,通过ps -el可以显示出来,例如

这里的PRI与图1 中的优先级关系为

ps_PRI = static_priority - 40

这边PRI的取值范围为[-40,99],也就是说,ps中PRI值为80等价于nice值为0,等价于静态优先级的120。

ps中部分FLAGS
<,高优先级( 其他用户不能nice)

N,低优先级(其他用户可以nice)

renice命令
    renice的使用方法为

Usage:
 renice [-n] <priority> [-p] <pid> [<pid>  ...]
 renice [-n] <priority>  -g <pgrp> [<pgrp> ...]
 renice [-n] <priority>  -u <user> [<user> ...]

Options:
 -g, --pgrp <id>        interpret as process group ID
 -h, --help             print help
 -n, --priority <num>   set the nice increment value
 -p, --pid <id>         force to be interpreted as process ID
 -u, --user <name|id>   interpret as username or user ID
 -v, --version          print version

For more information see renice(1).
例如将pid=27343的进程renice为1

renice 1 27343
其中<priority>取值为[-20,19],如果值小于-20,自动取-20,如果值大于19,自动取19

参考
https://blog.csdn.net/gatieme/article/details/51719208

https://blog.csdn.net/yiyeguzhou100/article/details/50994232

https://www.zhihu.com/question/272086181/answer/368848493

相关源码(Ubuntu 14.04)
/usr/src/linux-headers-4.4.0-31/include/linux/sched/prio.h

#ifndef _SCHED_PRIO_H
#define _SCHED_PRIO_H
 
#define MAX_NICE        19
#define MIN_NICE        -20
#define NICE_WIDTH      (MAX_NICE - MIN_NICE + 1)
 
/*
 * Priority of a process goes from 0..MAX_PRIO-1, valid RT
 * priority is 0..MAX_RT_PRIO-1, and SCHED_NORMAL/SCHED_BATCH
 * tasks are in the range MAX_RT_PRIO..MAX_PRIO-1. Priority
 * values are inverted: lower p->prio value means higher priority.
 *
 * The MAX_USER_RT_PRIO value allows the actual maximum
 * RT priority to be separate from the value exported to
 * user-space.  This allows kernel threads to set their
 * priority to a value higher than any user task. Note:
 * MAX_RT_PRIO must not be smaller than MAX_USER_RT_PRIO.
 */
 
#define MAX_USER_RT_PRIO        100
#define MAX_RT_PRIO             MAX_USER_RT_PRIO
 
#define MAX_PRIO                (MAX_RT_PRIO + NICE_WIDTH)
#define DEFAULT_PRIO            (MAX_RT_PRIO + NICE_WIDTH / 2)
 
/*
 * Convert user-nice values [ -20 ... 0 ... 19 ]
 * to static priority [ MAX_RT_PRIO..MAX_PRIO-1 ],
 * and back.
 */
#define NICE_TO_PRIO(nice)      ((nice) + DEFAULT_PRIO)
#define PRIO_TO_NICE(prio)      ((prio) - DEFAULT_PRIO)
 
/*
 * 'User priority' is the nice value converted to something we
 * can work with better when scaling various scheduler parameters,
 * it's a [ 0 ... 39 ] range.
 */
#define USER_PRIO(p)            ((p)-MAX_RT_PRIO)
#define TASK_USER_PRIO(p)       USER_PRIO((p)->static_prio)
#define MAX_USER_PRIO           (USER_PRIO(MAX_PRIO))
 
/*
 * Convert nice value [19,-20] to rlimit style value [1,40].
 */
 
static inline long nice_to_rlimit(long nice)
{
        return (MAX_NICE - nice + 1);
}
 
/*
 * Convert rlimit style value [1,40] to nice value [-20, 19].
 */
static inline long rlimit_to_nice(long prio)
{
        return (MAX_NICE - prio + 1);
}
 
#endif /* _SCHED_PRIO_H */

---------------------

【linux】进程优先级、nice系统中的nice值和nice time,top中的PR和ps中的PRI相关推荐

  1. 输入一个正整数,统计整数中各位数字值为零的个数,并把该整数中各位上最大的数字值找出和零的个数组成一个新数字输出

    /*** 输入一个正整数,统计整数中各位数字值为零的个数,并把该整数中各位上最大的数字值找出和零的个数组成一个新数字输出*/import java.util.Scanner;public class ...

  2. html中td 的值不换行符,解决英文字母在td标签中不换行的问题

    解决长串英文字母显示不能自动换行的问题和td中汉字自动换行 && CSS强制不换行 例如:asdfsdfsdfdsf不能处理自动换行,将表格伸的很长很长,而汉字字符却可以自动换行. 原 ...

  3. c++ 返回数组中最大的值_4个代码块教您如何在C中动态分配2D数组

    以下是在堆上创建2D数组(或动态分配2D数组)的不同方法. 在以下示例中,我们将" r "视为行数,将" c "视为列数,并创建了一个二维数组,其中r = 3, ...

  4. oracle 月份中日的值必须介于 1 和当月最后一日之间,ora-01847:月份中日的值必须介于 1 和当月最后一日之间...

    环境:1.在查询创建的视图全部内容时,的异常.视图中的日期是从varchar2转到date. 2.oracle 11g 原因:1.日期本身是数据非法的,就是转换时格式不合格,如:2月30 这里不可能有 ...

  5. matlab中N=256值是什么,应用MATLAB确定邓肯-张双曲线模型中的K,n参数

    应用MATLAB确定邓肯-张双曲线模型中的K,n参数 简介:接合承德中密砂常规三轴试验数据,介绍应用Matlab语言编写计算及绘图程序来处理试验数据的方法,可显著提高试验研究的数据处理效率和结果的可视 ...

  6. [转]Google Linux Cluster的系统结构分析(余一娇)

    原PDF下载:http://hums.ccnu.edu.cn/teachers/yyjcai/TR/TR-2005-04.pdf Google Linux Cluster的系统结构分析 余一娇1,2 ...

  7. 【Groovy】map 集合 ( 根据 Key 获取 map 集合中对应的值 | map.Key 方式 | map.‘Key’ 方式 | map[‘Key’] 方式 | 代码示例 )

    文章目录 一.根据 Key 获取 map 集合中对应的值 1.通过 map.Key 方式获取 map 集合中的值 Value 2.通过 map.'Key' 方式获取 map 集合中的值 Value 3 ...

  8. 【Flutter】Animation 动画 ( Flutter 动画基本流程 | 创建动画控制器 | 创建动画 | 设置值监听器 | 设置状态监听器 | 布局中使用动画值 | 动画运行 )

    文章目录 一.创建动画控制器 二.创建动画 三.设置值监听器 四.设置状态监听器 五.布局中使用动画值 六.动画运行 七.完整代码示例 八.相关资源 Flutter 动画基本流程 : ① 创建动画控制 ...

  9. go在方法中修改结构体的值_golang修改结构体中的切片值方法

    golang修改结构体中的切片值方法,结构,切片,站长站,文章,相关文章 golang修改结构体中的切片值方法 易采站长站,站长之家为您整理了golang修改结构体中的切片值方法的相关内容. gola ...

最新文章

  1. 最受欢迎的ASP.NET的CMS下载
  2. 从1的补码说起计算机的数制
  3. PHP如何验证以太坊签名
  4. PHP的mysqli扩展
  5. Gentoo 安装日记 13 (配置内核 :可执行文件安格式和网络)
  6. mysql实践小结,【java_mysql】实践小结
  7. LaTeX调整目录的行距
  8. Git 使用文档( git pull/fetch )
  9. perl中的文件句柄
  10. 管理感悟:建议工作文档多使用表格EXCEL
  11. iphone屏幕录制_苹果6s有屏幕录制吗
  12. 星环大数据 学习笔记(76) —— Kafka 运维常用命令
  13. qcc3020定制、qcc3020软件开发tws耳机的注意事项
  14. journalctl
  15. STM32学习笔记之IIC(1) ADS1115
  16. 个人邮箱如何进行群发邮件?
  17. 武器装备自动测试系统软件ETest
  18. 交换安全 STP生成树
  19. 【Spring Cloud 2】软件架构设计,Java游戏合集百度云盘
  20. React - review 2

热门文章

  1. 【C语言】贪吃蛇实现思路详解
  2. 游戏源码编程软件,对于新手来说十分友好,纯中文的界面让所有功能都一目了然,操作相当简单
  3. mui 拾取器picker在ios16.2系统版本中错乱------亲测有效解决办法
  4. 入库审核操作+库存预警定时调度+发送邮件
  5. php的CI框架的配置文件的方法
  6. USB OTG插入检测识别
  7. html js页面跳转的几种方式
  8. USB工作学习笔记(一)
  9. 微服务项目:尚融宝(53)(核心业务流程:投标(4))
  10. Scrapy使用报错socket.timeout: timed out