进程概念
-
内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等
-
Process: 运行中的程序的一个副本,是被载入内存的一个指令集合
进程ID(Process ID,PID)号码被用来标记各个进程 UID、GID、和SELinux语境决定对文件系统的存取和访问权限 通常从执行进程的用户来继承 存在生命周期
-
task struct:Linux内核存储进程信息的数据结构格式
-
task list:多个任务的的task struct组成的链表
-
进程创建:
init:第一个进程 进程:都由其父进程创建,父子关系,CoW fork(), clone()
进程的基本状态
- 创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
- 就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
- 执行状态:进程处于就绪状态被调度后,进程进入执行状态
- 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
- 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行
进程之间转换六种情况
- 运行——>就绪:1,主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;2,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态
- 就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
- 运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求
- 阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列
以下两种状态是不可能发生的:
- 阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取
- 就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态
进程优先级
系统优先级:数字越小,优先级越高
0-139(CentOS4,5)
各有140个运行队列和过期队列
0-98,99(CentOS6)
实时优先级: 99-0 值最大优先级最高
nice值:-20到19,对应系统优先级100-139或99
Big O:时间复杂度,用时和规模的关系
O(1), O(logn), O(n)线性, O(n^2)抛物线, O(2^n)
进程优先级管理
# 进程优先级调整
静态优先级:100-139
进程默认启动时的nice值为0,优先级为120
只有根用户才能降低nice值(提高优先性)
# nice命令
nice [OPTION] [COMMAND [ARG]...]
# renice命令
renice [-n] priority pid...
# 查看
ps axo pid,comm,ni
进程相关概念
1、进程内存
- Page Frame: 页框,用存储页面数据,存储Page 4k
- LRU:Least Recently Used 近期最少使用算法,释放内存
- MMU:Memory Management Unit 负责转换线性和物理地址(物理地址空间和线性地址空间)
- TLB:Translation Lookaside Buffer 翻译后备缓冲器,用于保存虚拟地址和物理地址映射关系的缓存
2、IPC(Inter Process Communication:进程间通信)
同一主机:signal:信号
shm: shared memory
semaphore:信号量,一种计数器
不同主机:socket: IP和端口号
RPC: remote procedure call
MQ:消息队列,Kafka,ActiveMQ
进程状态
Linux内核:抢占式多任务
进程类型:
守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程
前台进程:跟终端相关,通过终端启动的进程
注意:两者可相互转化
进程状态:
运行态:running
就绪态:ready
睡眠态:
可中断:interruptable
不可中断:uninterruptable
停止态:stopped,暂停于内存,但不会被调度,除非手动启动
僵死态:zombie,结束进程,父进程结束前,子进程不关闭
进程信息的相关文件
1、内核状态信息的相关文件
/proc/:内核中的状态信息
内核参数:
可设置其值从而调整内核运行特性的参数;/proc/sys/
状态变量:其用于输出内核中统计信息或状态信息,仅用于查看
参数:模拟成文件系统类型
2、相关进程的参数信息
/proc/#:
#:PID
# 里面有此进程的内核参数,内容非常不友好,不是内核开发人员看不懂
# cat cmdline # 启动此进程的命令参数
# cat mem # 查看此进程的内存参数,一般不予许查看
# cat maps # 哪些内存空间存储了哪些内容文件
系统管理工具
进程的分类:
CPU-Bound:CPU密集型,非交互
IO-Bound:IO密集型,交互
Linux系统状态的查看及管理工具:
# pstree ps pidof pgrep top/htop
# glance pmap vmstat dstat kill
# pkill job bg fg nohup
系统状态查看工具
pstree
以树状图的方式展现进程之间的派生关系。
pstree - display a tree of processes
1、pstree 命令
pstree命令 以树状图的方式展现进程之间的派生关系,显示效果比较直观。
语法格式:
pstree [OPTIONS]
OPTIONS:
-a # 显示每个程序的完整指令,包含路径,参数或是常驻服务的标示
-c # 不使用精简标示法
-G # 使用VT100终端机的列绘图字符
-h # 列出树状图时,特别标明现在执行的程序
-H PID # 此参数的效果和指定"-h"参数类似,但特别标明指定的程序
-l # 采用长列格式显示树状图
-n # 用程序识别码排序。预设是以程序名称来排序
-p # 显示程序识别码
-u # 显示用户名称
-U # 使用UTF-8列绘图字符
-V # 显示版本信息
2、pstree 示例
1、获取 SSH 会话的 PID。
# pstree -p | grep ssh
|-sshd(1221)-+-sshd(2768)---bash(2770)-+-grep(2810)
| `-sshd(2807)---sshd(2808)
从上方的输出中,你可以看到 sshd 进程与分支的树形图。sshd 的主进程是 sshd(1221),另两个分支分别为 sshd(2768) 和 sshd(2807)。
2、显示所有进程的所有详细信息,遇到相同的进程名可以压缩显示。
# pstree -a
3、显示当前所有进程的进程号和进程id。
# pstree -p
ps(重要)
通过查看进程的内核参数来进行友好的输出。
# ps - report a snapshot of the current processes.
Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中。
语法格式
# ps [options]
选项有三种风格
- 1 UNIX options, which may be grouped and must be preceded by a dash.(例 -A -e)
- 2 BSD options, which may be grouped and must not be used with a dash.(例 a)
- 3 GNU long options, which are preceded by two dashes.(如 --help)
启动进程的方式
- 系统启动过程中自动启动:与终端无关的进程
- 用户通过终端启动:与终端相关的进程
选项
a # 选项包括所有终端中的进程
x # 选项包括不链接终端的进程
u # 选项显示进程所有者的信息
f # 选项显示进程树,相当于 --forest
k|--sort # 属性 对属性排序,属性前加- 表示倒序
o # 属性… 选项显示定制的信息 pid、cmd、%cpu、%mem
L # 显