浅析linux 系统进程冻结(freezing of task)

1 概述

进程冻结是当系统hibernate或者suspend时,对进程进行暂停挂起的一种机制,后面主要以hibernate为例进行介绍。那么为什么要在hibernate或者suspend时需要把进程冻结呢?主要是出于如下的原因:

  1. 防止文件系统被修改后无法恢复。假设没有进程冻结操作,那么在hibernate时,进程可能会在hibernation image镜像生成后依然修改文件系统,这就导致当系统从hibernate镜像resume时这部分的修改丢失,更严重的可能导致无法从hibernate image恢复文件系统数据。
  2. hibernation image生成需要足够的内存空间,为了保证内存回收后不被其他进程再申请走,因此需要先对进程进行冻结,然后在生成hibernation image。
  3. 防止进程在系统suspend或者hibernate之后继续访问已经休眠的设备
  4. 防止用户空间进程需要针对suspend或者hibernate状态做相应的处理,有了进程冻结之后,suspend和hibernate对于用户空间进程来说完全是透明的,不用特殊做处理。

2 相关变量和接口

有3个 per-task 的 flag 用于描述进程冻结状态:
PF_NOFREEZE:如果置位表示该进程不会被冻结,为0表示进程需要在suspend或者hibernate时被冻结
PF_FROZEN:表示进程已经处于冻结状态
PF_FREEZER_SKIP:附加备用状态

3个重要的全局变量:
system_freezing_cnt:大于 0 表示系统进入了冻结状态
pm_freezing: true 表示用户进程被冻结
pm_nosig_freezing: true 表示内核进程和 workqueue 被冻结

重要的函数API:

freeze_processes():
-冻结用户态进程,内部会调用try_to_freeze_tasks(true)。
 
freeze_kernel_threads():
-冻结内核线程,内核会调用try_to_freeze_tasks(false)(实际上是冻结所有进程,因为也会扫描用户态进程)
 
thaw_kernel_threads():
 -解冻内核线程
 
thaw_processes():
  -解冻所有进程(包括内核线程和用户态进程)

3 如何请求冻结一个进程 try_to_freeze_tasks()【核心】

freeze_processes 和 freeze_kernel_threads 最终都会调用到一个关键函数 try_to_freeze_tasks

static int try_to_freeze_tasks(bool user_only)
{
    struct task_struct *g, *p;
    unsigned long end_time;
    unsigned int todo;
    bool wq_busy = false;
    ktime_t start, end, elapsed;
    unsigned int elapsed_msecs;
    bool wakeup = false;
    int sleep_usecs = USEC_PER_MSEC;
#ifdef CONFIG_PM_SLEEP
    char suspend_abort[MAX_SUSPEND_ABORT_LEN];
#endif
 
    start = ktime_get_boottime();
 
    end_time = jiffies + msecs_to_jiffies(freeze_timeout_msecs);
 
    if (!user_only)  //根据传入的参数判断是否只冻结用户态进程
        freeze_workqueues_begin();  //如果为false,则冻结WQ_FREEZABLE类型的workqueue
 
    while (true) {
        todo = 0;
        read_lock(&ta
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值