Priority 与 Nice 值(鸟哥的私房菜)

我们知道 CPU 一秒钟可以运行多达数 G 的微命令次数,透过核心的 CPU 排程可以让各程序被 CPU 所切换运行, 因此每个程序在一秒钟内或多或少都会被 CPU 运行部分的命令码。如果程序都是集中在一个对列中等待 CPU 的运行,而不具有优先顺序之分。如下图所示:


图 3.3.1、没有优先顺序的程序队列示意图

上图中假设 pro1, pro2 是紧急的程序, pro3,pro4 是一般的程序,在这样的环境中,由于不具备优先权次序, 因此pro1, pro2要继续等待。如果 pro3, pro4 的工作太长!那么紧急的 pro1, pro2 就得要等待ro3, pro4完成才能够完成!所以我们想要将程序分优先顺序!如果优先序较高则运行次数可以较多次, 而不需要与较慢优先的程序抢位置!我们可以将程序的优先顺序与 CPU 排程进行如下图的解释:


图 3.3.2、具有优先顺序的程序伫列示意图

如上图所示,具高优先权的 pro1, pro2 可以被取用两次,而较不重要的 pro3, pro4 则运行次数较少。 如此一来 pro1, pro2 就可以较快被完成!要注意,上图仅是示意图,并非较优先者一定会被运行两次!为了要达到上述的功能,我们 Linux 给予程序一个所谓的优先运行序(priority, PRI), 这个 PRI 值越低代表越优先的意思。不过这个 PRI 值是由核心动态调整的, 使用者无法直接调整 PRI 值的。先来瞧瞧 PRI 曾在哪里出现:

 

 

[root@www ~]# ps -l

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

4 S     0 1862518623  2 75   0 -  1514 wait  pts/1    00:00:00 bash

4 R     0 1865318625  0 77   0 -  1102 -     pts/1    00:00:00 ps

由于PRI 是核心动态调整的,我们使用者也无权去干涉 PRI !那如果你想要调整程序的优先运行序时,就得要透过 Nice 值了!Nice 值就是上表的NI 啦!一般来说, PRI 与 NI 的相关性如下:

PRI(new) = PRI(old) + nice

不过你要特别留意到,如果原本的 PRI 是 50 ,并不是我们给予一个nice = 5 ,就会让 PRI 变成 55 喔!因为 PRI 是系统『动态』决定的,所以,虽然 nice 值是可以影响 PRI ,不过, 最终的 PRI 仍是要经过系统分析后才会决定的。另外, nice 值是有正负的,而既然 PRI 越小越早被运行, 所以,当 nice 值为负值时,那么该程序就会降低 PRI 值,亦即会变的较优先被处理。此外,你必须要留意到:

  • nice 值可调整的范围为 -20 ~ 19 ;
  • root 可随意调整自己或他人程序的 Nice 值,且范围为     -20 ~ 19 ;
  • 一般使用者仅可调整自己程序的 Nice 值,且范围仅为 0 ~ 19 (避免一般用户抢占系统资源);
  • 一般使用者仅可将     nice 值越调越高,例如本来 nice 为 5 ,则未来仅能调整到大与 5;

这也就是说,要调整某个程序的优先运行序,就是调整该程序的 nice 值!那么如何给予某个程序 nice 值呢?有两种方式,分别是:

  • 一开始运行程序就立即给予一个特定的 nice 值:用 nice 命令;
  • 调整某个已经存在的     PID 的 nice 值:用 renice 命令。

 


  • nice :新运行的命令即给予新的     nice 值

 

[root@www ~]# nice [-n 数字] command

选项与参数:

-n  :后面接一个数值,数值的范围 -20 ~ 19。

 

范例一:用 root 给一个nice 值为 -5 ,用於运行 vi ,并观察该程序!

[root@www ~]# nice -n -5 vi &

[1] 18676

[root@www ~]# ps -l

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

4 S     0 1862518623  0 75   0 -  1514 wait  pts/1    00:00:00 bash

4 T     0 1867618625  0 72  -5 -  1242 finish pts/1    00:00:00 vi

4 R     0 1867818625  0 77   0 -  1101 -     pts/1    00:00:00 ps

# 原本的 bash PRI 为 75  ,所以 vi 默认应为 75。不过由於给予 nice  为 -5 ,

# 因此 vi 的 PRI 降低了!但并非降低到70 ,因为核心还会动态调整!

 

[root@www ~]# kill -9 18676 <==测试完毕将 vi 关闭

就如同前面说的, nice 是用来调整程序的运行优先顺序! 通常什么时候要将 nice 值调大呢?举例来说,系统的背景工作中, 某些比较不重要的程序执行:例如备份工作!由于备份工作相当的耗系统资源,这个时候就可以将备份的命令之 nice 值调大一些,可以使系统的资源分配的更为公平!


  • renice :已存在程序的     nice 重新调整

[root@www ~]# renice [number] PID

选项与参数:

PID :某个程序的 ID 啊!

 

范例一:找出自己的 bash PID ,并将该 PID 的 nice 调整到 10

[root@www ~]# ps -l

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

4 S     0 1862518623  0 75   0 - 1514 wait   pts/1    00:00:00 bash

4 R     0 1871218625  0 77   0 -  1102 -     pts/1    00:00:00 ps

 

[root@www ~]# renice 10 18625

18625: old priority 0, new priority 10

 

[root@www ~]# ps -l

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

4 S     0 1862518623  0 85  10 -  1514 wait  pts/1    00:00:00 bash

4 R     0 1871518625  0 87  10 -  1102 -     pts/1    00:00:00 ps

如果要调整的是已经存在的某个程序的话,那么就得要使用 renice 了。使用的方法很简单, renice 后面接上数值及 PID 即可。因为后面接的是 PID ,所以你务必要以 ps 或者其他程序观察的命令去找出 PID 才行啊!

由上面这个范例当中我们也看的出来,虽然修改的是 bash 那个程序,但是该程序所触发的 ps 命令当中的 nice 也会继承而为 10 喔!了解了吧!整个 nice 值是可以在父程序 --> 子程序之间传递的呢! 另外,除了 renice 之外,其实那个top 同样的也是可以调整 nice 值的!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值