一、进程管理简介
1、为什么引入进程的概念?
- 从理论角度看,是对正在运行的程序过程的抽象;
- 从实现角度看,是一种数据结构,目的在于清晰地刻画动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。
2、什么是进程?
- 狭义定义:进程就是一段程序的执行过程。
- 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
- 进程是已启动的可执行程序的运行实例,进程有以下组成部分:
一个文件;
被配内存的地址空间;
有权限限制;
程序代码的一个或多个副本(也叫执行线程);
像人一样拥有状态(R运行、Sleep睡眠、Exit退出、Zombit僵死)。 - 静止的时候是文件,这种文件叫程序;运行起来的时候,把程序叫做进程。
3、进程有怎么样的特征?
- 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的;
- 并发性:任何进程都可以同其他进程一起并发执行;
- 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
- 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进;
- 结构特征:进程由程序、数据和进程控制块三部分组成;
- 多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果; 但是执行过程中,程序不能发生改变。
4、进程的状态?
- 在三态模型中,进程状态分为三个基本状态,即运行态,就绪态,阻塞态。
- 在五态模型中,进程分为新建态、终止态,运行态,就绪态,阻塞态。
①TASK_RUNNING:进程正在被CPU执行。当一个进程刚被创建时会处于TASK_RUNNABLE,表示己经准备就绪,正等待被调度。
②TASK_INTERRUPTIBLE(可中断):进程正在睡眠(也就是说它被阻塞)等待某些条件的达成。一旦这些条件达成,内核就会把进程状态设置为运行。处于此状态的进程也会因为接收到信号而提前被唤醒,比如给一个TASK_INTERRUPTIBLE状态的进程发送SIGKILL信号,这个进程将先被唤醒(进入TASK_RUNNABLE状态),然后再响应SIGKILL信号而退出(变为TASK_ZOMBIE状态),并不会从TASK_INTERRUPTIBLE状态直接退出。
③TASK_UNINTERRUPTIBLE(不可中断):处于等待中的进程,待资源满足时被唤醒,但不可以由其它进程通过信号或中断唤醒。由于不接受外来的任何信号,因此无法用kill杀掉这些处于该状态的进程。而TASK_UNINTERRUPTIBLE状态存在的意义就在于,内核的某些处理流程是不能被打断的。如果响应异步信号,程序的执行流程中就会被插入一段用于处理异步信号的流程,于是原有的流程就被中断了,这可能使某些设备陷入不可控的状态。处于TASK_UNINTERRUPTIBLE状态一般总是非常短暂的,通过ps命令基本上不可能捕捉到。
④TASK_ZOMBIE(僵死):表示进程已经结束了,但是其父进程还没有调用wait4或waitpid()来释放进程描述符。为了父进程能够获知它的消息,子进程的进程描述符仍然被保留着。一旦父进程调用了wait4(),进程描述符就会被释放。
⑤TASK_STOPPED(停止):进程停止执行。当进程接收到SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU等信号的时候。此外,在调试期间接收到任何信号,都会使进程进入这种状态。当接收到SIGCONT信号,会重新回到TASK_RUNNABLE。
二、进程管理process
1、静态查看进程PS
(1)静态查看进程信息命令:
# ps aux
命令参数说明:
选项 | 含义 |
---|---|
-a | 显示终端上的所有进程,包括其他用户的进程 |
-u | 显示进程的详细状态 |
-x | 显示没有控制终端的进程 |
-j | 李出与作业控制相关的进程 |
(2)ps aux 输出字段的含义:
- USER:启动程序的身份
- PID:进程ID(唯一性)
- %CPU:CPU占用率
- %MEM:内存占用率
- VSZ:占用的虚拟内存大小
- RSS:占用的实际内存大小
- TTY:进程运行的终端
- STAT:该进程的状态
- START:进程的启动时间
- TIME:进程的运行时间
- COMMAND:进程文件,进程名
(3)STAT中参数意义如下:
参数 | 含义 |
---|---|
D | 不可中断 Uninterruptible(usually IO) |
R | 正在运行,或在队列中的进程 |
S | 处于休眠状态 |
T | 停止或被追踪 |
Z | 僵尸进程 |
W | 进入内存交换(从内核2.6开始无效) |
X | 死掉的进程 |
< | 高优先级 |
n | 低优先级 |
s | 包含子进程 |
l | 多线程 |
+ | 位于后台的进程组 |
(4)静态查看进程并排序命令:
# ps aux --sort 需排序的字段名
例如:
# ps aux --sort %cpu(升序)
# ps aux --sort -%cpu(降序) //减号是降序排序
(5)静态查看进程的父子信息命令:
# ps -ef
(6)自定义字段静态查看进程信息:
# ps axo 需要查看信息的字段名
2、动态查看进程top
(1)动态查看实时进程信息命令:
# top
(2)top 输出信息详解:
- 上半部分
- 下半部分
其中PID、USER、%CPU、%MEM、COMMAND同上ps aux字段含义相同
PR:进程优先级,PR值
NI:进程优先级,nice值,负值表示高优先级,正值表述低优先级
VIRT:进程使用虚拟内存virtual memory usage,单位kb
RES:常驻内存resident memory usage(进程使用的、未被换出的物理内存大小),单位kb
SHR:共享内存shared memory,单位kb
S:进程状态
TIME+:进程使用的 CPU 时间总计,单位1/100秒
(3)top 内部常用指令
指令 | 含义 |
---|---|
h/? | 帮助 |
M | 按内存的使用排序 |
P | 按CPU使用排序 |
N | 以PID的大小排序 |
< | 向前 |
> | 向后 |
z | 彩色,Z设置彩色,使用数字调整 |
(4)top 技巧
指定刷新频率:
# top -d 时间(秒)
查看指定进程的动态信息:
# top -p 进程ID
3、使用信号控制进程kill
(1)信号控制进程语法
# kill -信号编号 -进程ID
(2)信号种类
查看所有信息种类的命令:
# kill -l
编号)信号名
常用信号如下:
- 1)SIGHUP:重新加载配置
- 2)SIGINT:键盘中断Ctrl+C
- 3)SIGQUIT:键盘退出Ctri+\,类似SIGINT
- 9)SIGKILL:强制终止,无条件
- 15)SIGTERM:终止(正常结束),缺省信号
- 18)SIGCONT:继续
- 19)SIGSTOP:暂停
- 20)SIGTSTP:键盘暂停Ctil+Z
4、进程优先级nice
(1)简介
- cpu资源分配的优先顺序,就是指进程的优先权(priority)。
- 优先权高的进程有优先执行的权利。配置进程优先权对多任务环境的Linux很有用。
- 还可以将进程安排到指定的CPU上,将不重要进程安排到某个CPU,可改善系统整体性能。
(2)优先级范围和特性
- 优先级范围:
系统默认一个程序的优先级(nice值)为0,默认PR值为+20
Nice Level(40个级别,-20~19)
top[PR值](这是系统定义的,不能动,-99~39)
Nice值 +20 = PR值
例如:
nice值为+10 PR值为+10+20=+30
nice值为-20 PR值为-20+20=0 - 优先级特性
nice值越大:表示优先级越低,例如+19。
nice值越小:表示优先级越高,例如-20。
(3)查看进程的nice级别命令:
# top
# ps axo pid,command,nice --sort=-nice
(4)修改nice值
- nice命令
启动具有不同nice级别的进程(示例):
手动启动不同nice:
# nice -n -5 sleep 6000 &
[2] 9068
# nice -n -10 sleep 7000 &
[3] 9083
# ps axo command,pid,nice | grep sleep
sleep 6000 9068 -5
sleep 7000 9083 -10
grep --color=auto sleep 9091 0
- renice命令
更改现有nice值:
# renice -nice值 进程ID
三、作业控制jobs
1、简介
作业控制是一个命令行功能,也叫后台运行,允许一个shell 实例来运行和管理多个命令。
如果没有作业控制,父进程fork()一个子进程后,将sleeping,直到子进程退出。
使用作业控制,可以选择性暂停,恢复,以及异步运行命令,让 shell 可以在子进程运行期间返回接受其他命令。
- 关键词:
foreground(fg):前台进程:是在终端中运行的命令,占领终端。
background(bg):后台进程:没有控制终端,它不需要终端的交互,看不见,但是在运行。
2、后台程序控制命令
后台运行进程:
# 进程名 &
查看后台进程:
# jobs
调动后台进程至前台:
# fg 作业序号
消灭后台进程:
# kill %作业序号
后台程序控制示例:
1、观察占领前台的现象
# sleep 2000
运行一个程序,当前终端无法输入,大部分命令行输入已经无效。按Ctrl+C终止进程。
2、运行后台进程
# sleep 3000 &
[1] 3367
3、ps查询所有程序
# ps aux | grep sleep 3000
root 3367 0.0 0.0 107956 616 pts/1 S 19:49 0:00 sleep 3000
4、jobs查看后台进程
# jobs
[1]+ 运行中 sleep 3000 &
5、调动后台程序至前台
# fg 1 将作业序号为1的后台进程调回前台
sleep 3000
6、消灭后台进程
# kill %1
[1]+ 已终止 sleep 3000
注意:"kill 1"和"kill %1"不同,前者终止PID为1的进程,后者杀死作业序号为1的后台进程。
四、虚拟文件系统proc
1、简介
- 虚拟文件系统:采集服务器自身内核、进程运行的状态信息。
- /proc文件系统是一种内核和内核模块用来向进程(process)发送信息的机制。这个伪文件系统让你可以和内核内部数据结构进行交互,获取有关进程的有用信息,在运行中改变设置(通过改变内核参数)。与其他文件系统不同,/proc存在于内存之中,而不是硬盘上。
- /proc由内核控制,没有承载/proc的设备。因为/proc主要存放由内核控制的状态信息,所以大部分这些信息的逻辑位置位于内核控制的内存。
- /proc的文件可以用于访问有关内核状态、计算机属性、正在运行的进程的状态等信息。大部分/proc中的文件和目录提供系统物理环境的最新信息。
2、得到有用的系统/内核信息
/proc文件系统可被用于手机有用的关于系统和运行中的内核信息。下面是一些重要的文件:
- /proc/cmdline:系统启动时输入给内核命令行参数
- /proc/cpuinfo:CPU的硬件信息 (型号, 家族, 缓存大小等)
- /proc/devices:主设备号及设备组的列表,当前加载的各种设备(块设备/字符设备)
- /proc/dma:使用的DMA通道
- /proc/filesystems:当前内核支持的文件系统,当没有给 mount(1) 指明哪个文件系统的时候, mount(1) 就依靠该文件遍历不同的文件系统
- /proc/interrupts:中断的使用及触发次数,调试中断时很有用
- /proc/ioports:当前在用的已注册 I/O 端口范围
- /proc/kcore:该伪文件以 core 文件格式给出了系统的物理内存映象(比较有用),可以用 GDB 查探当前内核的任意数据结构。该文件的总长度是物理内存 (RAM) 的大小再加上 4KB
- /proc/kmsg:可以用该文件取代系统调用 syslog(2) 来记录内核日志信息,对应dmesg命令
- /proc/kallsym:内核符号表,该文件保存了内核输出的符号定义, modules(X)使用该文件动态地连接和捆绑可装载的模块
- /proc/loadavg:负载均衡,平均负载数给出了在过去的 1、 5,、15 分钟里在运行队列里的任务数、总作业数以及正在运行的作业总数
- /proc/locks:内核锁
- /proc/meminfo:物理内存、交换空间等的信息,系统内存占用情况,对应df命令
- /proc/misc:杂项
- /proc/modules:已经加载的模块列表,对应lsmod命令
- /proc/mounts:已加载的文件系统的列表,对应mount命令,无参数
- /proc/partitions:系统识别的分区表
- /proc/slabinfo:sla池信息
- /proc/stat:全面统计状态表,CPU内存的利用率等都是从这里提取数据。对应ps命令
- /proc/swaps:交互空间的利用情况
- /proc/version:正在运行的内核版本