Chinaunix首页 | 论坛 | 博客
  • 博客访问: 20611
  • 博文数量: 10
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-25 22:51
个人简介

Linux内核开发

文章分类

全部博文(10)

文章存档

2016年(2)

2015年(8)

我的朋友
最近访客

分类:

2015-12-05 16:43:29

原文地址:futex介绍 作者:conghonglei

pthread-mutex使用原子操作和futex来实现锁,
使用futex可以使程序等待某个地址的值发生变化,当值发生变化后唤醒等待程序
futex函数定义如下:

#include <linux/futex.h>
#include <sys/time.h>

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

其中uaddr为地址,val为对应期望值,timeout等待时间

在内核中每个futex实际就是一个对齐的物理地址,相同物理地址的futex认为是同一个futex,
可以通过shared-mem利用futex完成进程间同步

其中op值指定了要进行的futex操作:
    FUTEX_WAIT,如果uaddr不为val,等待timeout
    FUTEX_WAKE,唤醒在uaddr上等待的进程,最多唤醒val个进程
    FUTEX_FD,已不支持
    FUTEX_REQUEUE,无用
    FUTEX_CMP_REQUEUE,首先判定uaddr的值是否为val3,如果不是返回EAGAIN
                       然后,唤醒val个在uaddr上等待的进程,
                       再将val2个等待进程转移到对uaddr2的等待上
                        val2 = *((int *)timeout)

可以看出,所有FUTEX_WAKE都可以通过FUTEX_CMP_REQUEUE来实现。

在内核中实现了一个针对于uaddr的hash表,FUTEX_WAIT将task enqueue到hash表中,
FUTEX_CMP_REQUEUE按照uaddr完成对task的dequeue。

kernel/futex.c 中 futex_wait() 实现了对task的enqueue,
futex_requeue()实现了dequeue相关

阅读(605) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~