在我前面的文章中已经介绍了内核中的进程冻结技术,进程冻结存在的意义以及它的实现架构,没有看过的童鞋可以点击如下链接过去浏览:
https://blog.csdn.net/rikeyone/article/details/103182748

看过此文的人可能又会产生一些新的疑问,一个进程如果被冻结了,那么它到底在做什么呢?处于什么状态呢?这也是我当时产生的疑问,经过RTFSC,就记录了本文,对该问题进行一些解答,本文的内容基于Linux-4.0。

冻结状态

通过前文,我们知道当系统休眠时,是会对用户进程发送冻结信号的,同时也会对内核线程发送冻结的信号(姑且当做是一种信号吧)。而实际的冻结操作并不是在suspend中执行的,suspend只会发送信号,而是各自进程接收到信号后各自对自己进行冻结操作,实际最终运行的是如下内核函数:

bool __refrigerator(bool check_kthr_stop)
{/* Hmm, should we be allowed to suspend when there are realtimeprocesses around? */bool was_frozen = false;long save = current->state;  // --- 1pr_debug("%s entered refrigerator\n", current->comm);for (;;) {set_current_state(TASK_UNINTERRUPTIBLE); // --- 2spin_lock_irq(&freezer_lock);current->flags |= PF_FROZEN;if (!freezing(current) ||               // --- 3(check_kthr_stop && kthread_should_stop()))current->flags &= ~PF_FROZEN;spin_unlock_irq(&freezer_lock);if (!(current->flags & PF_FROZEN))     // --- 4break;was_frozen = true;schedule();                            // --- 5}pr_debug("%s left refrigerator\n", current->comm);/** Restore saved task state before returning.  The mb'd version* needs to be used; otherwise, it might silently break* synchronization which depends on ordered task state change.*/set_current_state(save);     // --- 6return was_frozen;
}

1.保存本进程冻结前的状态到save

2.设置本进程为D状态(TASK_UNINTERRUPTIBLE)

3.判断当前进程是否需要执行freeze冻结

4.如果经过前面的条件判断,不应该对本进程执行冻结,那么就break掉

5.如果满足冻结条件,那么执行schedule(),该函数会把要睡眠的进程从rq中移除

6.跳出循环后恢复进程的状态为save保存的值

通过以上的分析,我们可以看出所谓的进程冻结,它的本质实际上就是设置进程进入不可中断的休眠状态(TASK_UNINTERRUPTIBLE)。

解冻状态

从上面可以看出一个进程进入了冻结状态,那么它就会在schedule()之后进入睡眠状态,所谓的解冻就是把睡眠状态的进程唤醒,恢复之前的状态后继续运行。
先看一下解冻处理的第一步,唤醒操作:

void __thaw_task(struct task_struct *p)
{unsigned long flags;spin_lock_irqsave(&freezer_lock, flags);if (frozen(p))wake_up_process(p);spin_unlock_irqrestore(&freezer_lock, flags);
}

该函数是在resume时执行的操作,其中的关键动作就是wake_up_process,在唤醒操作中需要扫描所有被冻结的进程并且唤醒它们。

从上面的__refrigerator函数可以看到,冻结的进程从schedule()中被唤醒之后,它依然在for循环当中,但此时该进程已经是一个解冻的状态了,通过第3步检测时就会跳过冻结操作,因此就从循环中break出来,然后就可以恢复save状态继续运行了。

因此解冻的本质就是唤醒所有被冻结的进程,恢复他们的运行状态,并且继续运行原来的任务。


参考链接:

https://blog.csdn.net/rikeyone/article/details/103182748
http://www.wowotech.net/pm_subsystem/237.html

