【翻译】 一个新的暂停/休眠的基础设施

2023-11-13

LWN订阅者的好处

订阅LWN的主要好处是帮助我们继续出版,但除此之外,订阅者可以立即获得所有的网站内容和获得一些额外的网站功能。 请今天就注册吧!

作者: Jonathan Corbet
2008年3月19日
在参加会议时,你们的编辑多年来一直注意观察有多少其他与会者的笔记本电脑上有某种暂停和恢复功能。 毕竟,能够在演讲厅里坐下来,打开盖子,并立即开始通过IRC对演讲者进行抨击,而不必等待整个启动程序的展开,是有明显价值的。 但是,无论人们谈论的是悬挂到内存("suspend")还是悬挂到磁盘("hibernation"),使用这种功能的人都少得令人吃惊。 尽管开发者和发行商已经做出努力,悬挂和休眠对很多人来说仍然不能可靠地工作。

对你的编辑来说,暂停总是有效的,但恢复操作的成功率大约是95%--刚好够继续使用它,同时在不恰当的地方激发出相当多的亵渎。

已经提出了各种修复挂起和休眠的方法;这些方法包括TuxOnIcekexec jump。 不过,另一种可能性是简单地修复现在内核中的代码。 要使这一目标成为现实,还有很多事情要做,包括使整个过程更加健壮,以及将挂起和休眠的情况分开,正如Linus多次强烈指出的那样,这实际上是两个不同的问题。 为此,Rafael Wysocki发布了一个新的设备暂停和休眠基础设施,有可能改善这种情况--但代价是要创建不少于20个独立的设备回调。

对于(相对)简单的暂停情况,有四个基本的回调,每个总线和最终每个设备都应该在新的pm_ops结构中提供:

    int (*prepare)(struct device *dev); int (*suspend)(struct device *dev); int (*resume)(struct device *dev); void (*complete)(struct device *dev);

当系统正在暂停时,每个设备将首先看到对其prepare()回调的调用。 这个调用可以被看作是一种警告,即暂停即将到来,任何必要的准备工作都应该被完成。 这项工作包括防止添加任何新的子设备和任何可能需要用户空间参与的东西。 任何重要的内存分配也应该在这个时候完成;系统在这个时候仍然是正常的,如果有必要,可以执行I/O以使内存可用。 在prepare()应该发生的是实际将设备放入低功耗状态;它需要保持功能和可用性。

像往常一样,返回值为0表示准备成功,而负的错误代码表示失败。 在失败是暂时的情况下(与添加新的子设备的竞赛是一种可能性),回调应该返回-EAGAIN,这将导致在以后的过程中重复尝试。

在稍后的时间里,suspend()将被调用,以实际关闭设备的电源。 在当前的补丁中,每个设备将看到一个prepare()的调用,然后是suspend()。 未来的版本可能会改变情况,使所有的设备在被暂停之前得到一个prepare()的调用;这样一来,即使是最后的prepare()回调也可以指望一个完全运作的系统的可用性。

resume进程调用resume()来唤醒设备,将其恢复到之前的状态,并使其总体上准备好运行。 一旦恢复过程完成,就会调用complete()来清理prepare()留下的东西。 如果暂停进程在系统的其他地方出现故障,也可以在prepare()之后直接调用complete()(没有中间的暂停)。

休眠过程更加复杂,因为有更多的中间状态。 在这种情况下,该过程也是以调用prepare()开始。 然后调用:

    int (*freeze)(struct device *dev); int (*poweroff)(struct device *dev);

freeze()回调发生在创建休眠镜像(被写入持久性存储的系统镜像)之前;它应该使设备进入静止状态,但使其处于运行状态。 然后,在休眠镜像被保存并再次调用prepare()后,poweroff()被调用以关闭设备。

当系统重新上电时,这个过程通过调用以下程序而被逆转:

    int (*quiesce)(struct device *dev); int (*restore)(struct device *dev);

quiesce()的调用将发生在恢复过程的早期,在休眠镜像从磁盘加载之后,但在它被用来重新创建休眠前系统的内存之前。 这个回调应该使设备安静下来,这样内存就可以被重新组装,而不会被设备操作破坏。 随后将调用complete(),然后调用restore(),这应该使设备恢复到一个完全正常的状态。 最后一个complete()的调用完成了整个过程。

还有两个与休眠相关的回调:

    int (*thaw)(struct device *dev); int (*recover)(struct device *dev);

当事情出错时,这些函数将被调用;再一次,每个调用后都会有一个对complete()的调用。 thaw()的目的是撤销freeze()quiesce()所做的工作;它应该使设备回到工作状态。recover()的调用将在创建休眠镜像失败或从该镜像恢复失败时进行;其工作是清理并使硬件回到工作状态。

