进程管理

1. 进程相关概念
    a. 应用程序被用户提请给内核,并得以执行便变成了进程,进程只是被调入内存的应用程序的一个副本。
    b. 进程都具有统一的数据结构称为task struct用于存储进程的元数据信息,如进程的名称、PID、优先级等,也就是ps 命令看到的那些进程属性字段,应用程序被提请给内核变为进程后,该应用程序对应进程的父进程就会复制一份自己的task struct,给
2. 进程内存管理
    a. CPU中指令分为普通指令和特权指令,用户空间的应用进程就都可以执行普通指令,特权指令只能被内核执行
    b. 用户空间
    c. 内核空间
3. 进程优先级
    Ø 对于进程数量来说CPU计算资源是有限的,如果没有一套有效的资源分配机制进程就会出现争抢资源的现象,为了确保进程高效稳定有序的运行,操作系统设计了140个队列并将进程分别放入这140个队列之间,通通调度策略为队列中的进程分配CPU资源,使得所有进程能够按系统规定的制度有序运行。这里的资源分配机制有两个重要的术语:队列和调度策略
    Ø 进程优先级 :Linux操作系统为提供了140个队列来调度进程使用CPU资源,队列就是我们常说的进程优先级,进程优先级的取值范围是0-139,值越小优先级越高,优先级按取值范围还分为实时优先级和非实时优先级
    Ø 进程优先级调整 :
        ü 严格来讲优先级对用户来说是不可以修改的,用户只能通过nice值来干预静态优先级
        ü 实时优先级:能过内核动太调整也称为动态优先级,取值范围0-99,用户不可以过通nice值调整,但可以通过其它命令调整。
        ü 非实时优先级:用户可以过程nice值来干预非实时优先级也称为静态优先级,取值范围100-139。
        ü nice值:nice值的取值范围是:-20到19,分别对应非实时优先级的100-139,因此nice越小优先级越高。仅管理员可以调低nice值,普通用户不能调低nice值。
            □ 调整原理:一个进程启动默认nice值为0,对应优先级为120,调整后的优先级=当前优先级+nice值,因此用户以指定nice值启动进程就可以达到调整优先级的效果。
            □ nice进程具备继承性,子进程继承父进程 

        ü 调整优先级:
            ü nice以指定nice值启动进程:nice -n -5 ping 192.168.39.2
            ü renice修改已运行进程的优先级:renice -n -5 `pidof ping`
    Ø 调度策略:操作系统如何为队列内的进程分配CPU资源,操作系统提供了5种调度策略来管理队列内的进程,通过命令chrt可以查看和修改每个进程进的调度策略
        ü 实时进程调度策略:SCHED_FIFO(先进先出调度算法)、SCHED_RR(默认策略,以时间片轮询调度,一个时间片为100ms)
        ü 非实时进程调度策略:SCHED_OTHER, SCHED_IDLE,SCHED_BATCH
4. 命令选项风格:
    Ø Unix/Posix风格
        ü 命令后的选项,可以分组,便必须以连字符开头,如ps -aux。
        ü 选项无需加参数的,可以组合在一起,如:sed -n -r 可以写成 sed -nr
    Ø BSD风格,即命令后的选项,不可以与连字符同用,多个选项可以分组输写
    Ø GNU风格
        ü 即长选项,命令后的参数,可以分组,但必须以双横线开头,如:ps --help。
        ü 命令行选项以两个连字符'--'开头,后跟选项名称,选项后面使用空格或者等号 紧接着取值
5. 查看进程树
    a. pstree -p显示进程名后附加PID
    b. pstree -u显示进程名后附加用户名
    c. {}代表线程
6. 基于程序名查询进程编号
    a. pidof 进程名
7. 进程查询工具ps命令
    Ø BSD风格选项
        ü ps 不加任何选项则仅显示当前登录会话shell环境下的进程列表
        ü ps a 选项包括所有终端中的进程
        ü ps x 选项包括不链接终端的进程(显⽰当前⽤户所运⾏的所有进程,包括前台和后台守护进程)
        ü ps u 选项显示进程所有者的信息 
        ü f 选项显示进程树,相当于 --forest  
        ü k|--sort  属性 对属性排序,属性前加- 表示倒序 
        ü o 基于进程struck数据结构中的属性字段 定制显示的字段信息 
        ü L 显示支持的进程属性字段列表 (该选项下列出的进程属性字段可以供o选项字制显示输出)
        ü 实例:利用o选项字制显示字段,并结合k选项基于指定字段排序,如基于%mem字段排序
        ü ps o pid,%cpu,%mem,size k %mem
        ü 
    Ø UNIX风格
        ü -C cmdlist 指定命令,多个命令用,分隔
        ü -L 显示线程
        ü -e 显示所有进程,相当于-A
        ü -f 显示完整格式程序信息
        ü -F 显示更完整格式的进程信息
        ü -H 以进程层级格式显示进程相关信息
        ü -u userlist  指定有效的用户ID或名称
        ü -U userlist 指定真正的用户ID或名称
        ü -g gid或groupname  指定有效的gid或组名称
        ü -G gid或groupname  指定真正的gid或组名称
        ü -p pid 显示指pid的进程
        ü --ppid pid  显示属于pid的子进程
        ü -t  ttylist  指定tty,相当于 t
        ü -M  显示SELinux信息,相当于Z 
    Ø PS命令输出字段
        ü USER :进程执行用户
        ü PID:进程ID
        ü %CPU:CPU利用率
        ü %MEM:内存利用率
        ü VSZ:内核承诺分配给进程的虚似存内存(KB)
        ü RSS:进程占用的真正物理内存(KB)
        ü TTY:终端号 ?号与终端无关的
        ü STAT:进程状态
        ü START:进程启动到PS命令查询时所使用的时间
        ü TIME:进程实际占用CPU运行的时间(获取的时间分)
        ü COMMAND:进程执行的命令行
        ü EUESR:进程生效用户effect user(例:passwd被设置了SUID权限,则在进程发起者执行的进程实际生效用户上下文件为passwd文件所属组的)
        ü RUSER:进程的发起者real user
    Ø STAT进程状态
        ü R 处理运行状态,正在被CPU执行或在可执行队列中的进程处于该状态
        ü S 处于睡眠状态(Sleep可中断睡眠)等待事件或信号触发唤醒,S状态进程task_struct结构被放入对应事件的等待队列中,一旦事件触发则会被唤醒
        ü D 处于深度睡眠状态(Deep sleep不可中断睡眠)
        ü T 暂停状态或跟踪状态,
        ü Z 僵死状态,
        ü X 死亡状态,
        ü Z: zombie
        ü +: 前台进程
        ü l: 多线程进程
        ü L:内存分页并带锁
        ü N:低优先级进程
        ü <: 高优先级进程
        ü s: session leader,会话(子进程)发起者
8. 进程的信号干预:
    Ø kill可以向进程发送信息,干预进程的运行状态
    Ø 常用信号,kill -l可以查看系统支持的所有信号,Linux*有64种信号,信号功能介绍:man 7 signal查看帮助,kill -l {1..64} 查看对应信号名称
        ü 1号SIGHUP:无须关闭进程而让进程重新读取配置文件Systemctl reload选项就是服务进程发送HUP信号使进程重新加载配置文件
        ü 2号SIGINT:interrupt中止,打断正在运行的进程,相当于Ctrl+c
        ü 3号SIGQUIT 相当于ctrl+\ ,不是真正结进程,发送 SIGQUIT 信号给前台进程组中的所有进程,终止前台进程并生成 core 文件
        ü 9号SIGKILL:强制杀死运行中的进程,不管理进程是否完成读写操作,会丢失进程数据,打开的文件可能会被损坏。一般应对僵死态或死亡态的进程
        ü 15号SIGTERM:终止正在运行的进程,会给进程转储缓存数据的机会。如果kill不加任何信号则默认会发送第15号信号。
        ü 18号SIGCONT:唤醒后台休眠的进程继续运行,此时在后台运行,在进程所有的终端会话下使用fg命令可以恢复到前台运行。bg命令就是向进程发送18号信号
        ü 19SIGSTOP:将正在运行的进程转入后台休眠,相当于Ctrl+z ,Stopped暂停
    Ø 进程前后台切换
        ü Ctrl+z将前台运行的进程转入后台休眠(可以看到会提示[#]+  Stopped,#表示任务号,可以通过fg、bg发前18号信号唤醒任务),在进程所有的终端会话下使用fg命令可以恢复到前台运行。相当于向后进程发送第19号信号SIGSTOP
        ü fg将后台任务转到前台:jobs查看后台休眠及运行任务,使用fg加上任务编号即可前后台任务放到前台运行,相当于向后台进程发送第18号信号SIGCONT
        ü bg将前台任务转到后台:bg即可以将前台任务转到后台运行,也可以唤醒后台休眠的任务,相当于向进程发前第18号信号SIGCONT
        ü Ctrl+c 中止前台运行的任务
        ü Ctrl+d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF
        ü Ctrl+\ 发送 SIGQUIT 信号给前台进程查并不执行并生成 core 文件,如ping命令想看
    Ø 信号的表示方式:
        ü 信号的数字标识;例:1,2,3,
        ü 信号的完整名称,以SIG后加信号名称简写,例:SIGHUP,SIGINT,QUIT
        ü 信号的简写名称;例:HUP,INT,QUIT
    Ø 基于进程名杀死所有进程
        ü killall 进程名:例:killall httpd
    Ø 基于模式搜索进程
        ü pgrep:
            ü 语法:pgrep [options] pattern 
            ü 选项:
            -u uid: effective user,生效者
            -U uid: real user,真正发起运行命令者
            -t terminal: 与指定终端相关的进程
            -l: 显示进程名
            -a: 显示完整格式的进程名
            -P pid: 显示指定进程的子进程
            ü 实例:           ü pkill 

    Ø 向进程发送信号
        ü 语法:kill -s [信号] pid 注:-s可以省略,而直接用-加上信号再指定PID即可。
        ü 例:四种不同的发送信号的方法
            Ø kill -9 `pidof ping`
            Ø kill -HUP `pidof ping`
            Ø kill -SIGHUP `pidof ping`
            Ø kill -s 9 `pidof ping`
上一篇:Linux 进程的控制与进程之间的关系


下一篇:linux – 我应该为用户进程设置较低的值以使其更快吗?