赵海龙
侠客
侠客
  • UID494
  • 粉丝0
  • 关注0
  • 发帖数4
阅读:4676回复:0

Linux系统进程的理解与相关命令的使用系列

楼主#
更多 发布于:2019-07-29 14:25
        我们的知道进程是程序的实例,进程是程序向操作系统申请资源(如内存空间和文件句柄等)的基本单位。而线程是进程中可独立执行的最小单位,一个进程中可包含很多线程。而该进程中的所有线程共享着该进程申请的资源。进程就是正在执行的程序。而在Linux中,可以使用一个进程来创建另外一个进程。这样的话,Linux的进程的组织结构其实有点像Linux目录树,是个层次结构的,可以使用pstree命令来查看(如图1)。在最上面是init程序的执行进程。它是所有进程的老祖宗。Linux提供了两个函数来创建进程同,分别是fork()execle()
     图1:
          

图片:1.png



一、进程的七种状态
      (1)、R运行状态(runing):并不意味着进程一定在运行中,也可以在运行队列里;
      (2)、S睡眠状态(sleeping):进程在等待事件完成;(浅度睡眠,可以被唤醒);
      (3)、D磁盘睡眠状态(Disk sleep):不可中断睡眠(深度睡眠,不可以被唤醒,通常在磁盘写入时发生);
      (4)、T停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止进程,可以发送SIGCONT信号让进程继续运行;
      (5)、X死亡状态(dead):该状态是返回状态,在任务列表中看不到;
      (6)、Z僵尸状态(zombie):子进程退出,父进程还在运行,但是父进程没有读到子进程的退出状态,子进程进入僵尸状态;
      (7)、t追踪停止状态(trancing stop);
       查看进程的状态命令:ps aux | grep pid | grep -v grep    
       如图:查询的是sshd进程的状态
              

图片:2.png



       PS: 僵尸进程的危害  
           1 上面说到僵尸进程是由于父进程没有读取到子进程的退出信息而产生的,那么我们是不是就可以理解为父进程一直以为处于僵尸状态的子进程是没有退出的。而进程是需要维护的,僵尸进程就会一直需要PCB对其进行维护;
           2 浪费内存资源。如果僵尸进程一直没有退出,就会一直占用这块内存,就会导致内存资源的浪费;
           3 内存泄漏。僵尸进程一直占用资源,但是却不使用,就可能会导致内存泄漏。
二、进程的优先级
      分别为nice值和Priority值
      当我们使用top命令查询进程时,如图红色框中的值即是nice值和Priority
      

图片:3.png


      1) nice值
             反应一个进程“优先级”状态的值
             取值范围是 -20 ~ 19, 40个级别
             nice值越小,“优先级”越高
      2) Priority值
             优先级值
             linux上实现了140个优先级范围,取值是从0~139
             0 ~ 99表示实时进程;100 ~ 139表示非实时进程
三、进程操作的常用命令
      1、常用的进程动态查看命令ps
           1)、常用命令组合 ps aux ,该命令组合和ps -ef组合功能一样
                a:与终端有关的进程,用户通过终端启动,退出shell时,进程会终止。
                x:与终端无关的进程,系统启动过程中自动启动的进程。
                u:以用户为中心组织进程状态显示
                

图片:4.png


       2、常用top命令
        1)、语法:top [options]
        2)、参数:
                -d #:指定刷新时间间隔,默认5秒
-n #:指定刷新批次,即指定刷新次数,刷新完成后自动退出
-b:以批次方式显示
        3)、当使用top命令输出时,可以使用如下命令对输出结果进行操作
              a、排序相关
                    P:占CPU百分比%CPU排序
                    M:占内存百分比%MEM排序
                    T:累计占用CPU时间TIME+排序
               b、 开关相关
                    l:第一行uptime信息开关
                    t:第二行tasks和第三行cpu信息开关
                    m:第四行mem和第五行swap信息开关
        4)、top 查询结果前5行参数详细说明
            

图片:5.png


            第 一行 分别显示:系统当前时间 系统运行时间 当前用户登陆数 系统负载。*系统负载(load average),这里有三个数值,分别   是系统最近1分钟,5分钟,15分钟的平均负载。一般对于单个处理器来说,负载在0 — 1.00 之间是正常的,超过1.00就要引起注意了。在多核处理器中,你的系统均值不应该高于处理器核心的总数。
           第二行 分别显示:total进程总数、 running正在运行的进程数、 sleeping睡眠的进程数、stopped停止的进程数、 zombie僵尸进程数。
           第三行分别显示:
               %us 用户空间占用CPU百分比、
               %sy 内核空间占用CPU百分比、
               %ni 用户进程空间内改变过优先级的进程占用CPU百分比、
               %id 空闲CPU百分比、
               %wa 等待输入输出(I/O)的CPU时间百分比 、
               %hi指的是cpu处理硬件中断的时间、%si指的是cpu处理软中断的时间 、
               %st用于有虚拟cpu的情况,用来指示被虚拟机偷掉的cpu时间。
                通常id%值可以反映一个系统cpu的闲忙程度。
       第四行 MEM :total 物理内存总量、    used 使用的物理内存总量、free 空闲内存总量、    buffers 用作内核缓存的内存量。
       第五行 SWAP:total 交换区总量、     used 使用的交换区总量、free 空闲交换区总量、 cached 缓冲的交换区总量。
       PS:buffers和cached的区别需要说明一下,buffers指的是块设备的读写缓冲区,cached指的是文件系统本身的页面缓存。它们都是linux操作系统底层的机制,目的就是为了加速对磁盘的访问。
        5)、使用top命令得到的结果及列的参数说明
        

