Tag: #任务管理
进程
概述
进程(process),是计算机中程序执行的实例,进程不仅包括可执行的程序代码,还包含程序的当前活动、资源和状态。
根进程通常是系统启动时的第一个进程(在Unix和Linux系统中通常是init
进程或systemd
进程,PID为1)。所有其他进程都是这个根进程或其后代的子进程。
有一些特定的进程,它们的父进程ID(PPID)为0,这通常表示它们是由内核启动的特殊进程。这些进程通常在系统引导过程中由内核创建,而不是通过常规的用户态进程创建机制。kthreadd
和 systemd
就是两个这样的进程。
进程的五种状态
- S(Interruptible sleep):可中断休眠状态。
可以接收到异常信号,从而中断休眠状态 - D(Uninterruptible sleep):不可中断休眠状态。
- R(Running or runnable):执行或者在可执行队列中。
- Z(Zombie process):僵尸。
当父进程结束后,子进程的资源还未被释放,这时子进程就变为僵尸进程 - T(Stopped):暂停。
任务管理
查看进程
ps
pstree
我们使用 pstree
命令可以很清楚的看到进程之间的关系
top
top
命令可以实时展示进程状态和 cpu 占用情况
杀死进程
kill
原理
kill
命令通过向内核发送系统调用来向目标进程发送信号。内核接收到信号后,将其传递给目标进程。进程根据信号的类型和预定义的处理程序来处理信号。
常见的信号包括:
SIGTERM
(15):请求进程终止。可以被进程捕获和处理或忽略,是一种温和的终止信号。SIGKILL
(9):强制终止进程。不能被捕获、阻塞或忽略,立即终止进程。SIGHUP
(1):挂起信号,通常用于重新加载配置文件或重启进程。SIGINT
(2):中断信号,通常由用户通过Ctrl+C发出,表示请求进程终止。SIGQUIT
(3):退出信号,通常由用户通过Ctrl+\发出,产生核心转储文件并终止进程。
使用方法
命令 | 描述 | 示例 |
---|---|---|
kill [PID] | 发送默认的SIGTERM 信号请求终止进程 | kill 1234 |
kill -9 [PID] | 发送SIGKILL 信号强制终止进程 | kill -9 1234 |
kill -s [SIGNAL] [PID] | 发送指定的信号给进程 | kill -s SIGHUP 1234 |
kill -[SIGNAL_NUMBER] [PID] | 发送指定编号的信号给进程 | kill -1 1234 |
kill -l | 列出所有可用的信号名称和编号 | kill -l |
kill [PID1] [PID2] ... | 发送默认的SIGTERM 信号请求终止多个进程 | kill 1234 5678 91011 |
前台后台进程
jobs
当我们在指令后面加上 &
符号时候,系统就会将该进程放在后台执行并生成一个 job
其中 [ job ID] PID
我们可以使用 fg %[job ID]
将其放在前台工作
也可以使用 bg %[job ID]
放在后台工作
进程优先级
nice 和 priority 值
nice
nice 值取值区间为 -20 -- 19
, 我们可以把抢占 cpu 资源想象成一个不好的行为(一直占用公共资源本来就是一种恶习),这样当一个程序是 nice 的时候,就是它抢占 cpu 资源的能力低,也就是优先级变低
nice 值是不会变化的,因此也被称为静态优先级。在一个进程被 fork 时候,nice 值默认为 0,我们也可以使用 nice -n <num> <cmd>
来初始化一个进程的 nice 值,也可以使用 renice
重新设定一个正在执行的进程的 nice 值
priority
priority 的取值范围为 0 -- 139
,取值越小优先级越高
根据进程的优先级我们可以把进程分为两类:
0 -- 99
: 实时进程
100 -- 139
:非实时进程
实时进程和非实时进程
在Linux中,实时进程和普通进程的调度机制是不同的。
有以下几点规则:
- 实时进程先于非实时进程执行
- 对于实时进程,一定是优先级高的先执行,同优先级执行相应的调度机制
- nice 值对于实时进程无效