Linux进程优先级

zhangsir 2016-11-10 36浏览 0条评论
首页/正文
分享到: / / / /

我们知道 Linux 是多人多工的环境,由 top 的输出结果我们也发现, 系统同时间有非常多的程序在运行中,只是绝大部分的程序都在休眠 (sleeping) 状态而已。 如果所有的程序同时被唤醒,那么 CPU 应该要先处理那个程序呢?也就是说,哪个程序被运行的优先序比较高? 这就得要考虑到程序的优先运行序 (Priority) 与 CPU 排程!

Priority 与 Nice 值

CPU 一秒钟可以运行多达数 G 的微命令次数,通过核心的 CPU 排程可以让各程序被 CPU 所切换运行, 因此每个程序在一秒钟内或多或少都会被 CPU 运行部分的命令码。

如果程序都是集中在一个队列中等待 CPU 的运行, 那么为了区分不同程序的优先顺序,我们 Linux 给予程序一个所谓的『优先运行序 (priority, PRI)』, 这个 PRI 值越低代表越优先的意思。

不过这个 PRI 值是由核心动态调整的, 使用者无法直接调整 PRI 值的。先来瞧瞧 PRI 曾在哪里出现?
[root@ZhangSir ~]#ps -l
F S UID PID  PPID C PRI NI  ADDR SZ  WCHAN   TTY     TIME CMD
4 S   0 2251 2247 0  80  0  - 27444   wait pts/0 00:00:00 bash
4 R   0 3481 2251 3  80  0  - 27034      - pts/0 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 值

nice [-n 数字] command

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

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

[root@ZhangSir ~]#nice -n -5 vim &
[1] 3498
[root@ZhangSir ~]#ps -l
F S UID  PID PPID C PRI NI  ADDR SZ  WCHAN        TTY TIME CMD
4 S   0 2251 2247 0  80  0  - 27444  wait   pts/0 00:00:00 bash
4 T   0 3498 2251 0  75 -5  - 34237  signal pts/0 00:00:00 vim
4 R   0 3499 2251 0  80  0  - 27035       - pts/0 00:00:00 ps

[1]+ Stopped nice -n -5 vim
# 原本的 bash PRI 为 80 ,所以 vim 默认应为 80。不过由于给予 nice 为 -5 ,
# 因此 vi 的 PRI 降低了!但并非一定会降低到 75 ,因为核心还会动态调整!
[root@ZhangSir ~]#kill -9 %1  <==测试完毕将 vim 关闭
[1]+ 已杀死 nice -n -5 vim

就如同前面说的, nice 是用来调整程序的运行优先顺序!这里只是一个运行的范例罢了!

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

renice:已存在程序的 nice 调整

renice [number] PID number:欲调整 nice 值。 PID:进程PID。

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

[root@ZhangSir ~]#ps -l
F S UID  PID PPID C PRI NI ADDR SZ WCHAN   TTY     TIME CMD
4 S   0 2251 2247 0  80 0  - 27444  wait pts/0 00:00:00 bash
4 R   0 3513 2251 0  80 0  - 27035     - pts/0 00:00:00 ps
[root@ZhangSir ~]#renice 10 2251
2251: old priority 0, new priority 10
[root@ZhangSir ~]#ps -l
F S UID  PID PPID C PRI NI  ADDR SZ WCHAN   TTY     TIME CMD
4 S   0 2251 2247 0  90 10  - 27444  wait pts/0 00:00:00 bash
4 R   0 3525 2251 0  90 10  - 27034     - pts/0 00:00:00 ps

如果要调整的是已经存在的某个程序的话,那么就得要使用 renice 了。使用的方法很简单, renice 后面接上数值及 PID 即可。

因为后面接的是 PID ,所以务必要以 ps 或者其他程序观察的命令去找出 PID 才行! 由上面这个范例当中我们也看的出来,虽然修改的是 bash 那个程序,但是该程序所触发的 ps 命令当中的 nice 也会继承而为 10 !整个 nice 值是可以在父程序 --> 子程序之间传递的! 另外,除了 renice 之外,其实那个 top 同样的也是可以调整 nice 值的!

最后修改:2016-11-10 19:40:28 © 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

上一篇

发表评论

评论列表

还没有人评论哦~赶快抢占沙发吧~