Chinaunix首页 | 论坛 | 博客

分类: LINUX

2009-01-20 14:18:30

  关于程序的执行顺序:
  还记得我们提过的多人多工环境吧?因为目前的 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 喔!

阅读(2451) | 评论(0) | 转发(0) |
0

上一篇:killall命令详解

下一篇:特殊档案与程序

给主人留下些什么吧!~~