我们知道 CPU 一秒钟可以运行多达数 G 的微命令次数,透过核心的 CPU 排程可以让各程序被 CPU 所切换运行, 因此每个程序在一秒钟内或多或少都会被 CPU 运行部分的命令码。如果程序都是集中在一个对列中等待 CPU 的运行,而不具有优先顺序之分。如下图所示:
上图中假设 pro1, pro2 是紧急的程序, pro3,pro4 是一般的程序,在这样的环境中,由于不具备优先权次序, 因此pro1, pro2要继续等待。如果 pro3, pro4 的工作太长!那么紧急的 pro1, pro2 就得要等待ro3, pro4完成才能够完成!所以我们想要将程序分优先顺序!如果优先序较高则运行次数可以较多次, 而不需要与较慢优先的程序抢位置!我们可以将程序的优先顺序与 CPU 排程进行如下图的解释:
如上图所示,具高优先权的 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 值!那么如何给予某个程序 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 值调大一些,可以使系统的资源分配的更为公平!
[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 值的!