Linux进程及作业管理

process

运行中的程序的一个副本,是被载入内存的一个指令集合
进程ID(Process ID,PID)号码被用来标记各个进程
UID、GID、和SELinux语境决定对文件系统的存取和访问权限,
通常从执行进程的用户来继承
存在生命周期

task struct:Linux内核存储进程信息的数据结构格式
task list:多个任务的的task struct组成的链表

进程和线程的区别

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
2) 线程的划分尺度小于进程,使得多线程程序的并发性高。
3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

进程创建

init:第一个进程
    父子关系
    进程都由其父进程创建
        fork(), clone()

进程优先级

系统优先级:数字越小,优先级越高
    0-139:
        1-99:实时优先级
        100-139:静态优先级
            数字越小,优先级越高
    nice值:-20到19,对应系统优先级100-139或99
Big O:时间复杂度,用时和规模的关系
    O(1), O(logn), O(n), O(n^2), O(2^n)

进程内存

Page Frame:页框,用存储页面数据,存储Page 4k
LRU:Least Recently Used 近期最少使用算法,释放内存物理地址空间和线性地址空间
MMU:Memory Management Unit负责转换线性和物理地址

进程之间的通信

我们知道在计算机网络体系当中,主机与主机之间通信,实质上是主机进程与主机进程之间的通信,也就是进程间的通信(IPC.Inter Process Communication).
    当两个进程在同一台主机上时:进程间通信科依靠signal(信号指令)、shm(shared memory共享内存空间)、semerphor(旗语,类似飞机起飞时的旗帜语言)来完成。
    当两个进程不在同一台主机上时:进程间通信可以依靠rpm(remote procedure call远程过程调用)、socket(套接字)

进程类型

根据进程与系统终端的关系可将进程分为:守护进程和前台进程
    守护进程:在系统引导过程中启动的进程,即跟终端无关的进程
    前台进程:跟终端相关,通过终端启动的进程,需要注意的是,也可以把前台启动的进程送往后台,以守护模式运行
根据进程占用资源的大小可以将进程分为:CPU密集型和IO密集型
    CPU密集型是对cpu占用率高的进程
    IO密集型是等待I/O时间长的进程

进程状态

1.Running(运行态):正在运行当中的进程
2.ready:就绪态
3.睡眠态:sleeping
    可中断睡眠:interruptable
    不可终端睡眠:uninterruptable
4.停止态(Stopped):暂停于内存中,但不会被调度,除非手动启动
5.僵死态(Zombie):孤魂野鬼,找不到归宿,父进程不来收尸或父进程已经挂了

管理进程常用命令

pstree命令

H}K9)Q$YKQHFE%@5Q4@@FXI.png

pstree - display a tree of process

ps命令

V{UD79O`(WQVB~%5@U3{$7R.png

report a snapshot of the current processes.
    三种选项风格:
        UNIX:必须带-
        BSD:必须无-
        GNU:长选项
    启动进程的方式:
        系统启动过程中自动启动:与终端无关的进程
        用户通过终端启动:与终端相关的进程
    选项:
        a:所有与终端相关的进程
        x:所有与终端无关的进程
        u:以用户为中心组织进程状态信息显示

        常用组合之一:aux
        每个字段的含义:
            USE:进程的发起者
            PID:进程ID
            %CPU:进程所占用的CPU百分比
            %MEM:进程所占用的内存百分比
            VSZ:进程所占用的虚拟内存空间大小
            RSS:进程所占用的实际内存空间大小
            TTY:此进程运行在哪个终端,pts/n表示远程终端,tty表示本地终端,?表示系统进程
            STAT:进程的状态
                R:Running态
                S:Interruptable,可中断睡眠
                D:Uninterruptable,不可终端睡眠
                T:Stopped,停止态
                Z:Zombie,僵死态
                s:Session leader,会话领导者
                +:前台进程
                l:多线程进程
                <:高优先级进程
                N:低优先级进程
            START:进程的启动时间
            TIME:进程实际占用的CPU时间
            COMMAND:触发此进程的命令程序

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

        常用组合之二:-ef
        每个字段的含义:
            UID:进程的发起者
            PID:进程ID
            PPID:父进程的PID
            C:占用CPU的百分比
            STIME:进程的启动时间,从什么时候开始启动的
            TTY:进程在哪个终端运行
            TIME:进程实际花费的CPU时间
            CMD:触发此进程的命令

        -F:显示完整格式的进程信息
            C:cpu utilization
            PSR:运行于哪颗CPU
        -H:以层级结构显示进程的相关信息

        常用组合之三:-eFH

        常用组合之四:exo
            自定义要显示的字段
                常用的有pid,ni,ppid,command,pri,psr,pcpu,stat,tty,rtprio,euser,ruser...
                    ni:nice值
                    pri:priority,优先级
                    rtprio:real time priority,实时优先级

pgrep命令

Q}1@[LD][SP[X0KD)(9ZROT.png

look up or signal processes based on name and other attributes
pgrep [OPTIONS] pattern
    -U USER:只显示以指定用户身份运行的进程
    -t TERMINAL:与指定的终端相关的进程
    -l:显示进程名
    -a:显示完整格式的进程名
    -P pid:显示此进程的子进程

pkill命令

2TKUIC~6GR005(2KTF]92@S.png

可以按照进程名称杀死进程
    -o:仅向找到的最小(起始)进程号发送信号; 
    -n:仅向找到的最大(结束)进程号发送信号; 
    -P:指定父进程号发送信号; -g:指定进程组; 
    -t:指定开启进程的终端。

pidof命令

)]4VVU]@%YU}Q[~NX`YX7%M.png

根据指定的命令所启动的进程ID
    pidof PROGRAM

top命令

`F$@}XS34`}%$F2VN(UPU)S.png

