阿里云
云栖社区2017年度颁奖盛典
发表主题 回复主题
  • 16819阅读
  • 4回复

Linux的新式线程同步原语——Futex

级别: 阿里大牛
发帖
9
云币
77
— 本帖被 夜之魅 从 开发者交流 移动到本区(2014-09-15) —
 a1p}y2  
  在我的上一篇文章《本地POSIX线程库》中,提到了Futex一词,发现好多读者误以为这是我的笔误,将Mutex错写为Futex了。其实Futex是Linux的一种全新的线程同步原语。本文将为您解读高效的Futex。 EP ;TfWc}1  
  Futex是fast userspace mutex的缩写,意思是快速用户空间互斥体。Linux内核把它们作为快速的用户空间的锁和信号量的预制构件提供给开发者。Futex非常基础,借助其身的优异性能,构建更高级别的锁的抽象,如POSIX互斥体。大多数程序员并不需要直接使用Futex,它一般用来实现像NPTL这样的系统库。 ?cF-w!>o8  
  Futex其实就是可以由不同进程所共享使用的一块内存。在这些进程中,并不需要有相同的地址。一个光秃秃的Futex,与信号量的语义是相同的;它有一个可以被原子增减的计数器;进程可以等待这个计数器值变为正数。 $u`v k|\R  
  Futex的操作完全是在用户空间,不需要进行上下文切换。内核仅在发生竞争的时候作一个公断。它的本质结构是一个对齐的整数,仅由原子的汇编指令操作。进程们可以通过mmap,在共享段中访问它,或许是由于进程们共享了内存空间,通常就把这样的应用程序称为多线程程序。 @aX$}  
  任何Futex的操作都起始于用户空间,但是在必要的时候还是需要使用某些系统调用与内核通讯的。 U <|h4'(@L  
  要“up”一个Futex,需执行正确的汇编指令使主CPU原子的递增这个整数。然后,检查它是否已从0变为1,这说明没有等待进程,操作完成。这是无竞争情况,这很快而且应该很普遍。 |KM<\v(A{  
  在竞争情况下,原子增量从-1(或者是其他的负数)开始变化。如果是这样的话,说明有等待进程。用户空间应立即将计数器设置为1,并通知内核唤醒那些正使用FUTEX_WAKE操作的等待进程。 R>05MhA+  
正等待一个Futex时,“down”它是一个相反的操作。原子递减这个计数器,并检查它是否变为0,使操作完成,Futex无竞争。在所有其他的情况下,进程会设置计数器为-1,并请求内核等待其他进程“up”Futex。这是通过FUTEX_WAIT操作完成的。 k~<b~VcU  
  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,已经可以获得更多的附加功能了。
本帖最近评分记录: 3 条评分 云币 +6
西秦 云币 +4 优秀文章-欢迎进行技术分享,感谢你的支持! 2015-09-10
小猪猪 云币 +1 你懂的! 2014-07-27
林林林林 云币 +1 您的帖子很精彩!希望很快能再分享您的下一帖! 2014-07-23
级别: 技术砖家
发帖
1925
云币
3578
只看该作者 沙发  发表于: 2014-07-23
您的帖子很精彩!希望很快能再分享您的下一帖!
级别: 程序猿
发帖
303
云币
-2
只看该作者 板凳  发表于: 2014-07-24
ReLinux的新式线程同步原语——Futex
沙发没了
级别: 程序猿
发帖
389
云币
308
只看该作者 地板  发表于: 2015-09-10
好像 "自旋锁 + 队列”
级别: 论坛版主
发帖
4270
云币
491

只看该作者 4楼 发表于: 2015-09-10
优秀文章-欢迎进行技术分享,感谢你的支持!
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
批量上传需要先选择文件,再选择上传
 
验证问题: ECS是阿里云提供的什么服务? 正确答案:云服务器
上一个 下一个