Android低功耗子系统的投票机制以及触发进入系统休眠的过程
从kernel角度看,系统是否进入休眠应该由内核来控制,因此Linux引入了 wakeup source以及autosleep机制

- 关于wakeup source的介绍,请参考: Wakeup Source框架设计与实现
- 关于autosleep机制,请参考:autosleep框架设计与实现
在内核中,使用wakeup source提供投票机制,让各个系统模块投票是否允许系统进入休眠,当所有的模块都投票允许系统进入休眠时,autosleep机制检测到这一情况,尝试让系统进入休眠。
从Android角度看,系统是否进入休眠应该由上层应用决定,因此Android引入了Wakelocks以及SystemSuspend service

- 关于wakelocks的介绍,请参考:Wakelocks 框架设计与实现
- 关于 SystemSuspend Service,可参考:SystemSuspend 服务
- 代码路径:system/hardware/interfaces/suspend/1.0/default/
- 该服务创建了两个线程:
- 主线程:响应来自Client的请求以分配wakelock, 增加/减少 suspend counter
- 挂起线程:控制系统的休眠,判断系统是否符合进入休眠的条件(在framework中的PowerManagerService.java会根据一些事件,比如息屏亮屏,动态开关autosuspend,从而动态开启/结束该挂起线程)

挂起线程的实现与autosleep的流程类似(但需要与主线程处理好suspend counter的同步问题),其伪代码可以参考如下:
while (1) {
do {
ret = read(&cnt, "/sys/power/wakeup_count"); //一般会阻塞在此处,直到cnt为0
if (ret) {
ret = write(cnt, "/sys/power/wakeup_count");
} else {
countine;
}
} while (!ret); write("mem", "/sys/power/state"); /* goto here after wakeup */
......
}
在Android应用层面上,使用wakelocks提供投票机制,让各个系统模块投票是否允许系统进入休眠,当所有的模块都投票允许系统进入休眠且PowerManagerService使能autosuspend时,SystemSuspend service中的挂起线程检测到这一情况,会尝试让系统进入休眠。
因Android提供了SystemSuspend service,因此autosleep机制一般不再使用,
但对于纯Linux系统,一般会使用autosleep机制来检测系统是否应尝试进入休眠。
关于Android低功耗子系统的投票机制以及触发进入系统休眠的过程,强烈建议在有此基础概念的基础上,拜读下面的文章,了解这些机制的发展过程,加深对这部分内容的理解:
- Linux电源管理(7)_Wakeup events framework
- Linux电源管理(8)_Wakeup count功能
- Linux电源管理(9)_wakelocks
- Linux电源管理(10)_autosleep
Android低功耗子系统的投票机制以及触发进入系统休眠的过程的更多相关文章
- 通俗理解Android事件分发与消费机制
深入:Android Touch事件传递机制全面解析(从WMS到View树) 通俗理解Android事件分发与消费机制 说起Android滑动冲突,是个很常见的场景,比如SliddingMenu与Li ...
- 【Android】Android输入子系统
成鹏致远 | lcw.cnblogs.com | 2013-10-25 Linux输入子系统回顾 1:为什么要回顾linux输入子系统?这个问题后面自然就知道了 1.linux输入子系统设备是基于平台 ...
- Android中的常见通信机制和Linux中的通信机制
Handler Handler是Android系统中的一种消息传递机制,起作用是应对多线程场景.将A进程的消息传递给B线程,实现异步消息处理.很多情况是将工作线程中需要更新UI的操作消息传递给UI主线 ...
- Linux/Android——input子系统核心 (三)【转】
本文转载自:http://blog.csdn.net/jscese/article/details/42123673 之前的博客有涉及到linux的input子系统,这里学习记录一下input模块. ...
- 【Android】Android输入子系统【转】
本文转载自:https://www.cnblogs.com/lcw/p/3506110.html Linux输入子系统回顾 1:为什么要回顾linux输入子系统?这个问题后面自然就知道了 1.linu ...
- Android中的事件分发机制
Android中的事件分发机制 作者:丁明祥 邮箱:2780087178@qq.com 这篇文章这周之内尽量写完 参考资料: Android事件分发机制完全解析,带你从源码的角度彻底理解(上) And ...
- Android 为什么要有handler机制?handler机制的原理
为什么要有handler机制? 在Android的UI开发中,我们经常会使用Handler来控制主UI程序的界面变化.有关Handler的作用,我们总结为:与其他线程协同工作,接收其他线程的消息并通过 ...
- Android消息传递之Handler消息机制
前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...
- [转载] Android动态加载Dex机制解析
本文转载自: http://blog.csdn.net/wy353208214/article/details/50859422 1.什么是类加载器? 类加载器(class loader)是 Java ...
- 九、Android学习第八天——广播机制与WIFI网络操作(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 九.Android学习第八天——广播机制与WIFI网络操作 今天熟悉了An ...
随机推荐
- 代码界的超级英雄:GitHub的奇幻冒险之旅
GitHub简介 GitHub是一个用于代码托管.版本控制和协作开发的平台.它于2008年2月8日由Chris Wanstrath.PJ Hyett和Tom Preston-Werner创立,目前由微 ...
- 微信小程序设置swiper圆角在ios上失效
今天在给轮播图添加圆角的时候,发现在安卓机上是有圆角的,但是在苹果手机上圆角却失效了,后来翻阅了文档发现这是个官方的bug 解决方法1 border-radius: 20rpx; /*再设置个tran ...
- margin的用法 清除默认样式 display属性值 块状元素 内联元素 行内块元素
margin的用法: 1,margin是在元素的宽高以外的 2,作用:控制元素之间的位置关系 3,margin不能改变盒子本身大小的 4,单一一个方向设置margin值: margin-left ...
- CF1777E
problem & blog 反转的边最大权值最小,想到二分. 于是二分代价即可. 反转代价小于二分的代价的边可以反转,所以再建一条反向边即可. 在 DAG 中,存在一个点可以到达所有的点的条 ...
- java springboot 指定运行端口
java springboot 指定运行端口 方法1: 修改源代码里的"\src\main\resources\application.properties" 文件,增加或修改 s ...
- 使用优启通 制作 WIN PE U盘时报BOOT.WIM 有毒的解决方法
使用优启通 制作 WIN PE U盘时报BOOT.WIM 有毒的解决方法 1.打开"Windows Defender". 2.点击"病毒和威胁防护". 3.点击 ...
- WIN11 WINDOWS 11 INTEL 12-13代大小核默认调度策略
WIN11 WINDOWS 11 INTEL 12-13代大小核默认调度策略 生效的异类策略:使用异类策略0. 异类线程调度策略:自动. 异类短运行线程调度策略:自动.
- 使用edge浏览器时,怎么让alt+tab不切换他的子标签页而只在程序间切换?
使用搜索按钮(WIN+Q),搜索"多任务设置",在弹出的窗口中看到"alt+tab"相关设置.选择"仅打开的窗口",ok搞定.
- 《Android开发卷——ListView嵌套GridView(基础)》
listview嵌套gridview,最主要应该解决的问题是listview跟GridView的滑动问题.这个利用GridView是自定义的,就是让GridView内容有多大就显示多大,然后禁用他 ...
- CM 停用 Parcel 异常
在将Doris集成到CM时,第一次打的包存在问题,想更新下,停用.删除Parcel时出现了问题卡住了,一直显示75%.无奈换了名称和版本,分配.激活,然后又卡在了75%,点开后,发现是同一台机器.其a ...