Linux学习-50-进程优先级管理

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 Linux学习-50-进程优先级管理,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

12.7 进程优先级

  • Linux 是一个多用户、多任务的操作系统,系统中通常运行着非常多的进程。但是 CPU 在一个时钟周期内只能运算一条指令,即使现在的 CPU 采用了多线程、多核心技术,所以在一个时钟周期内可以运算多条指令。 但是同时运算的指令数也远远小于系统中的进程总数,那问题来了:谁应该先运算,谁应该后运算呢?这就需要由进程的优先级来决定了。

  • 另外,CPU 在运算数据时,不是把一个进程的运算完成,再进行下一个进程的运算,而是先运算进程 1,再运算进程 2,接下来运算进程 3,然后再运算进程1,直到进程任务结束。不仅如此,由于进程优先级的存在,进程并不是依次运算的,而是哪个进程的优先级高,哪个进程会在一次运算循环中被更多次地运算。

  • 在 Linux 系统中,表示进程优先级的有两个参数:Priority 和 Nice。 ps -le 命令打印项中有这两个字段

[root@CncLucZK ~]# ps -le|more
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0       1       0  0  80   0 - 44174 do_epo ?        00:00:33 systemd
1 S     0       2       0  0  80   0 -     0 -      ?        00:00:00 kthreadd
1 I     0       3       2  0  60 -20 -     0 -      ?        00:00:00 rcu_gp
1 I     0       4       2  0  60 -20 -     0 -      ?        00:00:00 rcu_par_gp
1 I     0       6       2  0  60 -20 -     0 -      ?        00:00:00 kworker/0:0H-kblockd
1 I     0       8       2  0  60 -20 -     0 -      ?        00:00:00 mm_percpu_wq
1 S     0       9       2  0  80   0 -     0 -      ?        00:00:03 ksoftirqd/0
--more--
  • 其中,PRI 代表 Priority,NI 代表 Nice。这两个值都表示优先级,数值越小代表该进程越优先被 CPU 处理。不过,PRI值是由内核动态调整的,用户不能直接修改。所以我们只能通过修改 NI 值来影响 PRI 值,间接地调整进程优先级。

  • PRI 和 NI 的关系如下:

PRI (最终值) = PRI (原始值) + NI
  • 修改 NI 的值就可以改变进程的优先级即可。NI 值越小,进程的 PRI 就会降低,该进程就越优先被 CPU 处理;反之,NI 值越大,进程的 PRI 值就会増加,该进程就越靠后被 CPU 处理。

  • 修改 NI 值时有几个注意事项:

    • NI 范围是 -20~19。
    • 普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。
    • 普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
    • 只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。

12.8 nice和renice命令:改变进程优先级

  • Linux 内核决定哪些运行中的进程可以访问 CPU 时,其中一个需要考虑的因素就是进程优先级的值(也称为 nice 值)。每个进程都有一个介于 -20 到 19 之间的 nice 值。默认情况下,进程的 nice 值为 0。进程的 nice 值,可以通过 nice 命令和 renice 命令修改,进而调整进程的运行顺序。

  • nice 命令可以给要启动的进程赋予 NI 值,但是不能修改已运行进程的 NI 值。nice 命令格式如下:

[root@localhost ~] # nice [-n NI值] 命令

-n NI值:给命令赋予 NI 值,该值的范围为 -20~19;

[root@CncLucZK ~]# service httpd start
[root@CncLucZK ~]# ps -le|grep 'httpd'
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0 1113053       1  0  80   0 - 68639 core_s ?        00:00:01 httpd
5 S    48 1143899 1113053  0  80   0 - 71908 -      ?        00:00:00 httpd
5 S    48 1143900 1113053  0  80   0 - 483744 -     ?        00:00:05 httpd
5 S    48 1143901 1113053  0  80   0 - 450958 -     ?        00:00:05 httpd
5 S    48 1143902 1113053  0  80   0 - 450958 -     ?        00:00:05 httpd
5 S    48 1144815 1113053  0  80   0 - 450958 -     ?        00:00:05 httpd
#用默认优先级自动apache服务,PRI值是80,而NI值是0

#用nice 命令修改优先级前先停止进程
[root@CncLucZK ~]# service httpd stop
Redirecting to /bin/systemctl stop httpd.service

#[root@CncLucZK ~]# nice --10 service httpd start  #这个“-10”中的“-”仅表示参数前缀;所以,如果希望将当前目录下的documents目录打包,并且赋予tar进程最高的优先级:
[root@CncLucZK ~]# nice -n -10 service httpd start	#启动apache服务,同时修改apache服务进程的NI值为-10
[root@CncLucZK ~]# ps -le|grep 'httpd'		#查看下httpd的进程信息,PRI、NI值是否发生变化
  • 同 nice 命令恰恰相反,renice 命令可以在进程运行时修改其 NI 值,从而调整优先级。renice 命令格式如下:
[root@localhost ~] # renice [优先级] PID

注意,此命令中使用的是进程的 PID 号,因此常与 ps 等命令配合使用。

[root@CncLucZK ~]# ps -le | grep "mysqld" | grep -v grep
4 S    27    1364       1  0  80   0 - 448060 x64_sy ?       00:15:06 mysqld
[root@CncLucZK ~]# renice -10 1364
1364 (process ID) old priority 0, new priority -10
[root@CncLucZK ~]# ps -le | grep "mysqld" | grep -v grep
4 S    27    1364       1  0  70 -10 - 448060 x64_sy ?       00:15:06 mysqld
#PID为1364的进程的PRI值为70,而NI值为-10
  • 目前 CPU 十分强大,能够合理地对进程进行调整,输入输出设备也远远跟不上 CPU 地脚步,反而在更多的情况下,CPU 总是在等待哪些缓慢的 I/O(输入/输出)设备完成数据的读写和传输任务。然而,手动设置进程的优先级并不能影响 I/O 设备对它的处理,这就意味着,哪些有着低优先级的进程常常不合理地占据着本就低效地 I/O 资源。

参考文献:
Linux进程优先级

下一篇:Linux学习-51-进程间通信和终止线程命令

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123741.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!