进程管理

进程概念 

程序一般是放置在磁盘中的,通过用户的执行来触发。出发后会被加载到内存中成为一个个体,就是进程。
内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等
Process: 运行中的程序的一个副本,是被载入内存的一个指令集合 进程ID(Process ID,PID)号码被用来标记各个进程
UID、GID、和SELinux语境决定对文件系统的存取和访问权限, 通常从执行进程的用户来继承
存在生命周期
task struct:Linux内核存储进程信息的数据结构格式
task list:多个任务的的task struct组成的链表
进程创建: init:第一个进程 父子关系
进程:都由其父进程创建,CoW fork(), clone()
进程:程序在一个数据集上的一次运行过程。是操作系统资源分配的基本单位。
线程:是进程中的一个实体,是被操作系统独立调度和执行的基本单位。一个进程包含一个或多个线程。
作业是向计算机提交任务的任务实体,
而进程是执行实体,是资源分配的基本单位,
线程是处理机调度的基本单位。
进程特征  

         动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
   并发性:任何进程都可以同其他进程一起并发执行
   独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
   异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
   结构特征:进程由程序、数据和进程控制块三部分组成。
  多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。
进程的状态和转换
进程执行时的间断性,决定了进程可能具有多种状态。事实上,运行中的进程可能具有以下三种基本状态。
  1)就绪状态(Ready)
  进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。
  2)运行状态(Running):
  进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。
  3)阻塞状态(Blocked):
  由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理机分配给该进程,也无法运行。

 

 

进程状态五态模型:

运行状态(Running):当一个进程正在处理机上运行时。
就绪状态(Ready):一个进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行.
等待状态又称阻塞状态(Blocked):一个进程正在等待某一事件而暂停运行时。如等待某资源,等待输入/输出完成。
创建状态(NEW):一个进程正在被创建,还没被转到就绪状态之前的状态。
结束状态(Exit):一个进程正在从系统中消失时的状态,这是因为进程结束或由于其他原因所导致。

 

状态之间转换六种情况

运行——>就绪:1,主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;2,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态。
就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求
阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列
以下两种状态是不可能发生的:
阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取
就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态

查看进程ps [OPTION]...

支持三种选项:
UNIX选项 如-A -e
BSD选项 如a
GNU选项 如--help
• 选项:默认显示当前终端中的进程
• a 选项包括所有终端中的进程
• x 选项包括不链接终端的进程
• u 选项显示进程所有者的信息
• f 选项显示进程树,相当于 --forest
• k|--sort 属性 对属性排序,属性前加- 表示倒序
• o 属性… 选项显示定制的信息 pid、cmd、%cpu、%mem
• L 显示支持的属性列表
ps常见选项
-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的子进程
-M 显示SELinux信息,相当于Z
ps输出属性
STAT:进程状态
R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前台进程
l: 多线程进程
L:内存分页并带锁
N:低优先级进程
<: 高优先级进程
s: session leader,会话(子进程)发起者
ps常用组合:
aux
-ef
-eFH
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ps示例

查询你拥有的所有进程: ps -x
显示指定用户名(RUID)或用户ID的进程: ps -fU apache ps -fu 4
显示指定用户名(EUID)或用户ID的进程: ps -fu wang ps -fu 1000 
查看以root用户权限(实际和有效ID)运行的每个进程: ps -U root -u root
列出某个组拥有的所有进程(实际组ID:RGID或名称): ps -fG nginx
列出有效组名称(或会话)所拥有的所有进程: ps -fg mysql ps -fG 27
通过进程ID来显示所属的进程: ps -fp 1234
以父进程ID来显示其下所有的进程,如显示父进程为1154的所有进程: ps -f --ppid 1234 
显示指定PID的多个进程: ps -fp 1204,1239,1263
要按tty显示所属进程: ps -ft pst/0 ps示例
以进程树显示系统中的进程如何相互链接: ps -e --forest
以进程树显示指定的进程 ps -f --forest -C sshd ps -ef --forest | grep -v grep | grep sshd
要显示一个进程的所有线程,将显示LWP(轻量级进程)以及NLWP(轻量级进 程数)列: 
ps -fL -C nginx
要列出所有格式说明符: ps L
查看进程的PID,PPID,用户名和命令: ps -eo pid,ppid,user,cmd
使用其PID查找进程名称: ps -p 1244 -o comm= 
要以其名称选择特定进程,显示其所有子进程: ps -C sshd,bash

 

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:显示当前终端所有的作业

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

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

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

  1. nohup CMD &>/dev/null 剥离与终端的关系,如果终端关闭,进程由init(systemd)接管
  2. screen:使用Ctrl + a,d剥离会话,-r恢复会话
posted @ 2018-05-07 09:15  琼兔  阅读(293)  评论(0编辑  收藏  举报