Linux 进程及作业管理

一 进程、线程、程序概念

1、进程(Process)

什么是进程,简单的说,进程是程序的执行实例,即运行中的程序,同时也是程序的一个副本;程序是放置于磁盘的,而运行中的程序是位于内存中的。

2、线程(Thread)

一个进程至少包括一个线程,通常将该线程称为主线程,所以线程是比进程更小的单位,是系统分配处理器时间资源的基本单元。一个进程要想同时在多颗CPU上运行,必须得分成互不影响的多个执行流,而后每组单独在各自所分配的CPU上运行,这种分化后的执行流且有着比进程更小资源分配单位称之为线程。线程之间可以共享内存空间,当一个文件需要被打开多次时,线程模型可以节省很大的内存空间,但是得避免因资源征用造成死锁问题。并且线程在运行过程当中,如果某一个线程崩溃或是出现意外情况,会影响同个进程内其它线程,比单进程模型稳定性差。

3、程序(Program)

程序由指令和数据组成。

程序是为了达到特定的目的,可以被计算机运行并且由命令代码组成的语句序列。

程序只是一个普通文件,是一个机器代码指令和数据的集合,这些指令和数据存储在磁盘上的一个可执行映象(Executable Image)中,所以,程序是一个静态的实体。

二 进程相关知识

1.虚拟地址空间

在内存中,每个程序的运行都是孤立的,每个程序只知道当前内存空间只运行了自己和内核,而看不到其它的进程。

2.内核模式与用户模式

以32bit系统为例,Linux的虚拟地址空间为0~4G。Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间)。Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。

3.进程的状态:

        运行态:runnnig

        睡眠态:sleeping

        可中断睡眠:interruptable,随时来请求,随时能唤醒,比如处理完当前请求后暂时还没有更多请求下,这种sleep就是可                                    中断 

        不可中断睡眠:uninterruptable,等待外部条件满足之前无法继续运行。       

        停止态:stopped,不会再被内核调度并运行。

        僵死态:zombie,父进程先于子进程结束了,子进程再也不能被停掉的进程。

4.进程的优先级

        CPU挑选进程是根据进程的优先级进行的,进程优先级的取值范围为0-139。

        实时优先级:0-99,数字越大,优先级越高;(内核控制)

        静态优先级:100-139,数字越小,优先级越高。(用户可控制的优先级)

        用户可以通过调整nice值来改变进程的优先级。

        nice值:-20-19 调整静态优先级

        进程启动时,默认nice值为0,优先级对应为120。

        动态优先级:由内核维护,动态调整。

        Linux使用抢占式多任务:当时钟信号到达时,高优先级进程可以抢占CPU。

5.进程间通信方式(IPC: Inter Process Communication)

同一主机:

            singnal:信号。

            shm:共享内存。

            semerphor:旗语。

不同主机:

            rpc:remote procedure calling,远程过程调用。

            socket:IP:port,套接字。

6.进程的分类:

       CPU-Bound(CPU密集型):对于CPU占用率高的进程。

       I/O-Bound(I/O密集型):等待I/O时间长的进程

7.子进程

        进程运行是单线运行的,进程中的指令必须顺序执行。             

        子进程:父进程有无法完成的任务时,启用子进程来执行,此时父进程进入睡眠,子进程执行完成后,返回父进程继续执行。

        进程创建机制:每一个进程都是由其父进程fork()自身而来。

8.线程

        线程是比进程更小的可以被单独调度的单位。

        线程将进程的任务指令拆分,分配到不同的CPU上同时运行。

        不过Linux中的进程都是轻量级进程,已经相当于线程的级别了。

三 进程管理相关命令

1.pstree    # 显示进程树

  pstree -p

blob.png

2.ps:process state,查看当前进程状态

  备注:实际上是查看/proc/ *目录下内核中的状态信息

    SYNOPSIS

           ps [options]

            

        a:显示所有与终端有关的进程

        x:显示所有与终端无关的进程

        u:显示运行进程的用户

        -e:显示所有进程

        -f:显示完整格式的进程信息

        o  field1, field2,…:自定义要显示的字段列表,以逗号分隔

常用组合:aux、ef、axo

 ps -aux

