earlysuspend、autosleep以及wakeup_count三种休眠机制的分析和比较

一、Opportunistic sleep引言

1. 背景

(1) android 面临的问题

Opportunistic sleep: 当没有任务时,需要寻找时机,进入suspended

(2) 3类同步问题

a. 内核:driver处理event的过程中,系统不能suspend

b. 用户:用户进程处理的过程中系统不能suspend

c. 内核与用户交互:

休眠过程中,触发event, 需abort suspend流程;

event 事件需用户态处理完毕后,才能suspend;

2. earlysuspend

3. autosleep

4. wakeup_count

5. 三种休眠机制的比较

(1)有关earlysuspend的讨论

a. 更改了suspend 流程,引入了earlysuspend 接口;

b. 社区对该patch,有误解,认为其要替代runtime;

c. wakelock 实现过于复杂,名称易造成误解;

d. mini-summit: 有nokia 开发者,缺乏android 开发者,引入了非技术性的讨论;

e. 应该使用pm_runtime, cpuidle; susupend 不应该存在;

f. 唤醒源的处理过程,贯穿整个系统,影响较大;

(2)有关autosleep的讨论

a. android 市场份额越来越大,很多driver src code 脱离了mainline;

b. Linus 认为需要合并android 的特性:suspend block;

c. Rafael J. Wysocki 认为时机已经成熟,提出了新的解决方案;

d. 社区对该opportunisic suspend patch, 有误解,引入了非技术性的讨论:重新设计后,命名为autosleep;

e. 考虑到android 的兼容性,接口上保留了wakelock; 实现上,进行了改进;

(3)有关wakeup_count的讨论

a. 在userspace 基于wakeup_count 实现的 opportunistic sleep 机制;(与autosleep 类似);

b. 内核空间,无wake_lock 概念;

c. 无suspend block 概念;

d. suspend 触发的时机,全部交由用户空间负责;

6. 引入autosleep   |  wakeup count的理由

(1)earlysuspend 被内核抛弃,需自己打补丁;

(2)使用earlysuspend, 对内核改动较大,更改了suspend 流程, 无法合并入mainline;

(3)对设备驱动影响较大,需额外实现earlysuspend 接口,不利于upstream;

(4)earlysuspend 已存在的问题:例如只支持开关屏时执行earlysuspend, 不利于动态功耗的优化;

(5)pm_runtime 已经在display, usb 等设备使用;

(6)upstream 的需求;

二、opportunistic sleep 框架

三、wakeup source 框架

1. 功能

a. 抽象wakeup source和wakeup event的概念;

b. 向各个device driver提供wakeup source的注册、使能等接口;

c. 向各个device driver提供wakeup event的上报、停止等接口;

d. 向上层的PM core(包括wakeup count、auto sleep、suspend、hibernate等模块)提供wakeup event的查询接

口,以判断是否可以suspend、是否需要终止正在进行的suspend;

2. 数据结构

(1)registered wakeup events(cnt)和saved_count;

(2)wakeup events in progress(inpr);

3. 相关接口

四、wakeup count框架

1. 目标

有唤醒事件需处理时:

若系统在运行过程中,不能进入suspend;

若已进入suspend 流程,需及时退出;

2. 接口

a. bool pm_get_wakeup_count(unsigned int *count, bool block);

b. bool pm_save_wakeup_count(unsigned int count);

3. 流程

时间: 2024-08-28 10:11:55

earlysuspend、autosleep以及wakeup_count三种休眠机制的分析和比较的相关文章

Oracle基础学习2--Oracle登录与三种验证机制

首先,Oracle安装完毕有三个默认用户 ?  Sys:数据库对象的拥有者.权限最高.password在安装的时候(口令管理)能够改变 ?  System:数据库管理员,password为manager ?  Scott:一个普通用户,password为tiger 再看连接Oracle的三种验证机制 ?  操作系统验证(具体解释见以下) ?  password文件验证 ?  数据库验证 注:前两者适用于系统用户,比方:Sys.System等:最后一个适用于普通用户.比方:Scott. 再看Ora

