进程执行优先级
<h2 id="3-priority" style="margin-top: 5px; margin-bottom: 5px; border: 0px; outline: 0px; vertical-align: baseline; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial; color: rgb(0, 0, 0); font-size: 1.6em !important;">了解优先级</h2><h2 id="3-priority" style="margin-top: 5px; margin-bottom: 5px; border: 0px; outline: 0px; vertical-align: baseline; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial; color: rgb(0, 0, 0); font-size: 1.6em !important;"><span style="color: rgb(34, 34, 34); font-family: Arial, sans-serif; font-size: 1.166em; line-height: 1.5em; font-weight: normal;">Linux 与其他现代操作系统一样,也可以运行多个进程。它在多个进程之间共享 CPU 和其他资源。如果一个进程占用了 100% 的 CPU,那么其他进程将无法响应。</span></h2><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; font-size: 1.166em !important;">如果运行 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">top</code> 命令,默认将按照 CPU 使用量的降序显示进程,如清单 1 所示。在上一篇文章 “<font color="#745285">学习 Linux,101:创建、监控和终止进程</font>” 中,我们展示了一个简易的数字时钟脚本,它每 30 秒在控制台打印,其他时间不执行任何操作。如果我们运行该进程,它可以不会出现在<code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">top</code> 的输出列表上,因为该进程大部分时间不使用 CPU。</p><h5 id="N1009B" style="margin-top: 5px; border: 0px; outline: 0px; vertical-align: baseline; color: rgb(0, 0, 0); font-family: Arial, sans-serif; font-size: 1.166em !important;">清单 1. Linux 工作站上 top 命令的典型输出</h5><div class="codesection" style="border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(0, 0, 0); line-height: 15px;"><pre class="displaycode" style="border: 1px solid rgb(204, 204, 204); outline: 0px; font-size: 11px; vertical-align: baseline; width: 780px; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; overflow: auto; clear: right; margin-bottom: 6px !important; padding: 5px 10px 5px 3px !important; background-color: rgb(247, 247, 247) !important;">top - 08:00:52 up 1 day, 10:20,5 users,load average: 0.04, 0.08, 0.04Tasks: 172 total, 1 running, 171 sleeping, 0 stopped, 0 zombie
Cpu(s):3.7%us,0.3%sy,0.0%ni, 95.6%id,0.0%wa,0.0%hi,0.3%si,0.0%st
Mem: 4057976k total,1777976k used,2280000k free, 225808k buffers
Swap: 10241428k total, 0k used, 10241428k free, 655796k cached
PID USER PRNIVIRTRESSHR S %CPU %MEM TIME+COMMAND
11220 ian 20 0555m 106m27m S 82.736:06.16 firefox
7 root 15-5 0 0 0 S 10.010:59.36 ksoftirqd/1
10849 ian 20 0212m15m10m S 00.4 0:08.11 gnome-terminal
1 root 20 0 19584 1888 1196 S 00.0 0:00.83 init
2 root 15-5 0 0 0 S 00.0 0:00.01 kthreadd
3 root RT-5 0 0 0 S 00.0 0:00.02 migration/0
4 root 15-5 0 0 0 S 00.0 0:01.08 ksoftirqd/0
5 root RT-5 0 0 0 S 00.0 0:00.00 watchdog/0
6 root RT-5 0 0 0 S 00.0 0:00.03 migration/1</pre></div><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; font-size: 1.166em !important;">您的系统可能有很多命令都会占用大量 CPU。比如视频编辑工具、转换不同图片格式的程序或者音频编码转换程序(如将 mp3 转换为 ogg)等。</p><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; font-size: 1.166em !important;">如果您只有一个 CPU 或者 CPU 的数量有限,那么必须决定如何在几个计算进程之间共享这些有限的 CPU 资源。通常的做法是,选择一个要执行的进程,并让它在短时间内运行(这个时间称为<em style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline;">时间片</em>),或者一直运行到它需要等待的一些事件,如要完成的 IO 等。为了确保重要的进程能够得到 CPU,这种选择是基于<em style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline;">调度优先级</em> 进程的。清单 1 中的 <strong style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline;">NI</strong> 列展示了调度优先级或者说每个进程的 <em style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline;">niceness</em>。niceness 的范围一般从 -20 到 19,-20 表示调度优先级最高,19 表示优先级最低。</p><h3 id="N100B0" style="margin-top: 5px; margin-bottom: 5px; border: 0px; outline: 0px; vertical-align: baseline; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial; color: rgb(0, 0, 0); font-size: 1.4em !important;">使用 ps 查看 niceness</h3><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; margin-top: -2px !important; font-size: 1.166em !important;">除了 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">top</code> 命令之外,您还可以使用 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">ps</code> 命令显示 niceness 值。您可以按照从文章 “<font color="#745285">学习 Linux,101:创建、监控和终止进程</font>” 中学到的方式自定义输出,也可以使用 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">-l</code> 选项获取长清单。<code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">ps -l</code> 的结果如清单 2 所示。如果使用 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">top</code> 命令,请在 <strong style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline;">NI</strong> 列中查看 niceness 值。</p><h5 id="N100D1" style="margin-top: 5px; border: 0px; outline: 0px; vertical-align: baseline; color: rgb(0, 0, 0); font-family: Arial, sans-serif; font-size: 1.166em !important;">清单 2. 使用 ps 查看 niceness</h5><div class="codesection" style="border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(0, 0, 0); line-height: 15px;"><pre class="displaycode" style="border: 1px solid rgb(204, 204, 204); outline: 0px; font-size: 11px; vertical-align: baseline; width: 780px; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; overflow: auto; clear: right; margin-bottom: 6px !important; padding: 5px 10px 5px 3px !important; background-color: rgb(247, 247, 247) !important;">ian@attic4:~$ <strong style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline; font-family: Arial, sans-serif;">ps -l</strong>
F S UID PIDPPIDC PRINI ADDR SZ WCHANTTY TIME CMD
0 S1000 26502 26501080 0 -5368 wait pts/4 00:00:00 bash
0 R1000 27046 26502080 0 -1684 - pts/4 00:00:00 ps</pre></div><h3 id="N100D9" style="margin-top: 5px; margin-bottom: 5px; border: 0px; outline: 0px; vertical-align: baseline; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial; color: rgb(0, 0, 0); font-size: 1.4em !important;">niceness 的默认值</h3><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; margin-top: -2px !important; font-size: 1.166em !important;">从清单 1 和清单 2 中我们可以猜测出,常规用户所启用进程的 niecess 的默认值是 0。在当前的 Linux 系统中通常是这样。您可以运行 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">nice</code> 命令且不带任何参数,以此验证您的 shell 和系统中的该值,如清单 3 所示。</p><h5 id="N100E4" style="margin-top: 5px; border: 0px; outline: 0px; vertical-align: baseline; color: rgb(0, 0, 0); font-family: Arial, sans-serif; font-size: 1.166em !important;">清单 3. 查看默认 niceness</h5><div class="codesection" style="border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(0, 0, 0); line-height: 15px;"><pre class="displaycode" style="border: 1px solid rgb(204, 204, 204); outline: 0px; font-size: 11px; vertical-align: baseline; width: 780px; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; overflow: auto; clear: right; margin-bottom: 6px !important; padding: 5px 10px 5px 3px !important; background-color: rgb(247, 247, 247) !important;">ian@attic4:~$ <strong style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline; font-family: Arial, sans-serif;">nice</strong>
0</pre></div><div class="ibm-alternate-rule" style="margin-top: 10px; margin-bottom: 10px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; font-family: Arial, sans-serif; background-color: rgb(204, 204, 204); height: 1px; clear: both; color: rgb(0, 0, 0); line-height: 15px;"></div><p class="ibm-ind-link ibm-back-to-top" style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); clear: both; text-align: right; height: 22px; line-height: 1.5em; font-size: 1.166em !important;"><a href="http://www.ibm.com/developerworks/cn/linux/l-lpic1-v3-103-6/#ibm-pcon" class="ibm-anchor-up-link" style="padding-left: 16px; border-width: 0px; border-bottom-style: none; outline: 0px; font-size: inherit; vertical-align: baseline; color: rgb(116, 82, 133); opacity: 0.8; display: inline; text-decoration: none; line-height: 1.065em; font-weight: bold; background-image: url(<img src=" http:="" 1.www.s81c.com="" i="" v17="" icons="" ibm_sprite_arrow_blue_on.png"="" border="0" alt="">) !important; background-position: 0px -401px; background-repeat: no-repeat no-repeat;">回页首</a></p><h2 id="7-priorityset" style="margin-top: 5px; margin-bottom: 5px; border: 0px; outline: 0px; vertical-align: baseline; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial; color: rgb(0, 0, 0); font-size: 1.6em !important;">设置优先级</h2><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; margin-top: 5px !important; font-size: 1.166em !important;">在查看如何设置或更改 niceness 值之前,我们先构建一个 CPU 密集型小脚本,演示 niceness 的工作方式。</p><h3 id="N100F2" style="margin-top: 5px; margin-bottom: 5px; border: 0px; outline: 0px; vertical-align: baseline; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial; color: rgb(0, 0, 0); font-size: 1.4em !important;">CPU 密集型脚本</h3><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; margin-top: -2px !important; font-size: 1.166em !important;">我们将创建一个小脚本,它占用较多的 CPU,但执行的操作很简单。该脚本有两个输入:计数和标签。它打印标签以及当前的日期和时间,然后旋转,递减计数,直到它到达 0,最后再次打印标签和日期。该脚本如清单 4 所示,它没有任何错误检查机制,也不是非常稳定,但是它足以满足我们的演示需要。</p><h5 id="N100FA" style="margin-top: 5px; border: 0px; outline: 0px; vertical-align: baseline; color: rgb(0, 0, 0); font-family: Arial, sans-serif; font-size: 1.166em !important;">清单 4. CPU 密集型脚本</h5><div class="codesection" style="border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(0, 0, 0); line-height: 15px;"><pre class="displaycode" style="border: 1px solid rgb(204, 204, 204); outline: 0px; font-size: 11px; vertical-align: baseline; width: 780px; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; overflow: auto; clear: right; margin-bottom: 6px !important; padding: 5px 10px 5px 3px !important; background-color: rgb(247, 247, 247) !important;">ian@attic4:~$ <strong style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline; font-family: Arial, sans-serif;">echo 'x="$1"'>count1.sh</strong>
ian@attic4:~$ <strong style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline; font-family: Arial, sans-serif;">echo 'echo "$2" $(date)'>>count1.sh</strong>
ian@attic4:~$ <strong style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline; font-family: Arial, sans-serif;">echo 'while [ $x -gt 0 ]; do x=$(( x-1 ));done'>>count1.sh</strong>
ian@attic4:~$ echo 'echo "$2" $(date)'>>count1.sh
ian@attic4:~$ cat count1.sh
x="$1"
echo "$2" $(date)
while [ $x -gt 0 ]; do x=$(( x-1 ));done
echo "$2" $(date)</pre></div><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; font-size: 1.166em !important;">如果在系统上运行该脚本,它的输出将类似于清单 5。您可能需要增加计数值以查看时间的不同,具体取决于您系统的速度。该脚本将占用大量 CPU,等会我们就会看到这一点。如果您的默认 shell 不是 Bash,如果您的脚本无法运行,那么可以使用下文所示的第二种调用形式。如果您使用的不是自己的工作站,运行脚本前请确保占用大量 CPU 不会导致不良影响。</p><h5 id="N1010C" style="margin-top: 5px; border: 0px; outline: 0px; vertical-align: baseline; color: rgb(0, 0, 0); font-family: Arial, sans-serif; font-size: 1.166em !important;">清单 5. 运行 count1.sh</h5><div class="codesection" style="border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(0, 0, 0); line-height: 15px;"><pre class="displaycode" style="border: 1px solid rgb(204, 204, 204); outline: 0px; font-size: 11px; vertical-align: baseline; width: 780px; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; overflow: auto; clear: right; margin-bottom: 6px !important; padding: 5px 10px 5px 3px !important; background-color: rgb(247, 247, 247) !important;">ian@attic4:~$ sh count1.sh 10000 A
A Wed Jan 20 08:34:16 EST 2010
A Wed Jan 20 08:34:16 EST 2010
ian@attic4:~$ bash count1.sh 99000 A
A Wed Jan 20 08:34:20 EST 2010
A Wed Jan 20 08:34:22 EST 2010</pre></div><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; font-size: 1.166em !important;">到目前为止一切顺利。现在让我们创建一个在后台运行的脚本,并启动 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">top</code> 命令查看脚本所用 CPU 的命令清单(请参见之前的文章 “<font color="#745285">学习 Linux,101:Linux 命令行</font>” 了解最新的命令清单)。命令清单如清单 6 所示,<code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">top</code> 的输出见清单 7。</p><h5 id="N1011F" style="margin-top: 5px; border: 0px; outline: 0px; vertical-align: baseline; color: rgb(0, 0, 0); font-family: Arial, sans-serif; font-size: 1.166em !important;">清单 6. 运行 count1.sh 和 top</h5><div class="codesection" style="border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(0, 0, 0); line-height: 15px;"><pre class="displaycode" style="border: 1px solid rgb(204, 204, 204); outline: 0px; font-size: 11px; vertical-align: baseline; width: 780px; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; overflow: auto; clear: right; margin-bottom: 6px !important; padding: 5px 10px 5px 3px !important; background-color: rgb(247, 247, 247) !important;">ian@attic4:~$ <strong style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline; font-family: Arial, sans-serif;">(sh count1.sh 5000000 A&);top</strong></pre></div><h5 id="N10128" style="margin-top: 5px; border: 0px; outline: 0px; vertical-align: baseline; color: rgb(0, 0, 0); font-family: Arial, sans-serif; font-size: 1.166em !important;">清单 7. 占用大量 CPU</h5><div class="codesection" style="border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(0, 0, 0); line-height: 15px;"><pre class="displaycode" style="border: 1px solid rgb(204, 204, 204); outline: 0px; font-size: 11px; vertical-align: baseline; width: 780px; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; overflow: auto; clear: right; margin-bottom: 6px !important; padding: 5px 10px 5px 3px !important; background-color: rgb(247, 247, 247) !important;">top - 15:41:15 up 1 day, 17:59,6 users,load average: 0.20, 0.06, 0.02
Tasks: 169 total, 2 running, 167 sleeping, 0 stopped, 0 zombie
Cpu(s): 52.1%us,0.7%sy,0.0%ni, 47.3%id,0.0%wa,0.0%hi,0.0%si,0.0%st
Mem: 4057976k total,1393772k used,2664204k free, 235596k buffers
Swap: 10241428k total, 0k used, 10241428k free, 662592k cached
PID USER PRNIVIRTRESSHR S %CPU %MEM TIME+COMMAND
26756 ian 20 04004588496 R1000.0 0:03.53 sh
11220 ian 20 0555m 101m27m S 52.657:58.07 firefox
26757 ian 20 0 19132 1364980 R 00.0 0:00.03 top
1 root 20 0 19584 1888 1196 S 00.0 0:00.89 init
2 root 15-5 0 0 0 S 00.0 0:00.01 kthreadd</pre></div><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; font-size: 1.166em !important;">不错。我们只使用了一个简单的脚本就占用了系统中一个 CPU 100% 的资源。如果希望占用多个 CPU,您可以在命令清单中添加对<code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">count1.sh</code> 的调用。如果运行过类似的作业,您会发现我们将无法在系统上执行其他工作(其他用户也是如此)。</p><h3 id="N10132" style="margin-top: 5px; margin-bottom: 5px; border: 0px; outline: 0px; vertical-align: baseline; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial; color: rgb(0, 0, 0); font-size: 1.4em !important;">使用 nice 设置优先级</h3><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; margin-top: -2px !important; font-size: 1.166em !important;">现在我们可以让 CPU 持续忙碌一段时间,我们了解如何设置进程的优先级。目前我们学到的内容总结如下:</p><ul class="ibm-bullet-list" style="border: 0px; outline: 0px; font-size: 1.166em; vertical-align: baseline; list-style: none; padding-bottom: 8px; color: rgb(51, 51, 51); line-height: 1.5em; font-family: Arial, sans-serif;"><li style="margin-left: 0px; padding-top: 5px; padding-bottom: 5px; padding-left: 11px; border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline; background-image: url(<img src=" http:="" 1.www.s81c.com="" i="" v17="" bullets="" ibm_lg_bullet_grey_on.gif"="" border="0" alt="">); height: 22px; clear: left; background-position: 0px 13px; background-repeat: no-repeat no-repeat;">Linux 和 UNIX® 系统使用有 40 个优先级的优先级系统,范围从 -20(最高优先级)到 19(最低优先级)。</li><li style="margin-left: 0px; padding-top: 5px; padding-bottom: 5px; padding-left: 11px; border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline; background-image: url(<img src=" http:="" 1.www.s81c.com="" i="" v17="" bullets="" ibm_lg_bullet_grey_on.gif"="" border="0" alt="">); height: 22px; clear: left; background-position: 0px 13px; background-repeat: no-repeat no-repeat;">常规用户启动的进程优先级一般是 0。</li><li style="margin-left: 0px; padding-top: 5px; padding-bottom: 5px; padding-left: 11px; border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline; background-image: url(<img src=" http:="" 1.www.s81c.com="" i="" v17="" bullets="" ibm_lg_bullet_grey_on.gif"="" border="0" alt="">); height: 23px; clear: left; background-position: 0px 13px; background-repeat: no-repeat no-repeat;"><code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">ps</code> 命令可以使用 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">-l</code> 选项显示优先级(例如,nice 或 NI、level)。</li><li style="margin-left: 0px; padding-top: 5px; padding-bottom: 5px; padding-left: 11px; border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline; background-image: url(<img src=" http:="" 1.www.s81c.com="" i="" v17="" bullets="" ibm_lg_bullet_grey_on.gif"="" border="0" alt="">); height: 23px; clear: left; background-position: 0px 13px; background-repeat: no-repeat no-repeat;"><code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">nice</code> 命令显示我们的默认优先级。</li></ul><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; font-size: 1.166em !important;"><code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">nice</code> 命令还可以用来启动具有不同优先级的进程。使用 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">-n</code> 或 (<code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">--adjustment</code>) 选项时带一个负值可以增加优先级值,带一个正值将减少优先级值。记住,具有最低优先级值的进程运行时有最高调度优先级,因此可以这样记忆,增加优先级值对于其他进程而言更<em style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline;">好(nice)</em>。注意,您必须是超级用户(根用户)才能调低优先级值。换句话说,常规用户通常只能增加它们的优先级值。</p><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; font-size: 1.166em !important;">为了演示如何使用 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">nice</code> 设置优先级,首先同时在不同的 subshell 中启动两个 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">count1.sh</code> 脚本的副本,但是将其中一个的 nice 值设置为最大值 19。一会儿之后,我们使用 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">ps -l</code> 显示进程状态,包括 niceness。最后,我们添加任意 30 秒的休眠时间,确保两个 subshell 完成之后命令序列完成。这样一来,我们在等待输出时不会得到新的提示。结果如清单 8 所示。</p><h5 id="N10167" style="margin-top: 5px; border: 0px; outline: 0px; vertical-align: baseline; color: rgb(0, 0, 0); font-family: Arial, sans-serif; font-size: 1.166em !important;">清单 8. 使用 nice 设置一对进程的优先级</h5><div class="codesection" style="border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(0, 0, 0); line-height: 15px;"><pre class="displaycode" style="border: 1px solid rgb(204, 204, 204); outline: 0px; font-size: 11px; vertical-align: baseline; width: 780px; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; overflow: auto; clear: right; margin-bottom: 6px !important; padding: 5px 10px 5px 3px !important; background-color: rgb(247, 247, 247) !important;">ian@attic4:~$ <strong style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline; font-family: Arial, sans-serif;">(sh count1.sh 2000000 A&);(nice -n 19 sh count1.sh 2000000 B&);\</strong>
> <strong style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline; font-family: Arial, sans-serif;">sleep 1;ps -l;sleep 10</strong>
A Thu Jan 21 14:38:39 EST 2010
B Thu Jan 21 14:38:39 EST 2010
F S UID PIDPPIDC PRINI ADDR SZ WCHANTTY TIME CMD
0 R1000 946 1 9980 0 -1001 - pts/3 00:00:01 sh
0 R1000 948 1 999919 -1001 - pts/3 00:00:01 sh
0 R1000 952 32408080 0 -1684 - pts/3 00:00:00 ps
0 S1000 32408 32407080 0 -5368 wait pts/3 00:00:02 bash
A Thu Jan 21 14:38:45 EST 2010
B Thu Jan 21 14:38:45 EST 2010</pre></div><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; font-size: 1.166em !important;">您对两个作业同时完成感到奇怪吗?我们的优先级设置怎么了?记住,脚本占用了<strong style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline;">一个</strong> CPU。这个系统运行在 AMD Athlon™ 7750 双核处理器上,它的负载很轻,每个内核运行一个进程,不需要进行优化。</p><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; font-size: 1.166em !important;">那么,让我们使用 4 个不同的 niceness 水平(0、6、12、18)启动 4 个进程查看会发生什么情况。我们将增加每个进程的忙碌计数参数使之运行的时间更长一些。查看清单 9 之前,请根据您了解的内容,预期一下会发生什么情况。</p><h5 id="N1017D" style="margin-top: 5px; border: 0px; outline: 0px; vertical-align: baseline; color: rgb(0, 0, 0); font-family: Arial, sans-serif; font-size: 1.166em !important;">清单 9. 使用 nice 设置 4 个进程的属性</h5><div class="codesection" style="border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(0, 0, 0); line-height: 15px;"><pre class="displaycode" style="border: 1px solid rgb(204, 204, 204); outline: 0px; font-size: 11px; vertical-align: baseline; width: 780px; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; overflow: auto; clear: right; margin-bottom: 6px !important; padding: 5px 10px 5px 3px !important; background-color: rgb(247, 247, 247) !important;">ian@attic4:~$ <strong style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline; font-family: Arial, sans-serif;">(sh count1.sh 5000000 A&);(nice -n 6 sh count1.sh 5000000 B&);\</strong>
> <strong style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline; font-family: Arial, sans-serif;">(nice -n 12 sh count1.sh 5000000 C&);(nice -n 18 sh count1.sh 5000000 D&);\</strong>
> <strong style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline; font-family: Arial, sans-serif;">sleep 1;ps -l;sleep 30</strong>
A Thu Jan 21 16:06:00 EST 2010
C Thu Jan 21 16:06:00 EST 2010
D Thu Jan 21 16:06:00 EST 2010
B Thu Jan 21 16:06:00 EST 2010
F S UID PIDPPIDC PRINI ADDR SZ WCHANTTY TIME CMD
0 R10001422 1 9480 0 -1001 - pts/3 00:00:00 sh
0 R10001424 1 4286 6 -1001 - pts/3 00:00:00 sh
0 R10001427 1 569212 -1001 - pts/3 00:00:00 sh
0 R10001431 1 149818 -1001 - pts/3 00:00:00 sh
0 R10001435 32408080 0 -1684 - pts/3 00:00:00 ps
0 S1000 32408 32407080 0 -5368 wait pts/3 00:00:02 bash
A Thu Jan 21 16:06:14 EST 2010
B Thu Jan 21 16:06:17 EST 2010
C Thu Jan 21 16:06:26 EST 2010
D Thu Jan 21 16:06:30 EST 2010</pre></div><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; font-size: 1.166em !important;">使用 4 个不同的优先级我们发现,每个作业按照优先级顺序完成。请自行尝试不同的 nice 值演示各种可能的情况。</p><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; font-size: 1.166em !important;">使用 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">nice</code> 启动进程最后要注意的一点是:使用 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">nohup</code> 命令时,不能使用命令清单或管道作为 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">nice</code> 的参数。</p><div class="ibm-alternate-rule" style="margin-top: 10px; margin-bottom: 10px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; font-family: Arial, sans-serif; background-color: rgb(204, 204, 204); height: 1px; clear: both; color: rgb(0, 0, 0); line-height: 15px;"></div><p class="ibm-ind-link ibm-back-to-top" style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); clear: both; text-align: right; height: 22px; line-height: 1.5em; font-size: 1.166em !important;"><a href="http://www.ibm.com/developerworks/cn/linux/l-lpic1-v3-103-6/#ibm-pcon" class="ibm-anchor-up-link" style="padding-left: 16px; border-width: 0px; border-bottom-style: none; outline: 0px; font-size: inherit; vertical-align: baseline; color: rgb(116, 82, 133); opacity: 0.8; display: inline; text-decoration: none; line-height: 1.065em; font-weight: bold; background-image: url(<img src=" http:="" 1.www.s81c.com="" i="" v17="" icons="" ibm_sprite_arrow_blue_on.png"="" border="0" alt="">) !important; background-position: 0px -401px; background-repeat: no-repeat no-repeat;">回页首</a></p><h2 id="7-prioritychange" style="margin-top: 5px; margin-bottom: 5px; border: 0px; outline: 0px; vertical-align: baseline; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial; color: rgb(0, 0, 0); font-size: 1.6em !important;">更改优先级</h2><h3 id="N1019C" style="margin-top: 5px; margin-bottom: 5px; border: 0px; outline: 0px; vertical-align: baseline; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial; color: rgb(0, 0, 0); font-size: 1.4em !important;">renice</h3><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; margin-top: -2px !important; font-size: 1.166em !important;">如果您正好启动了一个进程,但意识到它应该以不同的优先级运行,那么有一种方法可以在启动之后对其进行更改,即使用 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">renice</code> 命令。您可以为进程指定一个绝对优先级(不是调整值),进程的更改如清单 10 所示。</p><h5 id="N101A7" style="margin-top: 5px; border: 0px; outline: 0px; vertical-align: baseline; color: rgb(0, 0, 0); font-family: Arial, sans-serif; font-size: 1.166em !important;">清单 10. 使用 renice 更改优先级</h5><div class="codesection" style="border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(0, 0, 0); line-height: 15px;"><pre class="displaycode" style="border: 1px solid rgb(204, 204, 204); outline: 0px; font-size: 11px; vertical-align: baseline; width: 780px; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; overflow: auto; clear: right; margin-bottom: 6px !important; padding: 5px 10px 5px 3px !important; background-color: rgb(247, 247, 247) !important;">ian@attic4:~$ <strong style="border: 0px; outline: 0px; font-size: inherit; vertical-align: baseline; font-family: Arial, sans-serif;">sh count1.sh 10000000 A&</strong>
1537
ian@attic4:~$ A Thu Jan 21 16:17:16 EST 2010
sh count1.sh 1renice 1 1537;ps -l 1537
1537: old priority 0, new priority 1
F S UID PIDPPIDC PRINI ADDR SZ WCHANTTY TIME CMD
0 R10001537 32408 9981 1 -1001 - pts/3 0:13 sh count1.sh 100
ian@attic4:~$ renice +3 1537;ps -l 1537
1537: old priority 1, new priority 3
F S UID PIDPPIDC PRINI ADDR SZ WCHANTTY TIME CMD
0 R10001537 32408 9983 3 -1001 - pts/3 0:18 sh count1.sh 100</pre></div><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; font-size: 1.166em !important;">记住,您必须是超级用户才能为进程指定更高的调度优先级,或者说让它们的 nice 值更低。</p><p style="padding-top: 6px; padding-bottom: 6px; border: 0px; outline: 0px; vertical-align: baseline; font-family: Arial, sans-serif; color: rgb(34, 34, 34); line-height: 1.5em; font-size: 1.166em !important;">您可以在手册上找到有关 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">nice</code> 和 <code style="border: 0px; outline: 0px; vertical-align: baseline; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; line-height: 1.5em; font-size: 0.95em !important; color: rgb(0, 0, 0) !important;">renice</code> 的更多信息。</p>
页:
[1]