加载中…
个人资料
行者无疆-超越
行者无疆-超越
  • 博客等级:
  • 博客积分:0
  • 博客访问:23,328
  • 关注人气:1
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
正文 字体大小:

Android Futex系统调用

(2014-04-23 19:50:52)
标签:

android

futex

it

分类: Android的同步和消息

 

Linux中,Futex系统调用的定义如下

#define __NR_futex              240

1.        Futex系统调用的用法为:

int futex (int *uaddr, int op, int val, const struct timespec *timeout,

int *uaddr2, int val3);

uaddrFutex变量,一个共享的整型计数器。

op表示操作类型,有五种预定义的值,但是在Binoc中只使用了下面两种:

1)        FUTEX_WAIT: 内核将检查uaddr中计数器的值是否等于val,如果等于则挂起进程,直到在uaddr上到来了FUTEX_WAKE调用或者超时时间到。

2)        FUTEX_WAKE: 内核唤醒val个等待在uaddr上的进程。

val存放与操作op相关的值。

timeout用作操作FUTEX_WAIT中,表示等待超时时间。

uAddr2val3很少使用。

2.        Bionc中,提供了两个函数来包装Futex系统调用。

extern int __futex_wait(volatile void *ftx, int val, const struct timespec *timeout);

extern int __futex_wake(volatile void *ftx, int count);

Bionc中还有两个类似的函数,它们的原型如下:

extern int  __futex_wake_ex(volatile void *ftx, int pshared, int val);

extern int  __futex_wait_ex(volatile void *ftx, int pshared, int val,

const struct timespec *timeout);

这两个函数比前面的多了一个参数psharedpshared的值为true表示wakewait操作是用于进程间的挂进和唤醒;值为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_WAITFUTEX_WAKE或者它们和FUTEX_PRIVATE_FLAG的组合。

Android中操作码的定义如下:

#define FUTEX_WAIT         0

#define FUTEX_WAKE         1

 

#ifndef FUTEX_PRIVATE_FLAG

#define FUTEX_PRIVATE_FLAG  128

#endif

 

#ifndef FUTEX_WAIT_PRIVATE

#define FUTEX_WAIT_PRIVATE  (FUTEX_WAIT|FUTEX_PRIVATE_FLAG)

#endif

 

#ifndef FUTEX_WAKE_PRIVATE

#define FUTEX_WAKE_PRIVATE  (FUTEX_WAKE|FUTEX_PRIVATE_FLAG)

#endif

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有