Linux的新式线程同步原语——Futex
在我的上一篇文章《本地POSIX线程库》中,提到了Futex一词,发现好多读者误以为这是我的笔误,将Mutex错写为Futex了。其实Futex是Linux的一种全新的线程同步原语。本文将为您解读高效的Futex。
Futex是fast userspace mutex的缩写,意思是快速用户空间互斥体。Linux内核把它们作为快速的用户空间的锁和信号量的预制构件提供给开发者。Futex非常基础,借助其自身的优异性能,构建更高级别的锁的抽象,如POSIX互斥体。大多数程序员并不需要直接使用Futex,它一般用来实现像NPTL这样的系统库。
Futex其实就是可以由不同进程所共享使用的一块内存。在这些进程中,并不需要有相同的地址。一个光秃秃的Futex,与信号量的语义是相同的;它有一个可以被原子增减的计数器;进程可以等待这个计数器值变为正数。
Futex的操作完全是在用户空间,不需要进行上下文切换。内核仅在发生竞争的时候作一个公断。它的本质结构是一个对齐的整数,仅由原子的汇编指令操作。进程们可以通过mmap,在共享段中访问它,或许是由于进程们共享了内存空间,通常就把这样的应用程序称为多线程程序。
任何Futex的操作都起始于用户空间,但是在必要的时候还是需要使用某些系统调用与内核通讯的。
要“up”一个Futex,需执行正确的汇编指令使主CPU原子的递增这个整数。然后,检查它是否已从0变为1,这说明没有等待进程,操作完成。这是无竞争情况,这很快而且应该很普遍。
在竞争情况下,原子增量从-1(或者是其他的负数)开始变化。如果是这样的话,说明有等待进程。用户空间应立即将计数器设置为1,并通知内核唤醒那些正使用FUTEX_WAKE操作的等待进程。
正等待一个Futex时,“down”它是一个相反的操作。原子递减这个计数器,并检查它是否变为0,使操作完成,Futex无竞争。在所有其他的情况下,进程会设置计数器为-1,并请求内核等待其他进程“up”Futex。这是通过FUTEX_WAIT操作完成的。
Futex是由Hubertus Franke(IBM Thomas J. Watson研究中心),Matthew Kirkwood,Ingo Molnar (Red Hat)和Rusty Russell (IBM Linux科技中心)设计并维护的。最初的Futex的支持是从Linux2.5.7开始的,但是以上述语义有些不同。当前的语义是从Linux2.5.40获得的,在Linux2.5.70至2.6.7,已经可以获得更多的附加功能了。
分享到:
相关推荐
一般说,同步机构是由若干条原语——同步原语——所组成。本实验要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。 三. 实验题目 模拟PV操作同步机构,且用PV操作解决...
掌握两种基本的同步原语就可以满足各种多线程同步的功能需求,还能写出更易用的同步设施。掌握一种进程间通信方式和一种多线程网络编程模型就足以应对日常开发任务,编写运行于公司内网环境的分布式服务统。
一、实习内容 模拟实现用同步机构避免发生进程执行时...一般说,同步机构是由若干条原语——同步原语——所组成。本实习要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。
掌握两种基本的同步原语就可以满足各种多线程同步的功能需求,还能写出更易用的同步设施。掌握一种进程间通信方式和一种多线程网络编程模型就足以应对日常开发任务,编写运行于公司内网环境的分布式服务系统。
掌握两种基本的同步原语就可以满足各种多线程同步的功能需求,还能写出更易用的同步设施。掌握一种进程间通信方式和一种多线程网络编程模型就足以应对日常开发任务,编写运行于公司内网环境的分布式服务系统。
JVM同步原语 volatile CAS 线程安全 保护“共享数据” 低级并发工具 原子变量 锁(内部锁和显式锁) 线程安全容器 同步容器 并发容器 阻塞队列 高级线程协作工具 信号量 闭锁 关卡 ...
高可移植的C系统库:线程和同步原语,套接字(TCP,UDP,SCTP),IPv4和IPv6,IPC,散列函数(MD5,SHA-1,SHA-2,SHA-3,GOST),二进制树 ,AVL)等等。 本地代码性能。
cpp11-on-multicore, 在C 11中,多线程应用程序的各种同步原语 C 11中多线程应用程序的各种同步原语。在博客文章中,信号量是令人惊讶的。代码是在许可协议下发布的。 查看 LICENSE 文件。如何构建测试首先,你必须...
英文版ARM公司技术资料,讲述ARMv6的同步原语以及如何在ARMv5之前的CPU上通过 SWP 和 SWPB 指令实现同步。
ecos系统同步原语, 包含互斥,信号量, 信箱, 事件, Spinlock ,条件变量。
多线程leetcode 同步 更高级的同步原语。 实现了一些 Go 同步原语。 令牌 提供令牌实现。 只有拥有Token才能做事,然后才能将令牌移交给其他人。 批 提供批量实现。 类似于errgroup ,可以返回每个任务的所有错误...
threading 模块提供的线程同步原语包括:Lock、RLock、Condition、Event、Semaphore等对象。 线程执行 join与setDaemon 子线程在主线程运行结束后,会继续执行完,如果给子线程设置为守护线程(setDaemon=True),...
详细介绍了ARM架构上的硬件同步原语,并介绍了LDREX/STREX指令实现同步操作的原理和具体实现
进程同步是操作系统学习过程中非常重要的一部分内容,同时也非常困难,在学习了互斥锁、信号量及管程等原语后,其问题原理能够理解,但是实践中遇到相同问题时却无从下手,不能学以致用。本实验的目的是在理解了课本...
Futex:一种特定于Linux的快速用户空间锁定原语。 此板条箱为不太容易使用的SYS_futex Linux syscall提供了易于使用的包装器。 可以在找到Linux futex的文档。 最重要的细节也在该箱子的文档中进行了说明。 此...
关于信号量的文章,生产者消费者问题与读者写者问题---信号量机制,PV操作——进程同步的信号量问题,利用信号机制实现的 父子进程同步,嵌入式linux的学习笔记-进程间通信的信号与信号集(四)1)进程的同步与互斥 ...
fifolock 一个灵活的低级工具,用于在asyncio Python中创建同步原语
许多线程同步原语的异步版本 AsyncAutoResetEvent AsyncBarrier AsyncCountdownEvent AsyncManualResetEvent AsyncReaderWriterLock AsyncSemaphore ReentrantSemaphore 非常常见类型的异步版本 ...
在x86_64 Linux上进行测试时,发现parking_lot::Mutex速度比std::sync::Mutex速度快1.5倍,而在多线程竞争时,速度最高可快5倍。 RwLock的数字取决于读取器和写入器线程的数量,但几乎总是比标准库RwLock快,在某些...
1、与全局时钟资源相关的原语常用的与全局时钟资源相关的Xilinx器件原语 2、全局时钟资源的使用方法 3、全局时钟资源的例化方法