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 ...
随机推荐
- php程序出现乱码
// 1, PHP程序中的 中文乱码 // php7.0以下程序,没有默认设定 编码格式 , 需要添加响应头 // header("Conte ...
- vue绑定下拉框 vue修饰符
<select v-model="selected"> <option>请选择</option> <option>HTML</ ...
- gRPC入门学习之旅(十)
gRPC入门学习之旅目录 gRPC入门学习之旅(一) gRPC入门学习之旅(二) gRPC入门学习之旅(三) gRPC入门学习之旅(四) gRPC入门学习之旅(七) gRPC入门学习之旅(九) 3. ...
- 键盘中断,键盘驱动,基于Linux0.11
键盘,咱们做计算机这一行的自然不必多说,天天与它打交道.但熟归熟,清楚键盘背后的原理吗?键盘上都标有各键的名称,表明了各键所代表的意义,但是计算机是如何知道的?组合键是怎样实现的?按下一个代表字符的键 ...
- EF INNER JOIN WHERE ORDER BY
同时使用 join,where,order by. UpdaterDbContext db = new UpdaterDbContext(); // 按 t_server 表的 seq ASC 排序, ...
- iterrows()
iterrows() 是 Pandas 库中 DataFrame 对象的一个方法,它允许你迭代 DataFrame 的行.当你有一个 DataFrame 并且想要逐行访问数据(或者基于每一行的数据做一 ...
- Flink状态(一)
key状态和算子状态 key状态 key状态总是与key有关,只能被用于keyedStream类型的函数与算子.你可以认为key状态是一种被分区的算子状态,每一个key有一个状态分区.每一个key状态 ...
- 带有ttl的Lru在Rust中的实现及源码解析
TTL是Time To Live的缩写,通常意味着元素的生存时间是多长. 应用场景 数据库:在redis中我们最常见的就是缓存我们的数据元素,但是我们又不想其保留太长的时间,因为数据时间越长污染的可能 ...
- ubuntu 18.0.4.6部署k8s 1.24
一.系统安装 https://ubuntu.com/download/server 二.安装containerd sudo su - apt-get remove docker \ docker-cl ...
- [AGC020D] Min Max Repetition
牛子题 优先满足第二个条件,长度是 \(\lceil \frac{max(A,B)}{min(A,B)+1}\rceil\) ,那么现在要满足字典序最小,发现先填 \(A..ABA..ABA..AB. ...