Linux电源管理研究笔记—gnomepowermanager的工作原理

摘要:
通过暂停不必要的设备、降低CPU频率或其他方法,gnome电源管理器的名称意味着它是与电源管理相关的最重要的应用程序之一。我们可以更好地理解应用程序和底层电源管理服务之间的交互。这包括显示器/计算机进入睡眠状态的时间、显示器的亮度以及笔记本电脑关闭时的动作。此接口提供基本的电源管理功能。gnome电源管理器是普通应用程序应该调用的接口。

Linux电源管理研究笔记—gnome-power-manager的工作原理

 

转载时请注明出处:http://blog.csdn.net/absurd/

 

在手持设备设计中,电源管理历来为重要的研究课题之一。我们日常所说的省电就属于电源管理的范畴,这也是我们最关心的一个部分。通过挂起不必要的设备、降低CPU的频率或者其它方法,可以减少能量的消耗,达到省电的目的。电源管理实际上是一个系统工程,从应用程序到内核框架,再到设备驱动和硬件设备,都要参与进来,才能达到电源管理的最优化。本文介绍一下gnome-power-manager的工作原理。

 

为什么要研究gnome-power-manager呢?我们说过,电源管理是一个系统工程,不但与内核有关,与应用程序也有很大关系,而gnome-power-manager其名称就暗示了它是与电源管理关系最大的应用程序之一。研究gnome-power-manager的工作原理,我们可以更好的理解应用程序与底层电源管理服务之间的交互关系。

 

gnome-power-manager具有哪些功能呢?从官方网站上我们可以看到:

1.         电源状态。

 Linux电源管理研究笔记—gnomepowermanager的工作原理第1张

2.         电源管理。

   Linux电源管理研究笔记—gnomepowermanager的工作原理第2张

3.         设置电源选项。

交流电源选项:其中包括显示器/计算机进入休眠的时间、显示器的亮度和笔记本合上时的动作。

Linux电源管理研究笔记—gnomepowermanager的工作原理第3张

电池电源选项:其中包括显示器/计算机进入休眠的时间、显示器的亮度和笔记本合上时的动作。

Linux电源管理研究笔记—gnomepowermanager的工作原理第4张

常用选项:休眠的类型和panel上的通知区的行为。

Linux电源管理研究笔记—gnomepowermanager的工作原理第5张

 

通过以上几幅图片,我们已经了解到gnome-power-manager的基本功能,但这些功能都是从用户角度来看的。下面我们再从程序内部来看看,在gnome-power-manager的代码中,有一个名为gpm-manager.xml的文件,从其内容我们知道这是一个dbus服务对象接口定义,它实现了一个org.gnome.PowerManager接口,这个接口提供了基本的电源管理功能。在acpid一文中,我们说过acpid是内核与应用程序之间的接口,但是acpid对普通应用程序来说还是过于底层,而gnome-power-manager才是普通应用程序应该调用的接口。

 

gpm-manager.xml中定义的主要接口有:

1.         GetLowPowerMode 是否使用了低耗能模式。

2.         GetOnAc 是否使用的交流电源。

3.         AllowedSuspend 能否挂起。

4.         AllowedHibernate 能否睡眠。

5.         AllowedShutdown 能否关机。

6.         AllowedReboot 能否重起。

7.         Hibernate 睡眠

8.         Suspend 挂起

9.         Shutdown 关机

10.     Reboot 重起

11.     GetDpmsMode 得到显示器电源管理模式。

12.     SetDpmsMode 设置显示器电源管理模式。

13.     Inhibit 禁用电源管理功能。比如文件管理在拷贝文件时,为了防止系统在此时挂起或者睡眠,可以暂时禁用电源管理,直到拷贝完成。

14.     UnInhibit 恢复电源管理功能。

 

下面我们再看以上这些函数的实现方式,这才是我真正关心的。

1.         GetLowPowerMode

这个函数实现很简单,只是一项简单的配置信息,通过gconf_client_get_bool获取GPM_PREF_AC_LOWPOWER或者GPM_PREF_BATTERY_LOWPOWER,这取决于当前的电源类型。

 

2.         GetOnAc