图片:6.png


         红色框里的值对应代表意思如下:
           PID:进程号
           USER:进程属主
           PR:priority 的简写,进程优先级
           NI:nice的简写,与PR值联合控制进程的优先级
           VIRT:进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
           RES:进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
           SHR:共享内存大小,单位kb
           S:进程状态。
           %CPU:CPU使用率。
           %MEM:内存使用率。
           TIME+:CPU使用时间累和,即进程一共占用CPU多久
           COMMAND:进程对应的命令
    3)、pgrep命令
        常用参数:
               -o:仅显示找到的最小(起始)进程号;
               -n:仅显示找到的最大(结束)进程号;
               -l:显示进程名称;
               -P:指定父进程号;
               -g:指定进程组;
               -t:指定开启进程的终端;
               -u:指定进程的有效用户ID。
     4)、pstree命令
        pstree指令用ASCII字符显示树状结构,清楚地表达程序间的相互关系。如果不指定程序识别码或用户名称,则会把系统启动时的第一个程序视为基层,并显示之后的所有程序。若指定用户名称,便会以隶属该用户的第一个程序当作基层,然后显示该用户的所有程序。
     常用参数:
        -a  显示每个程序的完整指令,包含路径,参数或是常驻服务的标示。
-c  不使用精简标示法。
-G  使用VT100终端机的列绘图字符。
-h  列出树状图时,特别标明现在执行的程序。
-H<程序识别码>  此参数的效果和指定"-h"参数类似,但特别标明指定的程序。
-l  采用长列格式显示树状图。
-n  用程序识别码排序。预设是以程序名称来排序。
-p  显示程序识别码。
-u  显示用户名称。
-U  使用UTF-8列绘图字符。
-V  显示版本信息。
四、进程的停止
        kill命令的理解与运用
        作用:用来终止一个进程
        原理: kill命令的工作原理是,向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,然后系统内核就可以对进程标识号指定的进程进行操作。比如在top命令中,我们看到系统运行许多进程,有时就需要使用kill中止某些进程来提高系统资源。
        我们可以使用kill -l命令查询出kill命令可选参数列表,如下图:
        

图片:7.png


        下面是常用的信号及解释:
        代号               名称                        内容
         1            SIGHUP             启动被终止的程序,可让该进程重新读取自己的配置文件,类似重新启动。
         2             SIGINT             相当于用键盘输入 [ctrl]-c 来中断一个程序的进行。
         9             SIGKILL              代表强制中断一个程序的进行,如果该程序进行到一半,那么尚未完成的部分                                                                可能会有“半产品”产生,类似 vim会有 .filename.swp 保留下来。
        16           SIGTERM             以正常的方式来终止该程序。由于是正常的终止,所以后续的动作会将他完                                                                    成。不过,如果该程序已经发生问题,就是无法使用正常的方法终止时,输入                                                                这 个 signal 也是没有用的。
        19           SIGSTOP            相当于用键盘输入 [ctrl]-z 来暂停一个程序的进行。  


         a、kill -15 pid
              这条命令发信号让进程正常退出。所谓的正常退出是指按应用程序自己的退出流程完成退出,这样就可以清理并释放资源。比如 vim 程序,如果是正常的退出,就会删除掉临时文件 *.swp。
既然信号 15 是退出进程的正确方式,那它也应该是最常用的方式,因而我们可以省略参数 -15。
       b、kill pid
              这条命令和上面的命令是等价的,kill 命令默认发送信号 15 给目标进程。
当进程出现了异常状况,不能通过信号15正常退出时,我们就需要通过非常的手段直接终结掉进程。所谓的非常手段就是传递信号 9 给目标进程!
        c、kill -9 pid
             这样结束掉的进程不会进行资源的清理工作,所以如果你用它来终结掉 vim 的进程,就会发现临时文件 *.swp 没有被删除。
        PS:使用信号 15 是安全的,而信号 9 则是处理异常进程的最后手段,请勿滥用。


 五、工作中常用的命令组合实例
      1、以树形结构查询一个进程的所有子进程命令: ps -p pid
      

图片:8.png


      
      2、查询出某个服务的进程运行状态,包括cpu等相关信息,可使用ps aux | grep pid/服务名称  和ps ef | grep pid/服务名称  
          

图片:9.png


    3、查询出系统中所有cpu使用情况: 使用top命令列出结果后,在按数字1展开cpu信息列表,还可以使用t键以不同的形式查看结果
        

图片:10.png


      
     4、如何正确的停步一个进程,我们可以使用 kill -15 ill -15 pid来正常停步。
     5、在java项目中,我们如何使用java提供的工具来管理和查看进程执行情况呢。这里介绍一个名叫jstack的命令工具。
       a、命令jstack -l pid时可以查看进程中的线程运行情况,如图:
            

图片:11.png


      b、也可以使用命令jstack pid > cpu0414.log 把结果生成文件下载下来阅读。
      6、如何查询出一个进程的所有子进程,包括运行详细信息。我们可以使用命令top -p 26324 -H,结果如下:
          

图片:12.png

游客

返回顶部