linux进程管理
linux进程管理
1. 进程基本概述
-
进程是已启动的可执行程序的运行中实例。
-
/proc目录下以数字为名的目录,每一个目录代表一个进程,保存着进程的属性信息。每一个进程的PID是唯一的,就算进程退出了,其它进程也不会占用其PID。
1.1 进程的组成部分
- 已分配内存的地址空间
- 安全属性,包括所有权凭据和特权
- 程序代码的一个或多个执行线程
- 进程状态
1.2 进程的环境
- 本地和全局变量
- 当前调度上下文
- 分配的系统资源,如文件描述符和网络端口
1.3 进程的产生
- 现有的(父)进程复制自己的地址空间(fork)来创建一个新的(子)进程结构。
- 每个新进程分配有一个唯一的进程ID(PID),满足跟踪和安全性之需。PID与父进程ID(PPID)是新进程环境的元素。
- 任何进程可创建子进程。所有进程都是第一个系统进程的后代。
- RHEL7上,第一个系统进程是systemd。
1.4 进程的分类
- 前台进程:与终端相关的进程,通过终端启动的进程
- 注意:也可把在前台启动的进程送往后台,以守护模式运行
- 守护进程:daemon,与终端无关的进程(如内核),在系统引导过程中启动的进程。
2. 进程状态
- Excuting 运行态
- Ready 就绪态,也可以称作睡眠态
- Uninterruptible sleep 不可中断的睡眠。不可随时唤醒,只有当IO资源加载成功后才能唤醒
- Interruptible sleep 可中断的睡眠。可随时唤醒
- Zombie 僵尸进程。正常运行结束了,但是不释放占据的内存
- Stopped 停止态,暂停于内存中,但不会被调度,除非手动启动之
Linux进程状态
标志 | 内核定义的状态名称和描述 |
---|---|
R | TASK_RUNNING:进程正在CPU上执行,或者正在等待运行。处于运行中(或可运行)状态时,进程可能正在执行用户例程或内核例程(系统调用),或者已排队并就绪 |
S | TASK_INTERRUPTIBLE:进程处于睡眠状态且正在等待某一条件:硬件请求、系统资源访问或信号。当事件或信号满足该条件时,该进程将返回到运行中 |
D | TASK_UNINTERRUPTIBLE:此进程也在睡眠,但与S状态不同,不会响应传递的信号。仅在特定的条件下使用,其中进程中断可能会导致意外的设备状态 |
K | TASK_KILLABLE:进程处于睡眠状态,与不可中断的D状态相同,但有所修改,允许等待中的任务通过响应信号而被中断(彻底退出)。实用程序通常将可中断的进程显示为D状态 |
T | TASK_STOPPED:进程已被停止(暂停),通常是通过用户或其他进程发出的信号。进程可以通过另一信号返回到运行中状态,继续执行(恢复) |
T | TASK_TRACED:正在被调试的进程也会临时停止,并且共享同一个T状态标志 |
Z | EXIT_ZOMBIE:子进程在退出时向父进程发出信号。除进程身份(PID)之外的所有资源都已释放 |
X | EXIT_DEAD:当父进程清理(获取)剩余的子进程结构时,进程现在已彻底释放。此状态从不会在进程列出实用程序中看到 |
< | 高优先级进程 |
N | 低优先级进程 |
+ | 前台进程组中的进程 |
多线程进程 | |
s | 会话进程首进程 |
3. 进程优先级
3.1 linux进程调度与多任务
- 现代计算机系统中既包含每次只能执行一个指令的低端处理器,也包含高性能超级计算机,这些超级计算机每台配备数百个CPU,每个CPU上具有多个核心,它们可以并行执行数以百计的指令。但是所有这些系统往往具有一个共同点:它们需要运行的进程数量总是超出实际具有的核心数。
- 通过时间分片技术,Linux(和其他操作系统)实际能够运行的进程数(和线程数)可以超出可用的实际处理单元数。操作系统进程调度程序将在单个核心上的进程之间进行快速切换,从而给用户一种有多个进程在同时运行的印象。
- 执行此切换的Linux内核部分称为进程调度程序。
3.2 进程优先级
- 进程优先级范围:0-139,数字越小,优先级越高
- 0-99:实时优先级,内核调整
- 100-139:静态优先级,用户可控制
- 进程优先级高的特点:
- 获得更多的CPU运行时间
- 更优先获得CPU运行的机会
要修改进程的优先级可以通过调整进程的nice值(静态优先级)来实现,nice值越小,优先级越高:nice值的范围是(-20,19),-20对应100,19对应139
3.3 相对优先级
- 由于不是每种进程都与其他进程同样重要,可告知调度程序为不同的进程使用不同的调度策略。常规系统上运行的大多数进程所使用的调度策略称为
SCHED_OTHER
(也称为SCHED_NORMAL
),但还有一些其他策略可用于不同的目的。 - 由于并非所有进程都以同样的方式创建,可为采用
SCHED_NORMAL
策略运行的进程指定相对优先级。此优先级称为进程的nice
值。一个进程可以有40种不同级别的nice
值。 - 这些nice级别的范围是从-20到19。默认情况下,进程将继承其父进程的nice级别,通常为0
nice
级别越高,表示优先级越低(该进程容易将其CPU使用量让给其他进程)
nice
级别越低,表示优先级越高(该进程更加不倾向于让出CPU)
如果不存在资源争用(例如当活动进程数少于可用CPU核心数时),即使nice
级别高的进程也将仍使用它们可使用的所有可用CPU资源。但当请求CPU时间的进程数超过可用核心数时,nice
级别较高的进程将比nice
级别较低的进程收到更少的CPU时间
3.4 nice级别与权限
- 为很占CPU资源的进程设置较低的nice级别可能会对同一系统上运行的其他进程的性能造成负面影响,所以仅允许root用户设置负nice级别以及降低现有进程的nice级别。
- 普通非特权用户仅允许设置正的nice级别。只能对现有进程提升nice级别,而不能降低nice级别。
3.5 进程优先级调整
- 进程优先级调整:调整nice值
- 命令:renice NI PID (例:renice 3 3704)调整已经启动的进程的nice值
示例:
[root@localhost ~]# ps -elF|grep vi
4 S root 757 1 0 80 0 - 24901 poll_s 6080 1 10:04 ? 00:00:00 /usr/bin/VGAuthService -s
4 S root 1706 1691 0 80 0 - 31557 poll_s 1872 0 16:21 pts/1 00:00:00 vi a
0 S root 1716 1671 0 80 0 - 28