blob.png

   USER:运行该进程的用户

   PID:进程的ID号码

   %CPU:CPU的占用百分比

   %MEM:内存空间占用比率,占用整个内存空间的比例

   VSZ:虚拟内存集;占用的虚拟内存大小,真正用来占用的内存

        每个内存占用的内存有两种:线性内存空间、物理内存空间

        线性内存:会映射到物理内存,在线性内存空间角度看是连续的内存占用

        物理内存:实际上是以内存页框保存,可能一个进程占用的不连续的页框

   RSS:ResidentSize,常驻内存集,当前进程常驻内存的大小,即不能被交换出去的空间大小

   TTY:运行终端

   STAT:当前进程的运行状态,BSD样式

    R:running,运行态

    S:interruptable sleeping,可中断睡眠

    D:uninterruptable sleeping,不可中断睡眠

    T:Stopped,停止状态

    Z:zombie,僵死状态,进程结束后,在被回收之前状态

    +:表示一个前台进程,占据命令提示符

    l:多线程进程

    N:低优先级进程

    <:高优先级进程

    s:session leader ,回话主导进程,如shell,其主导其下的进程

   START:进程开始时间

   TIME:累计运行CPU时间

   COMMAND:使用进程、线程

ps -ef

blob.png

   UID:启动进程用户

   PID:运行进程号

   PPID:父进程的进程号,0在内核启动init之前存在,init启动后终止,存在过渡,一般为swap的进程

   C:cpu utilization,CPU的占用百分比

   STIME:启动时间

   TTY:与其终端相关

   TIME:累计运行CPU时间

   CMD:启动此进程的命令

ps axo  显示自定义字段列表

 o field1, field2,…:自定义要显示的字段列表,以逗号分隔,o要写在后面,因为要带参数

    常用的field:pid,ni, pri, psr, pcpu, stat, comm, tty, ppid, rtprio

    ni:nice值;

    priority:priority,优先级;

    rtprio:realtime priority,实时优先级;

3.pgrep,pkill:基于进程名字或者其他属性对相关进程发起查询、发送信号

  SYNOPSIS

         pgrep [options]  [pattern]

        

        -o:仅显示找到的最小(起始)进程号

        -n:仅显示找到的最大(结束)进程号

        -l:显示进程名称

        -P:指定父进程号

        -g:指定进程组

        -t:指定开启进程的终端

        -u:指定进程的有效用户ID

   blob.png

4.pidof:根据进程名获取取其pid;

    SYNOPSIS

           pidof [-s] [-c] [-x] [-o omitpid] [-o omitpid..]  program [program..]

            

        -s:仅显示一个

blob.png

5.top:- display Linuxprocesses,动态显示进程信息

   SYNOPSIS

        top  [OPTION]

   (1)选项:

       -d #:指定刷新时间间隔,默认为3秒;

         -b:以批次方式显示;

       -n #:显示多少批次;

   (2)在top显示过程中通过交互式命令指定排序(默认CPU):

           P:以占据CPU百分比排序;

           M:以占据内存百分比排序;

           T:累积占用CPU时间排序;

   (3)首部信息关闭

          uptime信息:l命令

          tasks及cpu信息:t命令

          内存信息:m命令

   (4)退出命令:q

   (5)修改刷新时间间隔:s

   (6)终止指定的进程:k

 top

blob.png

blob.png

  这一行的内容表示:

                23:11:04:当前系统时间;

                up  1:00:服务器连续运行的时长为1小时;

                2 users:当前登录系统的用户数;

                load average:过去1分钟、5分钟、15分钟的平均负载

1:数字,分别显示各CPU的相关信息;

blob.png

使用数字1可以查看不同的CPU的信息,下面说明各字段具体的含义:                     

                us:user space,用户运行程序时间百分比;

                sy:system,用于运行内核所占用CPU的百分比;

                ni:nice,用户进程空间内改变过优先级的进程占用CPU百分比;

                id:idle,空闲CPU百分比;

                wa:wait io,等待IO花费的时间;

                hi:hardware interrupt,硬中断占用CPU的百分比;

                si:software interrupt,软中断占用CPU的百分比;

                st:stolen,偷走的时间百分比。

blob.png

各字段含义如下:

                Mem:物理内存;

                Swap:交换分区; 

                buffers:缓冲区,用于减少进程之间的等待时间;

                cache:CPU与内存之间的高速缓存,用于减少CPU的等时间。 

 top -p 1727

blob.png

6.uptime命令:显示系统时间、运行时长及平均负载  

去1分钟、5分钟和15分钟的平均负载;等待运行的进程队列的长度;

blob.png

7.htop命令

这个工具默认没有安装 需要第三方源才可以安装

rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

yum install htop

(1)选项:

    -d#:指定延迟时间间隔;

    -uUserName:仅显示指定用户的进程;

    -sCOLUME:以指定字段进行排序;

(2)子命令:

    l:显示选定的进程打开的文件列表;

    s:跟踪选定的进程的系统调用;

    t:以层级关系显示各进程状态;

    a:将选定的进程绑定至某指定的CPU核心;