通过向hal服务进程发送FindDeviceByCapability请求,可以得到是否支持交流电源的属性。然后发送GetPropertyBoolean(ac_adapter.present) 请求,可以得到交流电源是否存在。

 

3.         AllowedSuspend

4.         AllowedHibernate

以上函数都是通过向hal服务进程发送GetPropertyBoolean请求,得到对应的属性值。

 

5.         AllowedShutdown

6.         AllowedReboot

以上函数都是通过向hal服务进程发送IsUserPrivileged请求,查看当前用户是否具有权限决定。

 

7.         Hibernate 睡眠

8.         Suspend 挂起

9.         Shutdown 关机

10.     Reboot 重起

以上函数都是通过向hal服务进程发送相应请求来实现。请求分别为HibernateSuspendShutdownReboot

 

11.     GetDpmsMode 得到显示器电源管理模式。

12.     SetDpmsMode 设置显示器电源管理模式。

以上函数都是通过X11DPMS扩展实现的。当然X11只是封装了DPMS功能,真正的实现是在内核的显示驱动程序里。DPMS比较重要,因为显示设备通常是耗电大户,如果可能的话,我们会用专门一章来讲解。

 

13.     Inhibit

14.     UnInhibit

这两个函数的实现很简单:Inhibit把应用程序的dbus-connection(标识发送请求的应用程序)加入到一个链表中。UnInhibit则从该链表中删除应用程序的dbus-connection。如果该链表不为空,则禁用电源管理功能。

 

综上所述,gnome-power-manager即是一个直接面对最终用户的应用程序,也是一个中间层。作为中间层,它把halx11提供的底层细节封装起来了,同时为其它应用程序提供了更高层的服务接口。

 

~~end~

 

 

 

免责声明:文章转载自《Linux电源管理研究笔记—gnomepowermanager的工作原理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇macOS 系统更新node老是不成功HDOJ 1166 敌兵布阵树状数组 线段树下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Oracle时间运算 (转)

转自: http://www.cnblogs.com/raymond19840709/archive/2009/03/26/1422037.html#part4 目录=========================================1.Oracle的日期函数2.日期加减3.月份加减4.年份加减5.求每月的最后一天6.求每月的第一天7.求下一...

NOIP比赛写代码注意事项

1.头文件:   常用头文件:      <iostream>      <cstdio>      <cmath>      <cstring>      <cstdlib>      cstdio包含scanf和printf,有的编译器iostream都包含了,都写上比较好一般写代码时先都把这...

【java】Java组件概览(2)— 基本库

1、Math Math相关的库包括包括浮点库(java.lang.Math和java.lang.StrictMath)和任意精度数学(java.math包)。 (1)java.lang.Math   该类包含执行基本数值运算的方法,如基本指数、对数、平方根、三角函数、弧度/角度、四舍五入以及最大、最小和绝对值。 另外,还有两个常量无理数E(e)和PI(π)...

Web项目开发中常见安全问题及防范

计算机程序主要就是输入数据 经过处理之后 输出结果,安全问题由此产生,凡是有输入的地方都可能带来安全风险。根据输入的数据类型,Web应用主要有数值型、字符型、文件型。 要消除风险就要对输入的数据进行检查,对于Web应用来说,检查的位置主要是前端和后端。前端检查只能防止正常状况,没法防止通过工具、程序绕开前端检查直接把数据发送给后端。 输入检查 防止输入注入...

关于 SetProcessWorkingSetSize 和内存释放

在应用程序中,往往为了释放内存等,使用一些函数,其实,对于内存操作函数要谨慎使用,比如大家常常想到的 SetProcessWorkingSetSize,其实对于windows来说,系统会自动在程序闲置时(如程序被最小化)释放内存的,自己用内存释放 时,往往会造成一些莫名的内存错误,造成自己的应用程序及系统不稳定。 具体原理有人已经写得很清楚了,以下为转帖的...

eslint在webstorm中有错误警告

1. 报错Missing space before function parentheses的问题   解决:在代码目录中,打开.eslint文件,并在rules中添加如下一行代码即可:      "space-before-function-paren": 0 2. 报错eslint: missing semicolon   解决:在rules中添加  ...