关于程序的执行顺序:
还记得我们提过的多人多工环境吧?因为目前的 x86 平台的 CPU 可以做到多工的行为, 所以啰,我们的 Linux 可以在 x86 上面‘同时进行多个工作’的呢!那么多个工作是如何进行的呢? 其实每个工作都会进入到 CPU 的工作排程当中,并等待 CPU 来执行, 而 CPU 会根据每个工作的优先执行序 (priority) 来判断谁比较重要, 所以某个工作就可能会比较优先被执行完毕啦!
也就是说, Linux 系统中,每个 process 都会拥有一个所谓的‘优先执行序 (priority)’的属性, 利用该属性来让 CPU 判断那个工作是比较重要的,那个工作在一群工作当中就会优先被执行, 也让系统资源可以分配的更恰当。我们可以使用 ps 还观察优先执行序:
[root@linux ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 18851 18827 0 77 0 - 1302 wait pts/0 00:00:00 su
4 S 0 18852 18851 0 76 0 - 1349 wait pts/0 00:00:00 bash
4 R 0 19510 18852 0 76 0 - 1111 - pts/0 00:00:00 ps
其中,那个 PRI 就是 Priority 的简写,而 NI 是 nice 的简写,这两个东西是凑在一起才产生目前的 PRI 值的! PRI 越小时,代表该程序可以具有‘越早被优先执行’的意思,只是 PRI 是由系统动态产生的, 并不会是一直固定的值喔。至于那个 NI (nice) 则是我们操作值额外给予的一个数值, 他可以影响 PRI 的值,基本上,他的相关性是这样的:
* PRI(new) = PRI(old) + nice
不过您要特别留意到,如果原本的 PRI 是 50 ,并不是我们给予一个 nice = 5 ,就会让 PRI 变成 55 喔! 因为 PRI 是系统‘动态’决定的,所以,虽然 nice 值是可以影响 PRI ,不过, 最终的 PRI 仍是要经过系统分析后才会决定的。另外, nice 值是有正负的喔,而既然 PRI 越小越早被执行, 所以,当 nice 值为负值时,那么该程序就会降低 PRI 值,亦即会变的较优先被处理。此外,您必须要留意到:
* 一般使用者的 nice 值为 0 ~ 19 ;
* root 可用的 nice 值为 -20 ~ 19 ;
* 一般使用者仅可将 nice 值越调越高,如果本来 nice 为 5 ,则未来仅能调整到大于 5 的 nice ;
* 一般使用者仅能调整属于自己的程序的 nice 值。
这也就是说,要调整某个程序的优先执行序,就是‘调整该程序的 nice 值’啦!那么如何给予某个程序 nice 值呢?有两种方式,分别是:
* 一开始执行程式就立即给予一个特定的 nice 值:用 nice 指令;
* 调整某个已经存在的 PID 的 nice 值:用 renice 指令。
# nice
[root@linux ~]# nice [-n] command
参数:
-n :后面接一个数值,数值的范围 -20 ~ 19。
范例:
范例一:用 root 给一个 nice 植为 -5 ,用于执行 vi ,并观察该程序!
[root@linux ~]# nice -n -5 vi &
[1] 19542
[root@linux ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 18851 18827 0 77 0 - 1302 wait pts/0 00:00:00 su
4 S 0 18852 18851 0 76 0 - 1349 wait pts/0 00:00:00 bash
4 T 0 19542 18852 0 72 -5 - 1063 finish pts/0 00:00:00 vi
4 R 0 19543 18852 0 77 0 - 1110 - pts/0 00:00:00 ps
就如同前面说的, nice 是用来调整程序的执行优先顺序!这里只是一个执行的范例罢了! 通常什么时候要将 nice 值调大呢?举例来说,系统的背景工作中, 某些比较不重要的程序之进行:例如备份工作!由于备份工作相当的耗系统资源, 这个时候就可以将备份的指令之 nice 值调大一些,可以使系统的支援分配的更为公平!
# renice
[root@linux ~]# renice [number] PID
参数:
PID :某个程序的 ID 啊!
范例:
范例一:以上面 nice 范例中 ps -l 的结果,将 18852 那个 PID 修改 nice 为 10
[root@linux ~]# renice 10 18852
18852: old priority 0, new priority 10
[root@linux ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 18851 18827 0 77 0 - 1302 wait pts/0 00:00:00 su
4 S 0 18852 18851 0 85 10 - 1349 wait pts/0 00:00:00 bash
4 R 0 19593 18852 0 87 10 - 1111 - pts/0 00:00:00 ps
如果要调整的是已经存在的某个 process 的话,那么就得要使用 renice 了。使用的方法很简单, renice 后面接上数值及 PID 即可。因为后面接的是 PID ,所以您务必要以 ps 或者其他程序观察的指令去找出 PID 才行啊!
刚好,由上面这个范例当中我们也看的出来,虽然修改的是 bash 那个 PID 为 18852 的程序, 但是该程序所触发的 ps 指令当中的 PID 同样的也有一个 nice = 10 的结果喔! 瞭解了吧?整个 nice 值是可以在父程序 --> 子程序之间传递的呢!
另外,除了 renice 之外,其实那个 top 同样的也是可以调整 nice 值的! top 也是可以调整已经存在的某个 process 的 nice 喔!
阅读(2477) | 评论(0) | 转发(0) |