display Linux processes
常用选项:
    -d #:指明延迟时长,单位为秒
    -b:批次显示
    -n #:显示的批次数量
每一行代表的含义为:
第一行:
    1.当前的系统时间
    2.系统启动到现在所经过的时间
    3.当前已经登录到系统的用户
    4.系统在1,5,15分钟的平均负载,值越小表示系统越空闲
第二行:
    显示的目前进程的总量与个别程序在什么状态(running,sleeping,stopped,zombie)比较需要注意的是最后的zombie的那个数值,如果不是0就需要查看下是哪个进程处于僵尸状态
第三行:
    显示的是CPU的整体负载,如果是多核心的cpu,可以按下数字1来切换不同CPU的负载率
        us:user space用户空间所占用的CPU百分比
        sy:kernel,内核空间所占用的CPU百分比
        ni:改变过优先级的进程所占用的CPU百分比
        id:空闲CPU百分比
        wa:wait io,等待I/O所花费的时间
        hi:硬件中断所消耗的百分比
        si:软件终端所消耗的百分比
        st:被虚拟机偷走的百分比
第四行:表示物理内存空间的使用情况
第五行:表示交换分区的使用情况

子命令:
    P:以占据CPU百分比排序显示
    M:以占据内存百分比排序显示
    T:累计占用CPU时间排序显示
    l:是否显示负载均衡行
    t:是否显示进程摘要信息及CPU负载状态
    1:数字1,平均或单独显示CPU的负载状态
    m:是否显示内存相关的状态信息
    q:退出命令
    k:终止指定进程
    s:修改延迟时长

top下面的部分:
    PID:每个进程ID
    USER:进程所属的使用者
    PR:priority简写,进程的优先级,越小优先级越高
    NI:nice的简写,与Priority有关,也是越小越早被运行
    VIRT:进程需要的虚拟内存大小,而非使用的虚拟内存大小
    RES:进程当前使用的内存大小,不把包括swap
    SHR:进程与其他进程共享的内存大小
    S:进程的状态
    %CPU:进程所占用的CPU百分比
    %MEM:进程所占用的内存百分比
    TIME+:CPU使用时间的累加
    COMMAND:触发此进程的命令

uptime命令

0LHKQI%04R7`6MJ16MC$5~D.png

显示系统时间、运行时长及平均负载
过去1分钟、5分钟和15分钟的平均负载
等待运行的进程队列的长度

htop命令

{MV%]BE4P1RN_0@$}L6G1)I.png

top升级版,默认情况下没有安装,需要配置EPEL源来进行安装
支持的选项:
    -d #:延迟时长
    -u USERNAME:仅显示指定用户的进程
    -s COLUMN:根据指定的字段进程排序
子命令:
    l:显示光标所在进程所打开的文件列表
    s:显示贯标所在进程执行的系统调用
    a:绑定进程到指定的CPU
    #:快速定位光标至PID为#的进程上

vmstat命令

LORR81FNTHRB)_EX]{H0JJF.png

Report virtual memory statistics
vmstat [options] [delay [count]]
    procs:进程相关
        r:等待运行的进程个数;队列长度
        b:处理不可中断睡眠状态的进程的个数
    memory:内存相关
        swpd:交换内存使用量
        free:物理内存空间使用量
        buffer:用于buffer的内存总量
        cache:用于cache的内存总量
    swap:交换分区相关
        si:数据进入swap的速率(kb/s)
        so:数据离开swap的速率(kb/s)
    io:I/O相关
        bi:从设备读入数据到系统的速率(kb/s)
        bo:保存数据至块设备的速率(kb/s)
    system:
        in:中断速率,每秒被中断的次数
        cs:进程切换的速率
    cpu:
        us:user space用户运行程序占用CPU的百分比
        sy:system用于运行内核占用CPU的百分比
        id:idle空闲CPU百分比
        wa:wait I/O花费时间
        st:被虚拟机偷走的百分比
常用选项:
    -s:显示内存的统计数据

pmap

`)[TH(LMW(F{KQ{6S5V0S6F.png

进程对应的内存映射
    pmap [OPTIONS] pid [...]
        -x:显示详细格式
        示例:pmap 1
    另一种实现方式:
        cat /proc/PID/maps

系统监控工具

glances

@SGI5{A[LX@ES{WE@QDBKPD.png

A cross-platform curses-based monitoring tool 需要EPEL源
常用选项:
    -b:以Byte为单位显示网络数据速率
    -d:关闭磁盘I/O模块
    -m:关闭mount模块
    -n:关闭network模块
    -t #:刷新时间间隔
    -1:每个cpu的相关数据单独显示
    -o {HTML|CSV}:输出格式
    -f /PATH/TO/SOMEDIR:设定输出文件的位置

C/S模式下运行glances命令:
    服务模式:
        glances -s -B IPADDR

        IPADDR:本机的某地址,用于监听

    客户端模式:
        glances -c IPADDR

        IPADDR:是远程服务器的地址

dstat命令

YPP1J$$5S@FMQ@N9(CNM]%2.png

versatile tool for generating system resource statistics
dstat [-afv] [options..] [delay [count]]
常用选项:
    -c, --cpu:显示cpu相关信息
        -C#,#,...,total
    -d, --disk:显示磁盘的相关信息
        -D sda,sdb,...,total
    -g:显示page相关的速率数据
    -m:Memory的相关统计数据
    -n:Interface的相关统计数据
    -p:显示process的相关统计数据
    -r:显示io请求的相关的统计数据
    -s:显示swapped的相关统计数据

    --tcp:显示tcp套接字的相关数据
    --udp:显示udp套接字的相关数据
    --raw:显示raw套接字的相关数据
    --socket:
    --ipc:显示进程间通信相关的速率数据

    --top-cpu:显示最占用CPU的进程
    --top-io:最占用io的进程
    --top-mem:最占用内存的进程
    --top-lantency:延迟最大的进程

管理进程

kill命令

terminate a process
用于向进程发送信号,以实现对进程的管理

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

    每个信号的表示方法有三种:
        1)信号的数字标识
        2)信号完整名称
        3)信号的简写名称

向进程发信号:
    kill [-s signal|-p] [-q sigval] [-a] [--] pid...
    常用信号:
        1)SIGHUP:无需关闭进程让其重读配置文件
        2)SIGINT:终止正在运行的进程,相当于Ctrl+c
        9)SIGKILL:强行杀死所指定的进程
        15)SIGTERM:终止一个进程,默认kill命令不跟选项则使用此选项
        18)SIGOUT:继续运行进程
        19)SIGSTOP:暂停进程,把进程放置于后台,相当于Ctrl+z

killall

终止一个进程
killall [-SIGNAL] program

作业管理

jobs命令

{S`$I7S)RAYDDAX$UUFX{3L.png

查看当前系统作业
    -l:显示进程ID
前台作业(foregroud):通过终端启动,且启动后会一直占据终端
后台作业(backgroud):可以通过终端启动,但启动后即转入后台运行(释放终端)

如何让作业运行于后台?
    (1)运行中的作业
        Ctrl+z
        注意:送往后台后,作业会转为停止态
    (2)尚未启动的作业
        # COMMAND &
        注意:此类作业虽然被送往后台,但其依然与终端相关;如果终端终止,与终端相关的进程将被终止;
            如果希望把送往后台的作业剥离与终端的关系
                # nohup COMMAND &

可实现作业控制的常用命令:
    fg [[%]JOB_NUM]:把后台作业调回前台
    bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行
    kill %JOB_NUM:终止指定的作业

调整进程优先级

可通过nice值调整的优先级范围:100-139
    分别对应于:-20, 19

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

nice命令:
    以指定的nice值启动并运行命令
        nice [OPTION] [COMMAND [ARGU]...]
            选项:
                -n NICE

        注意:只有管理员才可调低nice值

renice命令:
    renice [-n] NICE PID...

查看Nice值和优先级:
    ps axo pid,ni,priority,command | grep COMMAND

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