热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(转)nice值

首先,我想用一个简单的命令来引起这个议题。无论在linux或者unix系统中,用ps–l命令则会类似输出以下几个内容:#ps–l—这里用
首先,我想用一个简单的命令来引起这个议题。 无论在linux或者unix系统中,用ps –l命令则会类似输出以下几个内容:

# ps –l — 这里用的是linux测试

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

4 S 0 20538 20534 0 75 0 – 1063 wait4 pts/2 00:00:00 bash

4 R 0 20663 20538 0 75 0 – 828 – pts/2 00:00:00 ps



我们很容易注意到其中的几个重要信息,有下:

UID : 代表执行者的身份

PID : 代表这个进程的代号

PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号

PRI :代表这个进程可被执行的优先级,其值越小越早被执行

NI :代表这个进程的nice值

这里的前面的三个信息,我们都是比较好容易理解的,但是后面的两个奇怪的信息,一个是PRI,一个是NI,这到底是什么东西?相对而言,PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高。那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值。如前面所说,PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice。这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行。



进程在创建时并不是平等的,他们被赋予不同的优先级值,例如有些对计算机本身的操作至关重要的程序必须比其他次要的程序具有更高的优先级(则其有更小的优先级值)。而如前面所说,nice的值是表示进程优先级值可被修正数据值,因此,每个进程都在其计划执行时被赋予一个系统nice值,这样系统就可以根据系统的资源以及具体进程的各类资源消耗情况,主动干预进程的优先级值。这个过程,用户也可手工干预其中,但是要被赋予相应的权限。

在UNIX系统或者LINUX系统中,使用从-20到+19的一个可变数值来表示这个nice值(LINUX和AIX是这种情况,HP-UX系统的值范围是从0到39),并且在通常情况下,子进程会继承父进程的系统nice值。具有最高优先级的程序,其nice值最低,所以在UNIX和LINUX系统中,值-20使得一项任务变得非常重要(HP-UX为0);与之相反,如果任务的 nice 为+19(HP-UX为39),则表示它是一个高尚的、无私的任务,允许所有其他任务比自己享有宝贵的 CPU 时间的更大使用份额,这也就是nice的名称的意会来意。



在系统启动的过程中,init进程会被赋予0(HP-UX系统值会被赋予20),其他所有进程继承了这个nice值(因为其他的进程都是init的子进程)。对于用户,从他们开始登陆初始化进程,其余在其底下衍生出来的子进程也会赋予该nice值。原始用户,只能将其底下的执行进程的nice值变大(相对于其本身nice值而言)而不能变小;若想变小,得要有相应的权限,如root用户可以设置变小,如下:

[oracle@perf_dbc ~]$ nice

0

[oracle@perf_dbc ~]$ nice -n 3 ls

agent bin important_bak logs statistics_import.log TMP_FORUM_STATS.dmp TMP_TAOBAO_STATS.dmp TMP_TBCAT_STATS.dmp top.dmp worksh

[oracle@perf_dbc ~]$

[oracle@perf_dbc ~]$ nice -n -3 ls

nice: cannot set priority: Permission denied



而root用户就可以给其子进程赋予更小的nice值,如下:

# nice

0

# nice -n -3 ls

192.168.205.191.txt anaconda-ks.cfg clariion.log Desktop disk1 emc.sh File_sort install.log install.log.syslog log OPS rhel_os_soft root_link_name



对于后台进程,其nice会在其被显示赋予的值过后再加上4。如“nice 12 command &”命令执行时,则其会以nice=36值来运行程序(HP-UX系统)。这里有个问题,即如果用户设置的nice值超过了nice的边界值(LINUX和AIX为-20到19,HP-UX为0到39)会怎样,则系统就取nice的边界值作为进程的nice值。



与进程的nice相关的命令有2个,分别是nice和renice。

nice命令就是设置一个要执行command进程的nice值,其命令格式是 nice –n adjustment command command_option,这里就设置要执行的command的nice,如果这里不指定adjustment,则默认为10。

renice命令就是设置一个已经在运行的进程的nice值,如假设一运行进程本来nice值为0,renice为3后,则这个运行进程的nice值就为3了。renice的执行必须要有相应的权限方可执行。它可以根据用户、进程ID、进程组来设置进程的nice值。



对nice值一个形象比喻,假设在一个CPU轮转中,有2个runnable的进程A和B,如果他们的nice值都为0(如果是HP-UX则为20),加上内核会给他们每人分配1k个cpu时间片。但是假设进程A的为0,但是B的值为-10,那么此时CPU则会可能分别给A和B分配1k和1.5k的时间片。故可以形象的理解为,nice的值影响了内核分配给进程的cpu时间片的多少,时间片越多的进程,其优先级越高,其优先级值越低。



从使用top、ps等命令看到的nice值,就是进程所拥有的nice值,使用iostat等看到的%nice,就是用户进程空间中改变过优先级的进程的占用CPU的百分比,如上例中就说0.5k/2.5k=1/5=20%。



到目前为止,更需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。


推荐阅读
  • 安装oracle软件1创建用户组、用户和目录bjdb节点下:[rootnode1]#groupadd-g200oinstall[rootnode1]#groupad ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了Shell中for命令的基本格式和用法,通过提供一个值列表来迭代执行一系列命令。同时还介绍了如何读取列表中的值,并给出了for命令与其他命令的结合使用示例。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • Linux下安装依赖包版本高解决方法
    本文介绍了在Linux系统下,当已安装的依赖包版本高于需要安装的依赖包版本时,解决方法包括欺骗安装程序和修改相关配置文件等操作。针对不同情况,提供了不同的解决方案。 ... [详细]
  • 从U ... [详细]
  • Iamtryingtocreateanarrayofstructinstanceslikethis:我试图创建一个这样的struct实例数组:letinstallers: ... [详细]
  • 本文介绍了在Android Studio中使用命令行build gradle的方法,并解决了一些常见问题,包括手动配置gradle环境变量和解决External Native Build Issues的方法。同时提供了相关参考文章链接。 ... [详细]
  • 程序员如何选择机械键盘轴体?红轴和茶轴对比
    本文介绍了程序员如何选择机械键盘轴体,特别是红轴和茶轴的对比。同时还介绍了U盘安装Linux镜像的步骤,以及在Linux系统中安装软件的命令行操作。此外,还介绍了nodejs和npm的安装方法,以及在VSCode中安装和配置常用插件的方法。最后,还介绍了如何在GitHub上配置SSH密钥和git的基本配置。 ... [详细]
  • 其实之前也有下载过完整的android源码,但是从来没有对这个做过一些总结,在加上最近需要经常去看,索性就在从新下载,编译一下,其实这些东西官网上面都有。http:sou ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有