IBM的LPI复习资料之LPI101-Topic103 :GNU和Unix命令(6)改变进程优先级

本文主要是介绍IBM的LPI复习资料之LPI101-Topic103 :GNU和Unix命令(6)改变进程优先级,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘要:通过设置和改变进程的优先级来让进程获得所需要的运行时间片段。

1 概述

本文讲帮你在如下几个方面打牢基础:

  • (1) 理解进程优先级
  • (2) 设置进程优先级
  • (3) 改变进程优先级

本文为备考LPIC-1的目标103.6,权重为2。

2 理解你的优先级

与其他大多数现代操作系统一样,Linux也能运行多个进程。这通过进程间共享CPU和其他资源完成。如果一个进程占用了100%的CPU,那么其他进程将会失去反应。

如果你运行top命令,默认情况下,会按照CPU占用率降序显示各个进程。前面的例子中,我们展示了一个Poor Man's Colck脚本,它每30秒打印一次当前时间,其它时间内则没有动作。top可能不会把这个进程显示出来,因为它大部分时间都没有使用CPU。

典型的top输出:

	Mem:   3924872k total,  3429320k used,   495552k free,   529468k buffers
Swap:  7574520k total,        0k used,  7574520k free,  1872160k cachedPID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND1580 mysql     20   0  870m  73m 6748 S  0.3  1.9 100:09.57 mysqld
14163 root      20   0 15024 1384 1008 R  0.3  0.0   0:00.06 top1 root      20   0 19228 1532 1248 S  0.0  0.0   0:11.62 init2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd3 root      RT   0     0    0    0 S  0.0  0.0   0:08.19 migration/04 root      20   0     0    0    0 S  0.0  0.0   0:10.33 ksoftirqd/05 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/06 root      RT   0     0    0    0 S  0.0  0.0   0:18.44 watchdog/07 root      RT   0     0    0    0 S  0.0  0.0   0:08.87 migration/18 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/19 root      20   0     0    0    0 S  0.0  0.0   0:14.39 ksoftirqd/110 root      RT   0     0    0    0 S  0.0  0.0   0:18.44 watchdog/111 root      RT   0     0    0    0 S  0.0  0.0   0:07.99 migration/212 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/213 root      20   0     0    0    0 S  0.0  0.0   0:14.89 ksoftirqd/214 root      RT   0     0    0    0 S  0.0  0.0   0:17.60 watchdog/215 root      RT   0     0    0    0 S  0.0  0.0   0:06.82 migration/316 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/317 root      20   0     0    0    0 S  0.0  0.0   0:05.61 ksoftirqd/318 root      RT   0     0    0    0 S  0.0  0.0   0:17.79 watchdog/319 root      20   0     0    0    0 S  0.0  0.0   6:35.02 events/020 root      20   0     0    0    0 S  0.0  0.0   6:39.81 events/121 root      20   0     0    0    0 S  0.0  0.0  70:32.21 events/222 root      20   0     0    0    0 S  0.0  0.0   8:35.72 events/323 root      20   0     0    0    0 S  0.0  0.0   0:00.00 cgroup24 root      20   0     0    0    0 S  0.0  0.0   0:00.00 khelper25 root      20   0     0    0    0 S  0.0  0.0   0:00.00 netns26 root      20   0     0    0    0 S  0.0  0.0   0:00.00 async/mgr27 root      20   0     0    0    0 S  0.0  0.0   0:00.00 pm28 root      20   0     0    0    0 S  0.0  0.0   0:45.88 sync_supers29 root      20   0     0    0    0 S  0.0  0.0   0:53.20 bdi-default30 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kintegrityd/031 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kintegrityd/1

你的系统中可能会有一些进程使用很多的CPU资源,如视频编辑工具、图片格式转换工具或音频格式转换工具,如mp3转为ogg。

当你的机器上只有一个或者有限个数的CPU时,你需要决定如何在多个竞争进程之间共享CPU资源。这通常是通过选中一个进程让它运行一段时间(时间片),或者让它停止运行直到它等待的事件如IO完成。为了确保重要的进程不会因为CPU资源缺乏而失去反应,这种选择是基于调度优先级的。上表中的NI列代表的是进程的调度优先级,也叫做niceness。优先级通常是在-20到19之间,其中-20代表最高优先级,19代表最低优先级。

2.1 使用ps查看优先级