Oracle数据库的三种验证机制

关于超级管理员登陆不需要密码因为: 数据库的三种验证机制: 操作系统验证(具有sysdba和sysopera的用户) 密码文件验证(具有sysdba和sysopera的用户) 数据库验证(普通用户) 因为不需要密码是不安全的,所以一般在计算机管理中的用户组ora_dba把Administrator删除,删除之后就要输入密码了. 启动监听:lsnrctl start 查看监听:lsnrctl status 停止监听:lsnrctl stop 1.oracle 数据服务器包括:实例进程和数据库:  

【css笔记】css中的盒模型和三种定位机制(固定定位,绝对定位,浮动)

html页面上的元素都可以看成是框组成的,框通过三种定位机制排列在一起就过程了我们看到的页面.而框就是盒模型. 盒模型 1.页面上的每个元素可以看成一个矩形框,每个框由元素的内容,内边距,边框和外边距组成. 2.如果在元素上添加背景,则背景是边框, 内边距和内容组成的区域. 3.在css中width和height指的是内容区域的宽度和高度.增加内边距,边框和外边距不会影响内容区域的尺寸,但会增加元素框的总尺寸.即width=element 注意:ie的盒模型中,width指的是内容,内边距,和边

gtest 三种事件机制

前言: 1.首先说明gtest中事件的结构层次: 测试程序:一个测试程序只有一个main函数,也可以说是一个可执行程序是一个测试程序.该级别的事件机制会在程序的开始和结束执行. 测试套件:代表一个测试用例的集合体,该级别的事件机制会在整体的测试案例开始可结束执行. 测试用例:该级别的事件机制会在每个测试用例开始和结束都执行. gtest中的事件机制是指在测试前和测试后提供给用户自行添加操作的机制,而且次机制也可用让同一测试套件下的测试用例共享数据. 一.全局的事件机制(针对整个测试程序) 实现全

IO多路复用的几种实现机制的分析

http://blog.csdn.net/zhang_shuai_2011/article/details/7675797 select,poll,epoll都是IO多路复用的机制.所谓I/O多路复用机制,就是说通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步

数据导入HBase最常用的三种方式及实践分析

数据导入HBase最常用的三种方式及实践分析         摘要:要使用Hadoop,需要将现有的各种类型的数据库或数据文件中的数据导入HBase.一般而言,有三种常见方式:使用HBase的API中的Put方法,使用HBase 的bulk load工具和使用定制的MapReduce Job方式.本文均有详细描述. [编者按]要使用Hadoop,数据合并至关重要,HBase应用甚广.一般而言,需要 针对不同情景模式将现有的各种类型的数据库或数据文件中的数据转入至HBase 中.常见方式为:使用H

Mysql Binlog三种格式介绍及分析【转】

一.Mysql Binlog格式介绍       Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在binlog中. 优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能.(相比row能节约多少性能 与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条 件的update操作,以及整表

NET下三种缓存机制(Winform里面的缓存使用 )

原文(http://www.cnblogs.com/wuhuacong/p/3526335.html)非常感谢伍华聪作者的分享! 缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度,同时可以减少对特定资源访问的压力.本文主要针对自己在Winform方面的缓存使用做一个引导性的介绍,希望大家能够从中了解一些缓存的使用场景和使用方法.缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例如数据库),我们一般会考虑将一些更新不是很频繁的,可以重用的数据,通过一

ArrayBlcokingQueue,LinkedBlockingQueue与Disruptor三种队列对比与分析

一.基本介绍 ArrayBlcokingQueue,LinkedBlockingQueue是jdk中内置的阻塞队列,网上对它们的分析已经很多,主要有以下几点: 1.底层实现机制不同,ArrayBlcokingQueue是基于数组的,LinkedBlockingQueue是基于链表的: 2.初始化方式不同,ArrayBlcokingQueue是有界的,初始化时必须指定队列的大小:LinkedBlockingQueue可以是无界的,但如果初始化时指定了队列大小,也可以做为有界队列使用: 3.锁机制实