Android的Futex系统调用
2014-04-30 15:46
281 查看
新书上市《深入解析Android 5.0系统》
以下内容节选自本书
在Linux中,Futex系统调用的定义如下#define __NR_futex 240
1. Futex系统调用的用法为:
int futex (int *uaddr, int op,int val, const struct timespec *timeout,
int *uaddr2, int val3);
uaddr是Futex变量,一个共享的整型计数器。
op表示操作类型,有五种预定义的值,但是在Binoc中只使用了下面两种:
1) FUTEX_WAIT:内核将检查uaddr中计数器的值是否等于val,如果等于则挂起进程,直到在uaddr上到来了FUTEX_WAKE调用或者超时时间到。
2) FUTEX_WAKE:内核唤醒val个等待在uaddr上的进程。
val存放与操作op相关的值。
timeout用作操作FUTEX_WAIT中,表示等待超时时间。
uAddr2和val3很少使用。
2. 在Bionc中,提供了两个函数来包装Futex系统调用。
extern int __futex_wait(volatilevoid *ftx, int val, const struct timespec *timeout);
extern int __futex_wake(volatilevoid *ftx, int count);
Bionc中还有两个类似的函数,它们的原型如下:
extern int __futex_wake_ex(volatile void *ftx, int pshared, intval);
extern int __futex_wait_ex(volatile void *ftx, int pshared, intval,
const struct timespec*timeout);
这两个函数比前面的多了一个参数pshared。pshared的值为true表示wake和wait操作是用于进程间的挂进和唤醒;值为false表示操作用于进程内线程的挂进和唤醒。当pshared的值为false时,执行Futex系统调用的操作码为:
FUTEX_WAIT|FUTEX_PRIVATE_FLAG,
FUTEX_WAKE|FUTEX_PRIVATE_FLAG
这样内核如果检测到操作有FUTEX_PRIVATE_FLAG标记,能以更快的速度执行挂起和唤醒操作。
__futex_wait和__futex_wake函数相当于pshared等于true的情况。
3. Android中有些模块还会使用下面的Futex函数:
extern int__futex_syscall3(volatile void *ftx, int op, int val);
extern int__futex_syscall4(volatile void *ftx, int op, int val,
const struct timespec *timeout);
__futex_syscall3()相当于__futex_wake(),而__futex_syscall4()相当于__futex_wait()。这两个函数与前面的区别是能指定操作码op做为参数。操作码可以是FUTEX_WAIT,FUTEX_WAKE或者它们和FUTEX_PRIVATE_FLAG的组合。
Android中操作码的定义如下:
#define FUTEX_WAIT 0
#define FUTEX_WAKE 1
#ifndefFUTEX_PRIVATE_FLAG
#defineFUTEX_PRIVATE_FLAG 128
#endif
#ifndefFUTEX_WAIT_PRIVATE
#defineFUTEX_WAIT_PRIVATE (FUTEX_WAIT|FUTEX_PRIVATE_FLAG)
#endif
#ifndefFUTEX_WAKE_PRIVATE
#defineFUTEX_WAKE_PRIVATE (FUTEX_WAKE|FUTEX_PRIVATE_FLAG)
#endif
相关文章推荐
- Android学习之调用系统照相机拍照并保存(照片会被压缩)
- Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题
- Android调用系统播放器
- Android调用系统相机与图库
- Android 调用相机以及调用系统图片软件浏览图片
- android调用系统相册选图或相机拍照后对图片进行剪切无内存溢出支持7.0
- android调用系统相机实现拍照功能
- Android调用系统的裁剪后,无法响应onActivityResult()
- Android 调用系统邮件程序发送邮件
- android 中调用系统无法进行裁剪
- Android调用另一个现成的可执行程序或系统命令
- Android调用系统拨号功能
- 【Android N兼容问题】Android N上系统预置应用调用so库失败问题的看法
- Android调用系统相册和系统相机拍照
- android常用的系统调用
- Android调用系统自带的文件管理器进行文件选择
- Android应用开发之调用系统Activity发送短信
- Android调用系统自带的文件管理器进行文件选择并获得路径
- Android开发调用系统的图库
- Android调用系统输入法