除了top命令外,也可以使用ps命令来显示进程优先级。使用ps -l,其输出的NI列就是进程优先级。如下所示:

[root@centos192 ~]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0 14148 14146  0  80   0 - 27074 wait   pts/1    00:00:00 bash
4 R     0 14548 14148  0  80   0 - 27030 -      pts/1    00:00:00 ps

2.2 默认优先级

你能已经从上面的两个例子中猜出来了,至少由普通用户启动的进程的优先级是0。这对现在的Linux系统来说是正确的。这个默认值可以通过运行不带参数的nice命令来获取。

ot@centos192 ~]# nice
0

3 设置优先级

在我们学习如何设置和改变优先级之前,先构建一个CPU密集型的脚本,它将会展示优先级确实有影响。

3.1 一个CPU密集型的脚本

我们将创建一个只使用CPU的小脚本。这个脚本使用两个输入参数,一个是计数值,一个是标签。首先会打印出这个标签和当前的系统时间,然后进入循环,每次循环都使得计数值减一,当计数值为0时终止循环,打印出标签和时间。这个测试脚本中没有进行错误检测也不是非常健壮,但是它可以说明问题了。

[root@centos192 ~]# echo 'x="$1"' > count1.sh
[root@centos192 ~]# echo 'echo "$2" $(date)' >> count1.sh
[root@centos192 ~]# echo 'while [ $x -gt 0 ]; do x=$((x-1)); done' >>count1.sh
[root@centos192 ~]# echo 'echo "$2" $(date)' >>count1.sh
[root@centos192 ~]# cat count1.sh
x="$1"
echo "$2" $(date)
while [ $x -gt 0 ]; do x=$((x-1)); done
echo "$2" $(date)

如果你在电脑上运行这个脚本,可能的输出如下:

[root@centos192 ~]# ./count1.sh 10000 A
A 2013年 08月 09日 星期五 10:30:28 CST
A 2013年 08月 09日 星期五 10:30:28 CST
[root@centos192 ~]# ./count1.sh 99000 A
A 2013年 08月 09日 星期五 10:30:43 CST
A 2013年 08月 09日 星期五 10:30:45 CST

目前位置一切安好。现在我们在后台运行这个脚本,然后使用top命令来查看其CPU占有情况。

Tasks: 188 total,   2 running, 186 sleeping,   0 stopped,   0 zombie
Cpu(s): 23.8%us,  1.2%sy,  0.0%ni, 74.8%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3924872k total,  3438424k used,   486448k free,   529588k buffers
Swap:  7574520k total,        0k used,  7574520k free,  1873432k cachedPID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
29561 root      20   0  105m 1096  728 R 99.6  0.0   1:06.54 bash695 root      20   0     0    0    0 S  0.3  0.0   4:35.89 vmmemctl
29562 root      20   0 15024 1388 1008 R  0.3  0.0   0:00.13 top1 root      20   0 19228 1532 1248 S  0.0  0.0   0:11.67 init2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd

可以看出,我们的脚本使用了一个CPU的99.6的资源,如果想占用其他的CPU,则再运行上面的命令即可。如果脚本持续运行,那么将会严重影响系统的其他工作。

3.2 使用nice命令设置优先级

既然我们能够持续保持一个CPU处于繁忙状态,我们来看看如何设置一个进程的优先级。总结一下到目前为止我们学到的知识:

  • (1) Linux和Unix系统使用的优先级共有40个等级,从-20到+19.
  • (2) 普通用户启动的进程默认优先级是0.
  • (3) ps命令的-l选项可以显示进程的优先级
  • (4) nice命令来显示默认的优先级

nice除了可以显示默认优先级外,还可以用来按照指定的优先级启动一个进程。你可以使用-n(或者--adjustment)选项接一个正数来增加优先级值,接一个负数来减少优先级值。一定要记住优先级值越大,优先级越低。通常只有root用户才能指定负值,也就是说普通用户只能让进程优先级降低而不能提升。

为了演示使用nice设置优先级,我们使用相同的脚本启动两个进程,其中一个进程的优先级为19,另一个默认。一秒以后使用ps-l 来显示进程状态,包括优先级。最后我们增加了一个30秒的睡眠来保证在子sh运行完之后才退出命令。如下图所示:

[root@centos192 ~]# (sh count1.sh 2000000 A&);(nice -n 19 sh count1.sh 2000000
B&);sleep 1; ps -l; sleep 30
A 2013年 08月 09日 星期五 12:29:10 CST
B 2013年 08月 09日 星期五 12:29:10 CST
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0 29538 29536  0  80   0 - 27074 wait   pts/2    00:00:00 bash
0 R     0 30573     1 99  80   0 - 26514 -      pts/2    00:00:01 sh
0 R     0 30575     1 99  99  19 - 26514 -      pts/2    00:00:00 sh
4 R     0 30579 29538  0  80   0 - 27030 -      pts/2    00:00:00 ps
B 2013年 08月 09日 星期五 12:29:39 CST
A 2013年 08月 09日 星期五 12:29:40 CST

可能你会感到奇怪,这两个子进程几乎同时运行完毕。我们设置的优先级没有作用吗?请记住我们的脚本只使用一个CPU。此次运行的机器配备的是4核心的CPU。这样两2个子进程分别运行在不同的CPU核心上,也许没有必要让谁优先了。为了占满4个CPU核心,我们这次同时运行6个进程,优先级分别是0,4,8,12,16,19。

[root@centos192 ~]# (sh count1.sh 5000000 A&);(nice -n 4 sh count1.sh 5000000
B&);(nice -n 8 sh count1.sh 5000000 C&);(nice -n 12 sh count1.sh 5000000
D&);(nice -n 16 sh count1.sh 5000000 E&);(nice -n 19 sh count1.sh 5000000
F&);sleep 1; ps -l; sleep 30; 
A 2013年 08月 09日 星期五 12:25:05 CST
B 2013年 08月 09日 星期五 12:25:05 CST
C 2013年 08月 09日 星期五 12:25:05 CST
D 2013年 08月 09日 星期五 12:25:05 CST
E 2013年 08月 09日 星期五 12:25:05 CST
F 2013年 08月 09日 星期五 12:25:05 CST
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0 29538 29536  0  80   0 - 27074 wait   pts/2    00:00:00 bash
0 R     0 30471     1 50  80   0 - 26514 -      pts/2    00:00:01 sh
0 R     0 30473     1 50  84   4 - 26514 -      pts/2    00:00:01 sh
0 R     0 30475     1 49  88   8 - 26514 -      pts/2    00:00:00 sh
0 R     0 30477     1 30  92  12 - 26514 -      pts/2    00:00:00 sh
0 R     0 30480     1 12  96  16 - 26514 -      pts/2    00:00:00 sh
0 R     0 30484     1  6  99  19 - 26514 -      pts/2    00:00:00 sh
4 R     0 30489 29538  0  80   0 - 27029 -      pts/2    00:00:00 ps
C 2013年 08月 09日 星期五 12:26:19 CST
A 2013年 08月 09日 星期五 12:26:19 CST
B 2013年 08月 09日 星期五 12:26:20 CST
D 2013年 08月 09日 星期五 12:26:49 CST
E 2013年 08月 09日 星期五 12:27:15 CST
F 2013年 08月 09日 星期五 12:27:25 CST

可以看出,如此一来就会出现多个进程使用竞争CPU的情况了,基本上优先级越高,那么被执行的机会就越多,执行完毕使用的时间就越少。

最后提醒大家,如同nohup命令一样,nice命令不能使用命令列表或者管线作为参数。

4 改变优先级

4.1 renice

如果你已经启动了一个进程,之后又意识到需要改变这个进程的优先级,那么就可以使用renice命令。renice指定的是绝对优先级值而不是调整量。

i[root@centos192 ~]# sh count1.sh 10000000 A&
[1] 30799
[root@centos192 ~]# A 2013年 08月 09日 星期五 12:43:19 CST[root@centos192 ~]# renice 1 30799; ps -l 30799
30799: old priority 0, new priority 1
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY        TIME CMD
0 R     0 30799 29538 97  81   1 - 26514 -      pts/2      0:21 sh count1.sh
10000000 A
[root@centos192 ~]# renice +3 30799; ps -l 30799
30799: old priority 1, new priority 3
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY        TIME CMD
0 R     0 30799 29538 98  83   3 - 26514 -      pts/2      0:40 sh count1.sh
10000000 A

注意,只有root用户才能提高进程的调度优先级,让进程变得不太nice。更多信息参考nice和renice的man手册页。

这篇关于IBM的LPI复习资料之LPI101-Topic103 :GNU和Unix命令(6)改变进程优先级的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/603278

相关文章

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon