linux进程管理

一:linux进程概念

一个程序的执行:一个program需要执行时会将它的一个副本装载进内存;此时会生成一个process,内核通过优先级队列来挑选一个最优先的进程分配时间片去CPU上执行。

内核负责:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等

program:程序,在磁盘上的一段代码

process:进程,运行中的程序的一个副本

system call:系统调用

模式切换:用户模式(CPU执行用户进程代码)  <---> 内核模式(CPU执行内核代码)

时间片:一个CPU同一时间只可以做一件事,但是我们需要计算机可以为我们处理多种事情,所有就把CPU的计算力按时间来切片;比如给每个进程5ms的执行时间,由于中间切换时间太短,我们感觉不到中间的切换,让我们感觉是同时来处理多个任务。

保存现场:进程在CPU上运行在时间片用完时或被中断时但是它的任务还没有完成,这时就需要把自己的任务进度保存下来。

恢复现场:没有执行完的进程又一次轮到它执行时,它需要恢复到上次没有处理完的地方继续进行。

生命周期:进程由它的父进程创建生成,完成它的使命后由它的父进程销毁,此为生命周期。

task struct:linux内核存储进程信息的数据结构格式。

任务链表:task list,多个任务的task struct组成的链表。

软中断:软中断是由进程产生的。

硬中断:硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。

进程创建:每一个进程都是由夫进程创建,fork(),clone()

CoW:写时复制,子进程在没有发生数据改变时是和它的父进程共用一个内存空间,在需要改变数据时才会复制一份数据到另一段内存空间。

init(systemd):初始化进程,是所有进程的父进程。在内核启动后生成

进程优先级:在计算机的世界中是绝对的不公平的,进程有优先级之分;linux中将优先级分为0-139等级

  • 1-99:实时优先级,数字越大优先级越高
  • 100-139:静态优先级,数子越大,优先级越高

Nice值:-20  --  19,对应于100-139,对于普通用户只可以调低自己的优先级

过期队列:除了139个优先级队列外还有与之相对应的139个过期队列

内核挑选进程执行的方式:从0-139个队列中挑一个优先级高的执行,如果时间片走完还进程还没有执行完就把该进程放到相应的优先级的过期队列中;该优先级队列中的进程全部执行一次之后再把该优先级过期队列中的进程放回优先级队列,再从次优先级队列中挑选进程执行,直到该队列中的进程全部执行完成后再执行下一级优先级队列中的进程,依次类推。

Big(O):衡量算法的复杂度;随着任务复杂度的上升,所消耗时间的走向

LRU算法

每一个数据在放入内存中的时候都在在第一个,旧的数据往下排,如果旧数据被调用后重新放到第一个,如果没有被用到的数据将被淘汰。

Page Frame:页框,把物理内存分成N个页框,用于存储页面数据

线性地址空间:进程启动时内核会分配一个虚拟内存空间,但实际上没有那么大的内存,进程用的时候内核实时将页框分配给进程使用。

物理地址空间:真正的内存空间

MMU:内存管理单元,管理线性地址空间和物理地址空间的转换映射的分配关系

常驻内存集:不可被交换到swap

虚拟内存集:可以被交换到swap

IPC:Inter Process Communication 进程间通信

  • 同一主机:
    • signal:信号
    • shm:shared memory共享内存
    • semerphor:旗语
  • 跨主机
    • rpc:remote procecure call 远程过程调用
    • socket:套接字,linux一切皆文件,进程间通信时会将数据发往此文件,与之对应的服务端也有一份套接字文件,中间通过tcp等协议传输,对方进程就可以从此文件中读取对方发送过来的数据信息,做出相应处理后在将数据发往此文件,再通过tcp传输协议将数据送回客户端,完成一次远程调用。

进程类型

  守护进程:daemon:在系统引导过程中启动的进程

  用户进程(前台进程或批处理进程):通过终端启动的进程,也可把前台启动的进程送往后台,以守护模式运行

进程状态

  运行态:running

  就绪态或睡眠态:ready

    可中断睡眠:interruptable

    不可中断睡眠:uninterruptable

  停止态:stopped

  僵尸态:zombie

 

进程的分类

  • CPU-Bound:CPU密集型
  • IO-Bound:IO密集型

二:linux中进程管理工具详解

ps:查看进程状态

ps的选项风格有三种,BSD风格:不加“-”直接写选项;Unix风格:短选项;GUN风格:长选项。

BSD风格:

  • a:所有终端的进程
  • x:和终端无关的进程
  • u:显示进程所有者的信息
  • f:显示进程之间的层次关系
  • k:指定排序的项,在项前加"-"表示反向排序,如:-ni
  • o:指定查看项,多个项目用","分割
    • user:运行该进程的用户
    • pid:进程号
    • %cpu:占用cpu比例
    • %mem:占用内存比例
    • vsz:虚拟内存集
    • rss:常驻内存集
    • tty:终端
    • stat:进程运行状态
    • start:进程启动时间
    • time:占用cpu时间片的总时长
    • cmd:显示进程名
    • pri:优先级
    • ni:nice值
    • rtprio:实时优先级
    • psr:运行cpu编号
    • comm=:显示启动该进程的命令
    • etime:进程已经启动了多长时间
  • L:显示o支持的属性

unix风格:

  • -e:显示所有进程
  • -f:显示完整格式列表
  • -H:以缩进方式显示进程间关系
  • -u username:有效用户
  • -U username:真正的用户
  • -g groupname:有效组
  • -G groupname:真正的组
  • -p PID:显示指定PID的进程
  • --ppid PID:显示指定PID的进程的子进程
  • --sort:排序
  • -M:显示selinux的相关属性
  • -t 终端:显示指定终端运行的进程
  • -C 程序名:查看程序运行的状态
[root@rhel6 ~]# ps aux |head -5
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
用户  进程号  CPU占用  内存占用  虚拟内存集  常驻内存集  终端  进程运行状态  进程启动时间  占用CPU时间片总时长  进程名 root 1 0.0 0.1 19356 1552 ? Ss 16:25 0:00 /sbin/init root 2 0.0 0.0 0 0 ? S 16:25 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 16:25 0:00 [migration/0] root 4 0.0 0.0 0 0 ? S 16:25 0:00 [ksoftirqd/0]

ps常用示例:

1、查询当前系统中运行的所有进程

[root@rhel6 ~]# ps aux

2、 查看指定用户(RUID)的进程

[root@rhel6 ~]# ps -fU apache       
UID         PID   PPID  C STIME TTY          TIME CMD
apache    11891  11889  0 01:30 ?        00:00:00 /usr/sbin/httpd
apache    11892  11889  0 01:30 ?        00:00:00 /usr/sbin/httpd
apache    11893  11889  0 01:30 ?        00:00:00 /usr/sbin/httpd
apache    11894  11889  0 01:30 ?        00:00:00 /usr/sbin/httpd
apache    11895  11889  0 01:30 ?        00:00:00 /usr/sbin/httpd
apache    11896  11889  0 01:30 ?        00:00:00 /usr/sbin/httpd
apache    11897  11889  0 01:30 ?        00:00:00 /usr/sbin/httpd
apache    11898  11889  0 01:30 ?        00:00:00 /usr/sbin/httpd

3、通过pid查询进程

[root@rhel6 ~]# ps -fp 11891
UID         PID   PPID  C STIME TTY          TIME CMD
apache    11891  11889  0 01:30 ?        00:00:00 /usr/sbin/httpd

4、通过父进程的pid来查询它的所有子进程

[root@rhel6 ~]# ps -f --ppid 11889
UID         PID   PPID  C STIME TTY          TIME CMD
apache    11891  11889  0 01:30 ?        00:00:00 /usr/sbin/httpd
apache    11892  11889  0 01:30 ?        00:00:00 /usr/sbin/httpd
apache    11893  11889  0 01:30 ?        00:00:00 /usr/sbin/httpd
apache    11894  11889  0 01:30 ?        00:00:00 /usr/sbin/httpd
apache    11895  11889  0 01:30 ?        00:00:00 /usr/sbin/httpd
apache    11896  11889  0 01:30 ?        00:00:00 /usr/sbin/httpd
apache    11897  11889  0 01:30 ?        00:00:00 /usr/sbin/httpd
apache    11898  11889  0 01:30 ?        00:00:00 /usr/sbin/httpd

5、查看tty终端所属的进程

[root@rhel6 ~]# ps -ft pts/1
UID         PID   PPID  C STIME TTY          TIME CMD
root      11277  11275  0 May04 pts/1    00:00:00 -bash
root      11931  11277  0 01:40 pts/1    00:00:00 ps -ft pts/1

6、以树状方式显示指定进程

[root@rhel6 ~]# ps -f --forest -C httpd
UID         PID   PPID  C STIME TTY          TIME CMD
root      11889      1  0 01:30 ?        00:00:00 /usr/sbin/httpd
apache    11891  11889  0 01:30 ?        00:00:00  \_ /usr/sbin/httpd
apache    11892  11889  0 01:30 ?        00:00:00  \_ /usr/sbin/httpd
apache    11893  11889  0 01:30 ?        00:00:00  \_ /usr/sbin/httpd
apache    11894  11889  0 01:30 ?        00:00:00  \_ /usr/sbin/httpd
apache    11895  11889  0 01:30 ?        00:00:00  \_ /usr/sbin/httpd
apache    11896  11889  0 01:30 ?        00:00:00  \_ /usr/sbin/httpd
apache    11897  11889  0 01:30 ?        00:00:00  \_ /usr/sbin/httpd
apache    11898  11889  0 01:30 ?        00:00:00  \_ /usr/sbin/httpd

7、查找指定进程名所有的所属PID

[root@rhel6 ~]# ps -C sshd -o pid=      
  1534
 11275

8、检查一个进程执行了多长时间

[root@rhel6 ~]# ps -eo comm,etime,user |grep httpd
httpd                 30:50 root
httpd                 30:50 apache
httpd                 30:50 apache
httpd                 30:50 apache
httpd                 30:50 apache
httpd                 30:50 apache
httpd                 30:50 apache
httpd                 30:50 apache
httpd                 30:50 apache

9、查询占用物理地址最多的进程

[root@rhel6 ~]# ps xo user,pid,rss,comm= k -rss |head
USER        PID   RSS 
root      11275  4588 sshd
root      11277  3984 bash
root      11889  3748 httpd
root       1615  3448 master
root       1365  3360 cupsd
root       1644  2540 abrtd
root       1481  1960 automount
root       1237  1724 rsyslogd
root          1  1552 init

10、使用watch命令实时检测CPU使用率

[root@rhel6 ~]# watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head'

pstree:显示进程树

pidof:查询指定进程的PID

pgrep:搜索指定的进程

  • -u uid: effective user,生效者
  • -U uid: real user,真正发起运行命令者
  • -t terminal: 与指定终端相关的进程
  • -l: 显示进程名
  • -a: 显示完整格式的进程名
  • -P pid: 显示指定进程的子进程

uptime:查看系统的基本负载状态

top:实时监控系统状态工具

交互按键:

  • M:按内存使用排序
  • P:按CPU使用排序
  • l:显示、隐藏top第一行
  • t:改变/隐藏CPU的显示方式
  • m:改变/隐藏内存的显示方式
  • 1:单CPU和总CPU
  • s:改变刷新间隔,默认3s
  • k:杀死进程
  • PID -- signal(15 关闭进程)
  • q:退出
  • W:将状态保存到~/.roprc

选项:

  • -d #:指定时间间隔,秒
  • -b:显示所有进程的状态
  • -n #:刷新#次自动退出
[root@rhel6 ~]# top -n1 -b
top - 03:06:25 up 10:41,  1 user,  load average: 0.00, 0.01, 0.05
top - 系统时间 up 启动了多长时间 用户 负载:(1,5,10)分钟的平均负载 Tasks: 132 total, 1 running, 131 sleeping, 0 stopped, 0 zombie
总进程数 正在运行进程数 睡眠进程数 停止态进程数 僵尸进程数 Cpu(s): 0.2%us, 0.5%sy, 0.0%ni, 99.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu(s):用户空间使用率 系统空间使用率 nice值 空闲率 等待率 硬中断率 软中断率 被偷走的时间(分配给虚拟机中的进程的时间片) Mem: 1004136k total, 452340k used, 551796k free, 40868k buffers Swap: 2097148k total, 0k used, 2097148k free, 263940k cached
总内存大小 已使用 空闲内存 缓存使用 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 19356 1552 1232 S 0.0 0.2 0:00.89 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0

htop(epel):top的增强版,界面更友好,支持鼠标点击

iotop:用来监视磁盘I/O使用状况

选项:

  • -o:只看产生IO的进程
  • -b:非交互式
  • -n #:检测#次,默认为一直检测
  • -d #:检测间隔#秒
  • -p PID:检测指定PID的进程
  • -u:检测指定用户产生IO的情况
  • -P:仅显示进程,默认显示线程
  • -a:显示累计的IO量
  • -k:使用KB为单位
  • -t:显示时间戳
  • -q 只在第一次监测时显示列名
  • -qq 永远不显示列名
  • -qqq 永远不显示I/O汇总

