futex转载链接在计算中,futex(“快速用户空间互斥锁”的缩写)是一个Linux内核系统调用,程序员可以使用它来实现基本锁定,或作为更高级别锁定的构建块信号量和POSIX互斥量或条件变量等抽象。futex由一个内核空间等待队列组成,该队列附加到用户空间中的对齐整数。多个进程或线程完全在用户空间中对整数进行操作(使用原子操作以避免相互干扰),并且仅诉诸于相对昂贵的系统调用来请求等待队列上的操作(例如唤醒等待进程,或将等待队列中的当前进程)。一个正确编程的基于futex的锁不会使用系统调用,除非锁被争用;由于大多数操作不需要进程之间的仲裁,因此在大多数情况下不会发生这种情况。背景在传统的Unix系统中,SystemVIPC等进程间同步机制都是对一个该内核对象对所有要同步的进程可见,提供共享状态信息和原子操作。当进程之间的同步必须通过系统调用在内核中完成时。但是经过研究发现,很多同步是非竞争性的,即在一个进程进入互斥量和退出互斥量的这段时间里,往往没有进程也进入互斥量或者请求同一个同步变量.的。但是这样的话,进程也会落入内核,看看有没有人在和它竞争,退出的时候,也会落入内核,看看有没有进程在等待同一个同步变量。这些不必要的系统调用(或内核陷阱)会导致大量的性能开销。简介为了解决这个问题,Futex应运而生。Futex是一种混合了用户态和内核态的同步机制。首先,synchronized进程通过mmap共享一块内存。futex变量位于这个共享内存中,操作是原子的。当进程试图进入或退出互斥量时,它首先检查共享内存。futex变量,如果没有发生竞争,只修改futex,不执行系统调用。当你通过访问futex变量告诉进程存在竞争时,你仍然要执行系统调用来完成相应的处理(等待或唤醒)。简单的说就是在用户态检查futex。知道没有竞争就不用陷入内核,大大提高了低竞争的效率。Futex系统调用Futex是用户态和内核态的混合机制,所以需要两部分共同完成。Linux提供了sys_futex系统调用,为进程竞争情况下的同步处理提供支持。其原型及系统调用号:#include