进程冻结和解冻的本质相关推荐

  1. linux解冻用户的密码,linux – 透明地冻结和解冻进程?

    我能够使用这些方向轻松地冻结和解冻单个过程(xeyes): https://www.kernel.org/doc/Documentation/cgroup-v1/freezer-subsystem.t ...

  2. 进程冻结(freezing of task)

    进程冻结(freezing of tasks) 进程冻结是当系统hibernate或者suspend时,对进程进行暂停挂起的一种机制,后面主要以hibernate为例进行介绍.那么为什么要在hiber ...

  3. linux进程冻结,Linux进程冻结技术

    作者:itrocker 发布于:2015-11-24 15:01 1什么是进程冻结 进程冻结技术(freezing of tasks)是指在系统hibernate或者suspend的时候,将用户进程和 ...

  4. linux进程状态a,Linux进程冻结技术

    Linux进程冻结技术 作者:itrocker 发布于:2015-11-24 15:01 分类:电源管理子系统 1什么是进程冻结 进程冻结技术(freezing of tasks)是指在系统hiber ...

  5. object冻结与解冻_脑冻结? 如何用思维导图解冻你的思想

    object冻结与解冻 We've all been stuck. Whether it's when trying to come up with a new design, feeling sta ...

  6. 【Android 逆向】Android 进程代码注入原理 ( 注入本质 | 静态注入和动态注入 | 静态注入两种方式 | 修改动态库重打包 | 修改 /data/app/xx/libs 动态库 )

    文章目录 一.注入本质 二.静态注入和动态注入 三.静态注入两种方式 ( 修改动态库重打包 | 修改 /data/app/packageName/libs/ 下的动态库 ) 一.注入本质 进程注入本质 ...

  7. 防止PayPal帐号冻结和解冻的经验

    根据 维基百科的介绍, PayPal是目前全球最大的在线支付提供商,PayPal在多个国家的业务被视作属于 金钱传送,有不少用者在不知情下被 PayPal冻结账户,账户内的钱也随之被PayPal扣押. ...

  8. PayPal被冻结怎么办?防止PayPal账户冻结和解冻的方法

    PayPal账户被冻结的原因 违反了相关规则,例如销售违禁物品.出售仿牌或者假货.未发货而提现等. ● 侵犯知识产权 PayPal明确禁止出售仿牌或者假货,国外对知识产权的保护非常重视,一旦国际品牌商 ...

  9. 线程操作:冻结与解冻线程

    DWORD WINAPI fun(void *p) {int i = 0;while (++i){printf("\n%d", i);if (i>8000){ExitThre ...

最新文章

  1. 分布式锁的实现方式——ACID数据库、缓存或者是zk
  2. 【转】Mac下安装和配置Redis
  3. spinlock与linux内核调度的关系
  4. mybatis框架--学习笔记(下)
  5. Aptana Studio 3 汉化简体中文版
  6. 1.rabbitmq 集群版安装及使用nginx进行四层负载均衡设置
  7. Android官方开发文档Training系列课程中文版:连接无线设备之通过WIFI创建P2P连接
  8. win7可以运行的mysql,win7下mysql安装
  9. php面向对象魔术方法,PHP面向对象中的魔术方法
  10. python写一个完整的小程序_写一个python小程序
  11. java程序包r不存在_java - 从命令行使用Gradle构建时,“程序包R不存在”错误 - 堆栈内存溢出...
  12. Silverlight Tools 安装失败 解决办法
  13. 于仕琪老师libfacedetection最新开源代码使用测试配置
  14. OS学习笔记-6(清华大学慕课) 非连续内存分配管理
  15. java计算机毕业设计桂林恒保健康防护有限公司官网MyBatis+系统+LW文档+源码+调试部署
  16. 从规范看海洋测绘单验潮站的控制距离
  17. 读书百客:《惜牡丹花二首》鉴赏
  18. Oracle数据库培训视频教程 oracle工程师培训视频教程
  19. 【速记】React解决IE浏览器svg标签不支持innerHTML操作的问题及相关拓展知识
  20. 容天服务器4450系统密码,金铂gob q7-f手机忘记开机密码怎么办

热门文章

  1. MYSQL深度分页的常见优化方案
  2. 有关 :first-child的理解
  3. 计算机网络——万维网WWW
  4. 人工神经网络技术及应用,人工智能神经网络算法
  5. php中rowcount 意思,浅谈PDO的rowCount函数_PHP
  6. win10win7打开软件提示系统资源不足,无法完成请求服务的解决方法
  7. vscode 程序员鼓励师_把软萌程序猿鼓励师装进 VScode 里?GitHub 2.5k 星标,爱上写代码...
  8. 基于GEE平台的植被覆盖度(FVC)像元二分法计算
  9. Python的random函数用法详解
  10. 使用arduino D1 wifi模块(WeMos D1)连接阿里云物联网平台并成功实现APP点亮板载LED(四)---阿里云物联网平台使用基础