zoukankan      html  css  js  c++  java
  • 程序的运行顺序(转)

    关於程序的运行顺序

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

    CPU 排程与前一章的例行性工作排程并不一样。 CPU 排程指的是每支程序被 CPU 运行的演算守则, 而例行性工作排程则是将某支程序安排在某个时间再交由系统运行。 CPU 排程与操作系统较具有相关性!

    Priority 与 Nice 值

    我们知道 CPU 一秒钟可以运行多达数 G 的微命令次数,透过核心的 CPU 排程可以让各程序被 CPU 所切换运行, 因此每个程序在一秒钟内或多或少都会被 CPU 运行部分的命令码。如果程序都是集中在一个伫列中等待 CPU 的运行, 而不具有优先顺序之分,也就是像我们去游乐场玩热门游戏需要排队一样,每个人都是照顺序来! 你玩过一遍后还想再玩 (没有运行完毕),请到后面继续排队等待。情况有点像底下这样:


    上图中假设 pro1, pro2 是紧急的程序, pro3, pro4 是一般的程序,在这样的环境中,由於不具有优先顺序, 唉啊!pro1, pro2 还是得要继续等待而没有优待呢!如果 pro3, pro4 的工作又臭又长!那么紧急的 pro1, pro2 就得要等待个老半天才能够完成!真麻烦啊!所以罗,我们想要将程序分优先顺序啦!如果优先序较高则运行次数可以较多次, 而不需要与较慢优先的程序抢位置!我们可以将程序的优先顺序与 CPU 排程进行如下图的解释:

    如上图所示,具高优先权的 pro1, pro2 可以被取用两次,而较不重要的 pro3, pro4 则运行次数较少。 如此一来 pro1, pro2 就可以较快被完成啦!要注意,上图仅是示意图,并非较优先者一定会被运行两次啦! 为了要达到上述的功能,我们 Linux 给予程序一个所谓的『优先运行序 (priority, PRI)』, 这个 PRI 值越低代表越优先的意思。不过这个 PRI 值是由核心动态调整的, 使用者无法直接调整 PRI 值的。先来瞧瞧 PRI 曾在哪里出现?

    [root@www ~]# ps -l
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    4 S     0 18625 18623  2  75   0 -  1514 wait   pts/1    00:00:00 bash
    4 R     0 18653 18625  0  77   0 -  1102 -      pts/1    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 值

    复制代码
    [root@www ~]# nice [-n 数字] command
    选项与参数:
    -n  :后面接一个数值,数值的范围 -20 ~ 19。
    
    范例一:用 root 给一个 nice 值为 -5 ,用於运行 vi ,并观察该程序!
    [root@www ~]# nice -n -5 vi &
    [1] 18676
    [root@www ~]# ps -l
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    4 S     0 18625 18623  0  75   0 -  1514 wait   pts/1    00:00:00 bash
    4 T     0 18676 18625  0  72  -5 -  1242 finish pts/1    00:00:00 vi
    4 R     0 18678 18625  0  77   0 -  1101 -      pts/1    00:00:00 ps
    # 原本的 bash PRI 为 75  ,所以 vi 默认应为 75。不过由於给予 nice  为 -5 ,
    # 因此 vi 的 PRI 降低了!但并非降低到 70 ,因为核心还会动态调整!
    
    [root@www ~]# kill -9 %1 <==测试完毕将 vi 关闭
    复制代码

    就如同前面说的, nice 是用来调整程序的运行优先顺序!这里只是一个运行的范例罢了! 通常什么时候要将 nice 值调大呢?举例来说,系统的背景工作中, 某些比较不重要的程序之进行:例如备份工作!由於备份工作相当的耗系统资源, 这个时候就可以将备份的命令之 nice 值调大一些,可以使系统的资源分配的更为公平!

    renice :已存在程序的 nice 重新调整

    复制代码
    [root@www ~]# renice [number] PID
    选项与参数:
    PID :某个程序的 ID 啊!
    
    范例一:找出自己的 bash PID ,并将该 PID 的 nice 调整到 10
    [root@www ~]# ps -l
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    4 S     0 18625 18623  0  75   0 -  1514 wait   pts/1    00:00:00 bash
    4 R     0 18712 18625  0  77   0 -  1102 -      pts/1    00:00:00 ps
    
    [root@www ~]# renice 10 18625
    18625: old priority 0, new priority 10
    
    [root@www ~]# ps -l
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    4 S     0 18625 18623  0  85  10 -  1514 wait   pts/1    00:00:00 bash
    4 R     0 18715 18625  0  87  10 -  1102 -      pts/1    00:00:00 ps
    复制代码

    如果要调整的是已经存在的某个程序的话,那么就得要使用 renice 了。使用的方法很简单, renice 后面接上数值及 PID 即可。因为后面接的是 PID ,所以你务必要以 ps 或者其他程序观察的命令去找出 PID 才行啊!

    由上面这个范例当中我们也看的出来,虽然修改的是 bash 那个程序,但是该程序所触发的 ps 命令当中的 nice 也会继承而为 10 喔!了解了吧!整个 nice 值是可以在父程序 --> 子程序之间传递的呢! 另外,除了 renice 之外,其实那个 top 同样的也是可以调整 nice 值的!

    转自 http://www.cnblogs.com/ggjucheng/archive/2012/10/21/2733147.html

  • 相关阅读:
    HDU 3572 Task Schedule(拆点+最大流dinic)
    POJ 1236 Network of Schools(Tarjan缩点)
    HDU 3605 Escape(状压+最大流)
    HDU 1166 敌兵布阵(分块)
    Leetcode 223 Rectangle Area
    Leetcode 219 Contains Duplicate II STL
    Leetcode 36 Valid Sudoku
    Leetcode 88 Merge Sorted Array STL
    Leetcode 160 Intersection of Two Linked Lists 单向链表
    Leetcode 111 Minimum Depth of Binary Tree 二叉树
  • 原文地址:https://www.cnblogs.com/fwdxl/p/6706072.html
Copyright © 2011-2022 走看看