为了增加乐趣,实际上有两组pm_ops回调。 显然,在这种环境下,与设备的交互是不同的,所以不同的回调是有意义的。 但结果是,必须为完整的暂停和休眠功能提供整整20个回调。 这些回调已经被添加到bus_type结构中,如下:

    struct pm_ops *pm; struct pm_ops *pm_noirq;

pci_driver结构中也添加了相同名称的字段,允许每个设备驱动程序添加其自身版本的这些回调。 目前,如果没有提供pm_ops结构,并且没有驱动程序被转换,则将使用旧的PCI驱动程序suspend()resume()回调(至少在发布的补丁中)。

截至目前,对该补丁的讨论因vger.kernel.org网站的中断而受阻。 不过也有一些问题,在未来的修订中,事情可能会发生变化。 在其他方面,"无IRQ "回调的数量可能会减少。 但是,如果幸运的话,最终的解决方案会让我们都处于一个暂停和休眠都能可靠工作的位置。

这篇文章的索引条目
内核 设备驱动
内核 电源管理
内核 软件挂起


(登录后可发表评论)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【翻译】 一个新的暂停/休眠的基础设施 的相关文章

  • 【翻译】疫苗正在拯救世界!但内容交付网络首先做到了吗?

    2020年1月 一种激进的公共卫生干预措施被介绍给世界 禁闭 在中国推出它之前 它从未在好莱坞以外的任何地方大规模使用过 没有人相信现实生活中的民众会接受连续几个月被关在家里的情况 即使他们的生命取决于此 与所有的预期相反 禁闭正在控制一种
  • 【翻译】我们建立了一个.NET操作员SDK(所以您不必这样做)。

    我们用C 语言构建了一个 NET操作者SDK 因此您可以用C 或任何 NET语言构建自己的Kubernetes操作者 当然也 有Go Operator SDK 还有我们的Java Operator SDK 那么为什么不为 NET社区提供一些
  • 【翻译】是时候与科技建立更持久的关系了吗?

    当轨道交通时间到来时 你可以进行轨道交通 但不是之前 罗伯特 A 海因莱因 在他的SF小说 通往夏天的门 中 海因莱因认为 对于特定形式的技术变革 时间必须是正确的 在必要的技术和文化基础到位之前 它不会发生 问题是 我们是否已经达到了最终
  • 【翻译】燃烧积压,调整流程

    排列和流动 听起来像Vinyasa瑜伽课 它们真正的内容是管理的趋势 但即使是管理这个词似乎也不对 因为当你在管理对齐和流动时 你是有意放弃你的大部分权力 你走的是仆人式领导的道路 不断寻找方法让你的队友生活更轻松 最大限度地提高流量和一致
  • 沉浸式翻译 安装及使用

    介绍一下最近非常或的沉浸式翻译工具 非常有助于外文阅读 包括网页 pdf等 可以同时显示原文和译文 操作简单 使用起来还是非常友好的 先上链接 介绍 沉浸式翻译 如何使用 沉浸式翻译 1 安装 支持Edge Chrome Firefox和S
  • 【翻译】如何在你的IT转型中浪费数以亿计的资金

    你担任范德雷工业公司的首席执行官已经有几年时间了 这是一家在运输领域存在了几十年的巨无霸 真正的战略 你真的希望股价能尽快上涨 这样你就可以在命运之轮转动之前 在最佳的时间点卖掉你的股票 而董事会也不可避免地要把你赶走 你已经厌倦了蒲公英
  • 【翻译】API版本管理:它是什么,为什么这么难?

    如果你想在API技术专家之间展开一场辩论 只要让他们分享他们对 API版本 的看法 可以肯定的是 你会在短时间内发现一些强烈的感受 术语 API版本 已经成为 改变API 的同义词 这是理清支持已发布的API持续变化而又不给API消费者带来
  • 冰羚中间件 RouDi usage-guide.md翻译

    内容 内容 配置RouDi Configuring RouDi RouDi可以支持读取从一个配置文件中读取mempool config 如果需要支持这个特性 CMake的编译选项中需要使用 DTOML CONFIG on mempool c
  • 抱抱脸(hugging face)教程-中文翻译-分享一个模型

    分享一个模型 最后两个教程展示了如何使用 PyTorch Keras 和 Accelerate 优化分布式设置的模型 下一步就是把你的模型公之于众 我们相信公开分享知识和资源 使人工智能大众化 我们鼓励你考虑与社区分享你的模式 以帮助其他人
  • 各国语言对应翻译表

    为了工作方便 自己做了一个地区语言的英文翻译 让自己可以更快的找到自己需要的地方 同时 分享给大家 谢谢 中文 各国语言 翻译 序号 中文 翻译 1 阿尔巴尼亚语 2 阿拉伯语 3 阿姆哈拉语 4 阿塞拜疆语 Az rbaycan 5 爱尔
  • 【ES实战】Search的滚动查询(Scroll)

    滚动查询 Scroll 虽然搜索请求返回结果是单个 页面 但scroll API 可用于从单个搜索请求中检索大量结果 甚至所有结果 其方式与在传统数据库使用相似 scrolling不是用于实时用户请求 而是用于处理大量数据 例如 为了将一个
  • 人工智能革命:超级智能之路(上)

    这篇文章翻译于Tim Urban大神的 The AI Revolution 的系列文章 下面让我们一起领略一下Tim Urban大神理解的人工智能革命是怎样的吧 文章目录 遥远的未来 即将到来 超级智能之路 人工智能 我们目前在哪里 一个在
  • 【翻译】我们能从英国教育考试院的算法失败中学到什么?

    如果你想找一个表面上聪明的人是如何不小心把别人的生活搞得一团糟的例子 那就看看去年英国公开考试的情况吧 简而言之 政府认识到科维德 19的威胁 取消了英国学生的公开考试 在寻求另一种评分方法时 政府及其教育监管机构可以说是由于无知或选择而违
  • 【翻译】 2.6 中的 4K 堆栈 [发布于 2004 年 5 月 12 日,作者:corbet

    传统上 Linux 内核在大多数架构上都使用 8KB 内核堆栈 该堆栈必须满足系统调用可能产生的任何调用序列 以及可能同时调用的任何 硬或软 中断处理程序的需要 实际上 在稳定的内核中 堆栈溢出的情况几乎闻所未闻 内核开发人员早已学会避免使
  • 【翻译】白人男性在改善性别多样性方面的作用是什么?

    我们都知道 或者说现在应该知道 多元化的团队和组织更成功 更有创造力 有更好的留任率 并能带来更健康的工作场所文化 强调这些观点的数据是很多的 然而 技术团队在这方面往往是落后的 艾米丽 张在她的书 Brotopia 中认为 在一个如此有力
  • 【翻译】Dart和Flutter是什么?

    Dart是在Go之后从谷歌出现的 最近作为Flutter跨平台前端框架背后的语言 其受欢迎程度激增 这对那些对云原生基础设施感兴趣的人来说很重要 因为有一种对 全栈Dart 的推动 Flutter开发者可以使用相同的语言来构建他们应用程序背
  • Intent中addFlags()和SetFlags()的区别和详解

    两个方法的区别是setflag是直接给intent设置新的flag addflag是在已有flag上添加新的flag Public Intent addFlags int flags 增加额外的标志到Intent 或者已经存在的flags值
  • 【翻译】#拥抱行动和心理安全--思考根本原因而非根本人物

    本杰明 富兰克林曾经说过 生命中唯一的两个确定性是死亡和税收 但是 如果他是一名工程师 他可能会在这个名单上加上另一个 即故障 脸书的工程师们无疑会同意最近的故障 似乎是由于运行一个命令 无意中关闭了他们骨干网络的所有连接 不仅关闭了脸书
  • Qt多国语言动态切换(含源代码)

    Qt中文国际化 含高阶做法 作者 melon 日期 2019 7 15 1 国际化需要用到的工具 lrelease exe lupdate exe linguist exe 非必须 这些工具在Qt5 12 2的bin文件夹都可以找到 lup
  • 5款最好的开源用户关系管理工具

    5款最好的开源用户关系管理工具 by Scott Nesbitt 原文链接 http opensource com business 14 7 top 5 open source crm tools 创造和维系与客户的关系不是容易的事 然而

随机推荐

  • 25_Vue3路由-VueRouter的基本使用及动态路由和路由嵌套

    Vue3路由之Vue router的基本使用及路由嵌套和动态路由 认识前端路由 路由其实是网络工程中的一个术语 在架构一个网络时 非常重要的两个设备就是路由器和交换机 当然 目前在我们生活中路由器也是越来越被大家所熟知 因为我们生活中都会用
  • 代理模式 与装饰模式的区别 干货

    装饰器模式关注于在一个对象上动态的添加方法 然而代理模式关注于控制对对象的访问 换句话 说 用代理模式 代理类 proxy class 可以对它的客户隐藏一个对象的具体信息 因此 当使用代理模式的时候 我们常常在一个代理类中创建一个对象的实
  • 关于机器学习中查准率与查全率(召回率)矛盾关系的探讨

    昨天和舍友讨论查准率和查全率 很多资料中指出之所以需要F1值的原因在于准确率与召回率的关系是矛盾的 即查准率高的查全率低 查全率高的查准率低 因此需要F1值综合度量 但关于为什么两者的关系是矛盾的 一直不太理解 现在看过帖子后总结一些想法
  • ERROR: The install method you used for conda--probably either `pip install conda` or `e

    TOCERROR The install method you used for conda probably either pip install conda or easy install conda is not compatible
  • MySQL安装(全网最全最详细教程)

    目录 1 MySQL的卸载 1 1 停止MySQL服务 1 2 软件的卸载 2 MySQL的下载 安装 配置 2 1 MySQL的4大版本 2 2 软件的下载 2 3 软件的安装 2 4 软件的配置 3 多版本mysql同时安装 4 安装过
  • 西门子PLC全系列模块接线

    https www siemensplc com biancheng 10649 html
  • 最燃黑客情报官薛锋:端起AK伏特加,代表人民把坏人抓

    文 史中 一 情报专家从未凋零真相并不总是像女神一样遥不可及 在二战最为焦灼的时候 盟军迫切地想知道一件事情 德国人究竟有多少坦克 于是他们派出间谍 破译电报 对德国俘虏刑讯逼供 得出的结论是 德国每个月可以生产1000多辆坦克 可是好像哪
  • 用echo输出多个空行

    大家用shell编程 用echo输出空行的时候 通常想到就是用N个echo 如下输出三个空行 echo echo echo 虽然内心里还是觉得如上写法有些丑陋 其实 echo是还有更多用法的 这在手册里面是有说明的 通过查看手册 我们可以知
  • 深度学习系列资料总结

    作者简介 CSDN 阿里云人工智能领域博客专家 新星计划计算机视觉导师 百度飞桨PPDE 专注大数据与AI知识分享 公众号 GoAI的学习小屋 免费分享书籍 简历 导图等 更有交流群分享宝藏资料 关注公众号回复 加群 或 链接 加群 专栏推
  • opencv学习笔记

    include quickdemo h include shuzu h include
  • Flask数据库

    文章目录 一 ORM 1 1 什么是ORM 1 2 ORM的优缺点有哪些 1 3 Flask SQLAlchemy安装及设置 1 4 其他配置信息 1 5 常用的SQLAlchemy字段类型 1 6常用的SQLAlchemy列选项 常用的S
  • java docker nacos 9848端口报错

    问题 9848报错 新版本部署 Nacos2 0版本相比1 X新增了gRPC的通信方式 因此需要增加2个端口 新增端口是在配置的主端口 server port 基础上 进行一定偏移量自动生成 端口 与主端口的偏移量 描述 9848 1000
  • 【PTA】矩阵列平移

    给定一个 n n 的整数矩阵 对任一给定的正整数 k
  • python安装及配置

    1 python的下载及安装 1 1下载 从官网下载 https www python org 如图 点击downloads按钮 在下拉框中选择系统类型 windows Mac OS Linux等 选然后择下载最新版本的Python 1 2
  • JavaArrayList集合基础&学生管理系统

    1 ArrayList 集合和数组的区别 共同点 都是存储数据的容器 不同点 数组的容量是固定的 集合的容量是可变的 1 1 ArrayList的构造方法和添加方法 public ArrayList 创建一个空的集合对象 public bo
  • 爬虫:你一定要知道的模板(附源码)

    爬虫 你一定要知道的模板 附源码 作为一名cv程序员 梦想是造飞机 现实是拧螺丝 普通的爬虫 无非就是固定的模板 xpath bs定位标签 axios返回数据 json解析 selenium json解析版 import requests
  • chatgpt赋能python:Python和数学建模:如何参与数学建模比赛

    Python和数学建模 如何参与数学建模比赛 介绍 数学建模比赛通常是学术界和工业界一起组织的比赛 旨在让学生掌握实际问题的建模方法以及如何处理数据 分析和解决实际问题 Python是一个流行的编程语言 广泛应用于数据科学和数学建模领域 因
  • 单链表中求中间节点

    问题描述 求单链表中间节点的值 如果中间有2个 只要第一个 就是偶数情况下 只要中间的第一个 速度要快 解决方法 可以参照这篇博文 http blog csdn net dawn after dark article details 736
  • PHP与MySQL程序设计 学习笔记 第十章 处理文件和操作系统

    获取路径的文件名部分 不管文件系统中是否存在该路径 可选参数suffix指定一个后缀名 使返回的文件名忽略该后缀 path usr local text txt print basename path n 输出text txt print
  • 【翻译】 一个新的暂停/休眠的基础设施

    LWN订阅者的好处订阅LWN的主要好处是帮助我们继续出版 但除此之外 订阅者可以立即获得所有的网站内容和获得一些额外的网站功能 请今天就注册吧 作者 Jonathan Corbet 2008年3月19日 在参加会议时 你们的编辑多年来一直注