Go中cgroups Freeze与Linux kill -STOP暂停单进程的区别是什么
cgroup Freeze/Thaw 与 kill -STOP/CONT 暂停进程的差异
哪怕目标cgroup内仅存在单个进程,两种暂停/恢复方式仍存在本质差异,核心区别如下:
- 信号行为差异
kill -STOP本质是向指定PID发送SIGSTOP信号,该信号无法被进程捕获、忽略或阻塞,暂停状态下的进程仍可响应SIGKILL、SIGSEGV等致命信号,会直接退出,执行kill -CONT发送SIGCONT信号即可恢复进程运行。- cgroup的
Freeze()是内核freezer子系统的原生能力,不会向进程发送任何信号,冻结期间所有发往进程的信号都会被内核暂存,哪怕是SIGKILL也不会被立刻处理,直到调用Thaw()解冻后才会统一递送信号。此时单独给进程发SIGCONT无法唤醒进程,必须通过cgroup的解冻接口操作。
- 状态标识差异
- 被
SIGSTOP暂停的进程,通过ps等工具查询时状态会显示为T(stopped,暂停状态),符合常规的进程信号暂停标识。 - 被cgroup冻结的进程,用户态工具查询到的进程状态不会标记为
T,内核层面只是将进程移出调度队列,不再分配CPU时间片,进程本身无法感知自身被冻结,解冻后只会感知到时间出现跳变。
- 被
- 作用范围差异
kill -STOP仅作用于指定的单个PID,若该进程在暂停期间fork出子进程,子进程会默认处于运行状态,不会被自动暂停。Freeze()作用于整个cgroup,就算当前仅存在1个进程,后续新加入该cgroup、或者该进程fork出的属于同cgroup的子进程,都会被自动冻结,不会出现漏停的情况。
如果只是临时暂停单个已知PID的进程,两种方式都能达到暂停运行的效果,但如果涉及容器、进程组管理等场景,cgroup的冻结能力可靠性要远高于手动发信号的方式。
内容的提问来源于stack exchange,提问作者si yan
相关产品推荐
相关产品推荐

