可能以前是通过cgroup的方式限制的,定义一个分组不给任何cpu,将被冻的线程加到这个分组就实现了冻结。现在的逻辑有些变化,每个进程有freeze节点,如果被冻将这个节点置为1,通知kernel执行相关冻结逻辑,cpu调度的时候发现处于冻结状态不给调度,进程状态不一样,还是s状态,堆栈处于do_freeze_trip。
核心接口文件
所有 cgroup 核心文件均以 cgroup.为前缀。
1. cgroup.type
类型:读写单值文件(仅非根 cgroup 存在)
读取值:
"domain":普通有效的域 cgroup
"domain threaded":作为线程化子树根的域 cgroup
"domain invalid":处于无效状态的 cgroup(无法填充或启用控制器,但可转为线程化 cgroup)
"threaded":线程化 cgroup(属于线程化子树成员)写入操作:写入 "threaded"可将 cgroup 转为线程化(单向操作)。
例如我的手机是domain
2. cgroup.procs
类型:读写换行分隔值文件(所有 cgroup 存在)
读取:列出属于该 cgroup 的所有进程 PID(无序,可能重复)。
写入:写入 PID 可迁移对应进程至该 cgroup。需满足:
对目标 cgroup.procs有写入权限
对源和目标 cgroup 的共同祖先 cgroup.procs有写入权限线程化 cgroup:读取返回 EOPNOTSUPP(因所有进程属于线程根),写入会迁移进程的所有线程。
3. cgroup.threads
类型:读写换行分隔值文件(所有 cgroup 存在)
读取:列出属于该 cgroup 的所有线程 TID(无序,可能重复)。
写入:写入 TID 可迁移对应线程至该 cgroup。需满足:
对目标 cgroup.threads有写入权限
源 cgroup 与目标 cgroup 在同一资源域
对共同祖先 cgroup.procs有写入权限
4. cgroup.controllers
类型:只读空格分隔值文件(所有 cgroup 存在)
内容:列出该 cgroup 可用的所有控制器(无序)。
实测如下:
5. cgroup.subtree_control
类型:读写空格分隔值文件(初始为空)
读取:列出已启用控制器(控制资源分配到子 cgroup)。
写入:以 +(启用)或 -(禁用)前缀操作控制器(如 "+cpu -memory")。多次操作同一控制器时,最后一次生效。
6. cgroup.events
类型:只读扁平键值文件(非根 cgroup 存在)
键值:
populated:1(含存活进程或其子 cgroup 含进程)或 0
frozen:1(已冻结)或 0事件:值变更时触发文件修改事件。
7. cgroup.max.descendants
类型:读写单值文件(默认 "max")
功能:限制子 cgroup 的最大数量(超限时创建失败)。
8. cgroup.max.depth
类型:读写单值文件(默认 "max")
功能:限制当前 cgroup 下的最大嵌套深度(超限时创建子 cgroup 失败)。
9. cgroup.stat
类型:只读扁平键值文件
键值:
nr_descendants:可见子 cgroup 总数
nr_dying_descendants:待销毁子 cgroup 总数(删除后进入此状态)
nr_subsys_:当前及子 cgroup 的活动子系统数(如 memory)
nr_dying_subsys_:当前及子 cgroup 的待销毁子系统数
10. cgroup.freeze
类型:读写单值文件(非根 cgroup 存在,默认 "0")
操作:
写入 "1":冻结该 cgroup 及所有子 cgroup(进程停止运行)
写入 "0":解冻特性:
冻结状态传播:祖先 cgroup 冻结会导致后代冻结
进程可被终止或迁移(迁入停止,迁出恢复运行)
不影响 cgroup 树操作(可删除冻结的空 cgroup 或创建子 cgroup)
11. cgroup.kill
类型:只写单值文件(非根 cgroup 存在)
操作:写入 "1"杀死该 cgroup 及所有子 cgroup 中的进程(发送 SIGKILL)。
线程化 cgroup:写入返回 EOPNOTSUPP(因需操作整个线程组)。
12. cgroup.pressure
类型:读写单值文件(默认 "1")
操作:
"0":禁用 PSI(Pressure Stall Information)统计
"1":启用 PSI 统计特性:非层级化(不影响后代 cgroup)。
我的android 15 手机没有该文件节点
13. irq.pressure
类型:读写嵌套键值文件
功能:显示 IRQ/SOFTIRQ 的压力停滞信息(详见 Documentation/accounting/psi.rst)。
我的android 15 手机没有该文件节点