(3) 显示叙述

blob.png

左上方数据:表示每颗CPU、内存、交换内存的使用率

右上方数据:

    Tasks当前的任务数量,用户空间进程

    thr:线程数量

    running:运行的数量

    Load average :过去一分钟、五分钟、十五分钟的平均负载

8.vmstat命令    # 显示虚拟内存统计信息

 vmstat

blob.png

procs:

    r:等待运行的进程的个数;CPU上等待运行的任务的队列长度;

    b:处于不可中断睡眠态的进程个数;被阻塞的任务队列的长度;

memory:

    swpd:交换内存使用总量;

    free:空闲的物理内存总量;

    buffer:缓冲,与写相关,加速写操作;

    cache:缓存,与读相关,加速读操作。

swap

    si:数据进入swap中的数据速率(kb/s)

    so:数据离开swap的速率(kb/s)

io

    bi:从块设备读入数据到系统的速度(kb/s)

    bo:保存数据至块设备的速率(kb/s)

system

    in:interrupts,中断速率;

    cs:contextswitch, 上下文 切换的速率;

cpu

    us:user space

    sy:system

    id:idle

    wa:wait

    st:stolen

9.dstat命令    #系统资源统计工具

    SYNOPSIS

        dstat [-afv][options..] [delay [count]]

 常用选项:

        -c,–cpu:显示cpu相关信息;

        -C #,#,…,total  显示第几颗CPU,total总共的

        -d,–disk:显示磁盘的相关信息

        -D sda,sdb,…,tobal  指明具体的磁盘信息

        -g:显示page相关的速率数据;

        -m:Memory的相关统计数据

        -n:Interface的相关统计数据;

        -p:显示process的相关统计数据;

        -r:显示io请求的相关的统计数据;

        -s:显示swapped的相关统计数据;

        –tcp、–udp、–raw 、–socket 网络连接相关

        –ipc 进程相关

        –top-cpu:显示最占用CPU的进程;

        –top-io:最占用io的进程;

        –top-mem:最占用内存的进程;

        –top-lantency:延迟最大的进程;

 dstat

blob.png

10.kill命令:      

kill  [-s signal|-SIGNAL]  pid…     向进程发信号

kill -l [signal]:显示当前系统可用信号:

 blob.png    

常用信号:

1) SIGHUP: 无须关闭进程而让其重读配置文件;

2) SIGINT: 中止正在运行的进程;相当于Ctrl+c;

9) SIGKILL: 杀死正在运行的进程;

15) SIGTERM:终止正在运行的进程;

18) SIGCONT:继续

19) SIGSTOP:停止,将进程送后台,停止状态

指定信号的方法:

(1) 信号的数字标识;1, 2, 9

(2) 信号完整名称;SIGHUP

(3) 信号的简写名称;HUP

11.killall

 killall [-SIGNAL]  program  对所有与program相关的进程发信号

四 系统作业控制命令

1.系统作业job

      (1)job种类:

                前台作业(foregroud):通过终端启动,且启动后会一直占据终端;

                后台作业(backgroud):可以通过终端启动,但启动后即转入后台运行(释放终端);

      (2)让作业运行于后台

                1) 运行中的作业:Ctrl+z

                   送往后台后,作业会转为停止态;相当于发送kill -19 信号

                2) 尚未启动的作业:  # COMMAND &

                   此类作业虽然被送往后台,但其依然与终端相关;如果希望把送往后台的作业剥离与终端的关系:

                   # nohup COMMAND &

      (3)查看所有的作业:#jobs命令

         +/- 表示优先级;当调用时不加作业号会默认调用+的命令

       (4)可实现作业控制的常用命令:

          #fg  [[%]JOB_NUM]:把指定的作业调回前台;

          #bg  [[%]JOB_NUM]:让送往后台的作业在后台继续运行;

          #kill  %JOB_NUM:终止指定的作业;

blob.png

2.调整进程优先级: 

可通过nice值调整的优先级范围:100-139;分别对应于:-20, 19。进程启动时,其nice值默认为0,其优先级是120;

    注意:仅管理员可调低nice值;

(1)nice命令:

    以指定的nice值启动并运行命令:# nice  [OPTION] [COMMAND [ARGU]…]

     选项:-nNICE

            nice -n -5 echo "hello world"

(2)renice命令:

    #renice  [-n]  NICE PID…

    renice -10 1589

(3)查看Nice值和优先级:ps  axo pid, ni, priority, comm 

    ps axo pid,ni,command | grep "bash"

原创文章,作者:liangkai,如若转载,请注明出处:http://www.178linux.com/11493