交互按键:

  • left和right方向键:改变排序
  • r:反向排序
  • o:切换至选项-o
  • p:切换至-p选项
  • a:切换至-a选项
  • q:退出
  • i:改变线程的优先级
Total DISK READ: 673.43 M/s | Total DISK WRITE: 0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND         
线程ID(按p可切换PID) 优先级 用户 读速度 写速度 swap所占率 IO等待率 进程名 15330 be/4 root 673.43 M/s 0.00 B/s 0.00 % 2.07 % dd if=/dev/sda of=/dev/null 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init

nice -n nice值 CMD:指定运行时的nice值

renice -n nice值 CMD:调整运行中进程的nice值

vmstat:查看虚拟内存状态

  • -s: 显示内存的统计数据
[root@centos7 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 574860   2080 260516    0    0   105    37  165  179  0  1 99  0  0
  • procs
    • r:可运行(正运行或等待运行)进程的个数
    • b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)
  • memory
    • swpd: 交换内存的使用总量
    • free:空闲物理内存总量
    • buffer:用于buffer的内存总量
    • cache:用于cache的内存总量
  • swap
    • si:从磁盘交换进内存的数据速率(kb/s)
    • so:从内存交换至磁盘的数据速率(kb/s)
  • io
    • bi:从块设备读入数据到系统的速率(kb/s)
    • bo: 保存数据至块设备的速率
  • system
    • in: interrupts 中断速率,包括时钟
    • cs: context switch 进程切换速率
  • cpu
    • us:花在运行非内核代码上的时间
    • sy:花在运行内核代码上的时间
    • id:闲置的时间
    • wa:等待IO的时间
    • st:被虚拟机盗取的时间

iostat:统计CPU和设备IO信息

dstat:系统资源统计工具

  • -c: 显示cpu相关信息
  • -d: 显示disk相关信息
  • -g:显示page相关统计数据
  • -m: 显示memory相关统计数据
  • -n: 显示network相关统计数据
  • -p: 显示process相关统计数据
  • -r: 显示io请求相关的统计数据
  • -s: 显示swapped相关的统计数据
  • --tcp:显示tcp相关统计数据
  • --udp:显示udp相关统计数据 
  • --unix:显示unix-sockets相关统计数据 
  • --raw:显示raw相关统计数据
  • --socket:显示socket相关统计数据
  • --ipc:显示ipc相关统计数据
  • --top-cpu:显示最占用CPU的进程
  • --top-io: 显示最占用io的进程
  • --top-mem: 显示最占用内存的进程
  • --top-latency: 显示延迟最大的进程

pmap PID:查看进程对应的内存映射  ==  cat /proc/PID/maps

  • -x:显示详细信息

glances(epel):调用远程主机上的系统运行状态信息

[root@centos7 ~]# yum -q -y install glances #安装glances软件包
[root@centos7 ~]# glances -s -B 192.168.0.7 & #启动服务并监听端口
[root@centos7 ~]# glances -c 192.168.0.7 #客户端连接

释放buff/cache空间

echo 1 > /proc/sys/vm/drop_caches 

kill:向进程发送控制信号

  • -n # PID:向进程发信号
  • %作业号:结束作业
  • -l:查看所有信号

常用信号:man 7 signal

  • 1:SIGHUP 让进程重读配置文件
  • 2:SIGINT 终止信号
  • 3:SIGQUIT ctrl+,退出信号
  • 9:SIGKILL 强制退出
  • 15:SIGTERM 正常退出,kill默认发送15信号
  • 18:SIGCONT 继续运行
  • 19:SIGSTOP 停止信号

pkill -n #:向进程发送信号,支持模式匹配,用法和pgrep相似

  • -u uid: effective user,生效者
  • -U uid: real user,真正发起运行命令者
  • -t terminal: 与指定终端相关的进程
  • -P pid: 显示指定进程的子进程

killall -n # CMD:向进程发送指定信号

jobs:显示当前终端所有的作业

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

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

当我们在执行一个时间比较长的前台任务(如:压缩大文件,编译内核等),如果途中网络中断会导致我们的任务执行中断,此时为了避免这种情况建议采取以下操作:

  1. nohup CMD &>/dev/null 剥离与终端的关系,如果终端关闭,进程由init(systemd)接管
  2. screen:使用Ctrl + a,d剥离会话,-r恢复会话

个人学习笔记

记录于2018.5.5 19:56

原文地址:https://www.cnblogs.com/L-dongf/p/8987866.html