linux进程优先级


四.进程优先级Priority和Nice值

回到顶部

我们知道 CPU 一秒钟可以运作多达数 G 的微指令次数,透过核心的 CPU 排程可以让各进程被 CPU 所切换运作, 因此每个进程在一秒钟内或多或少都会被 CPU 执行部分的脚本。如果进程都是 集中在一个队列中等待 CPU 的运作, 而不具有优先级之分,也就是像我们去游乐场玩热门游戏需 要排队一样,每个人都是照顺序来! 你玩过一遍后还想再玩 (没有执行完毕),请到后面继续排队等 待。情况有点像底下这样:
图 16.3.1、并没有优先级的进程队列示意图
上图中假设 pro1, pro2 是紧急的进程, pro3, pro4 是一般的进程,在这样的环境中,由于不具有优 先级, 唉啊!pro1, pro2 还是得要继续等待而没有优待呢!如果 pro3, pro4 的工作又臭又长!那么 紧急的 pro1, pro2 就得要等待个老半天才能够完成!真麻烦啊!所以啰,我们想要将进程分优先级 啦!如果优先序较高则运作次数可以较多次, 而不需要与较慢优先的进程抢位置!我们可以将进程 的优先级与 CPU 排程进行如下图的解释:图 16.3.2、具有优先级的进程队列示意图 如上图所示,具高优先权的 pro1, pro2 可以被取用两次,而较不重要的 pro3, pro4 则运作次数较少。 如此一来 pro1, pro2 就可以较快被完成啦!要注意,上图仅是示意图,并非较优先者一定会被运作 两次啦! 为了要达到上述的功能,我们 Linux 给予进程一个所谓的『优先执行序 (priority, PRI)』, 这个 PRI 值越低代表越优先的意思。不过这个 PRI 值是由核心动态调整的, 用户无法直接调整 PRI 值的。先来瞧瞧 PRI 曾在哪里出现?

              [root@initroot ~]# ps -l
              F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
              0 S  1000  1743  1737  0  80   0 -  6115 wait   pts/0    00:00:00 bash
              4 R  1000  3700  1743  0  80   0 -  7663 -      pts/0    00:00:00 ps
            
# 你应该要好奇,怎么我的 NI 已经是 10 了?还记得刚刚 top 的测试吗?我们在那边就有改过一次喔! 由于 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 指令。

1.nice :新执行的指令即给予新的 nice 值

回到顶部

              [root@initroot ~]# nice [-n 数字] command
            
选项与参数:
-n:后面接一个数值,数值的范围 -20 ~ 19。
范例一:用 root 给一个 nice 值为 -5 ,用于执行 vim ,并观察该进程!
              [root@initroot ~]# nice -n -5 vim &
              [1] 19865
              [root@initroot ~]# ps -l
              F S
              UID
              PID
              PPID
              C PRI NI ADDR SZ WCHAN TTY
              10 - 29068 wait
              4 S 0 14836 14835 0 90
              4 T 0 19865 14836 0 85
              0 R 0 19866 14836 0 90
              # 原本的 bash PRI 为 90
              pts/0
              5 - 37757 signal pts/0
              10 - 30319 -
              pts/0
              TIME CMD
              00:00:00 bash
              00:00:00 vim
              00:00:00 ps
            
,所以 vim 默认应为 90。不过由于给予 nice 为 -5 ,
因此 vim 的 PRI 降低了!RPI 与 NI 各减 5 !但不一定每次都是正好相同喔!因为核心会动态调整
              [root@initroot ~]# kill -9 %1 #测试完毕将 vim 关闭
            
就如同前面说的, nice 是用来调整进程的执行优先级!这里只是一个执行的范例罢了! 通常什么 时候要将 nice 值调大呢?举例来说,系统的背景工作中, 某些比较不重要的进程之进行:例如备 份工作!由于备份工作相当的耗系统资源, 这个时候就可以将备份的指令之 nice 值调大一些,可 以使系统的资源分配的更为公平!

nice命令用于调整进程的调度优先级

2.renice :已存在进程的 nice 重新调整

回到顶部

              [root@initroot ~]# renice [number] PID
            
选项与参数:
PID :某个进程的 ID 啊!
范例一:找出自己的 bash PID ,并将该 PID 的 nice 调整到 -5
              [root@initroot ~]# ps -l
              F S
              UID
              PID
              PPID
              C PRI NI ADDR SZ WCHAN TTY
              TIME CMD
              4 S 0 14836 14835 0 90 10 - 29068 wait pts/0 00:00:00 bash
              0 R 0 19900 14836 0 90 10 - 30319 - pts/0 00:00:00 ps
              [root@initroot ~]# renice -5 14836
              14836 (process ID) old priority 10, new priority -5
              [root@initroot ~]# ps -l
              F S
              UID
              PID
              PPID
              C PRI NI ADDR SZ WCHAN TTY
              TIME CMD
              4 S 0 14836 14835 0 75 -5 - 29068 wait pts/0 00:00:00 bash
              0 R 0 19910 14836 0 75 -5 - 30319 - pts/0 00:00:00 
            
ps如果要调整的是已经存在的某个进程的话,那么就得要使用 renice 了。使用的方法很简单, renice 后 面接上数值及 PID 即可。因为后面接的是 PID ,所以你务必要以 ps 或者其他进程观察的指令去 找出 PID 才行啊!
由上面这个范例当中我们也看的出来,虽然修改的是 bash 那个进程,但是该进程所触发的 ps 指令 当中的 nice 也会继承而为 -5 喔!了解了吧!整个 nice 值是可以在父进程 --> 子进程之间传递的 呢! 另外,除了 renice 之外,其实那个 top 同样的也是可以调整 nice 值的!

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读