zoukankan      html  css  js  c++  java
  • Android 中的 wakelock

    1. 内核中相关文件
    kernel/power/wakelock.c //wakelock核心实现
    kernel/power/userwakelock.c //导出用户空间使用的sysfs wakelock接口

    2. Framework中的相关文件
    PowerManagerService.java

    3. /sys/power/wake_lock 和 /sys/power/wake_unlock 是在userwakelock.c中注册的sysfs文件,
    cat wake_lock 显示所有锁住的wakelock的名字,cat wake_unlock是所有未锁住的wakelock的名字。

    hell@tiny4412:/sys/power # cat wake_lock                                      
    PowerManagerService.Display PowerManagerService.WakeLocks noSuspend 
    shell@tiny4412:/sys/power # cat wake_unlock                                    
    KeyEvents 

    4. /proc/wakelocks 文件记录着时间。

    5. 上层PowerManagerService.java中是通过sysfs文件中的wake_lock和wake_unlock来操作驱动的。
    wakelock既可以在用户空间操作(通过sysfs文件中的wake_lock和wake_unlock来操作驱动的),也可以在内核控件操作(直接wake_lock(XXX_lock))。

    6. 可以测试
    Linux系统下:
    # echo mem > /sys/power/state 然后命令行就不响应了,也就是说系统进入了Suspend状态。

    Android下:
    # echo mem > /sys/power/state 命令行照样可以输入,cat /sys/power/wake_lock 显示有wake_lock锁住了。

    7. WakeLock: 挂起流程先进入Idle状态后再进入Suspend状态,而是否由Idle状态进入Suspend状态是由wake_lock的情况决定的。

    8. Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠, 可以被用户态程序获取也可以被和内核获得. 这个锁可以是有超时的
    也可以是没有超时的, 超时的锁会在时间过去以后自动解锁。如果没有锁了或者超时了, 内核就会启动休眠的那套机制来进入休眠.

    9. 有两种机制,第一种是不计数锁机制,另一种是计数锁机制。可以通过 setReferenceCounted(boolean value) 来指定,一般默认为计数机
    制。这两种机制的区别在于,前者无论 acquire() 了多少次,只要通过一次 release()即可解锁。而后者正真解锁是在( --count == 0 )
    的时候,同样当 (count == 0) 的时候才会去申请加锁。

    10. 注意:虽然只有一个wake_lock/wake_unlock文件,但是内核中是使用红黑树维护的所有的wakelock,也就是说wakelock是per模块的,不是
    系统级的。

    11. 根据Android的电源管理原则,只要有一个wakelock锁存在,系统就不会进入Suspend状态。

    12. 对屏幕的操作实际上就是对 /sys/power/state 的操作。写入"mem"表示休眠到内存。但是在Android系统中可能由于加了wakelock锁,其
    实就是关闭了屏幕,而没有让CPU进入Suspend状态。

    13. Linux中 /sys/power/state 文件不可能取值为"on",on表示通过它来唤醒系统。因为系统Suspend后CPU停转了,不可能再相遇控制台了。
    但是Android系统中可能可以,因为有wakelock锁,CPU还可以响应控制台。

  • 相关阅读:
    Java学习第六篇:集合类
    Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题
    Java学习第四篇:数组,排序,查找
    Java学习第三篇:类的三大特征,抽象类,接口,final关键字
    Java学习第二篇:类,对象,成员属性,成员方法,构造方法,类变量,类方法
    Java学习第一篇:变量,数据类型,运算符,流程控制(简介)
    (转)学习使用Jmeter做压力测试(三)--数据库测试
    (转)学习使用Jmeter做压力测试(一)--压力测试基本概念
    Xcode-项目模板修改
    过程式编程 drawShapes
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/10957149.html
Copyright © 2011-2022 走看看