linux futex 进程同步,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,已经可以获得更多的附加功能了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

笨鸟学Android开发(1):HelloWorld

全程视频(IE等浏览器中若看不到以下GIF动画,请下载观看) 源代码 转载于:https://www.cnblogs.com/beta2013/archive/2012/06/28/3377298.html

LeetCode 254. 因子的组合(回溯)*

文章目录1. 题目2. 解题1. 题目 整数可以被看作是其因子的乘积。 例如:8 2 x 2 x 2; 2 x 4.请实现一个函数,该函数接收一个整数 n 并返回该整数所有的因子组合。 注意: 你可以假定 n 为永远为正数。 因子必须大于 1 并且小于 n。示例 1&a…

linux 设备数 of,linux下devicetree中惯用的of函数

linux下devicetree中常用的of函数从device_node中获取信息:int of_property_read_u8_array(const struct device_node *np, const char *propname,u8 *out_values, size_t sz);int of_property_read_u16_array(const struct device_node *np, const char *propname,…

使用架构(XSD)验证XML文件

假使说XML是一个数据库,那么XSD就是这个数据库的结构。由此可见,XSD是如此重要,如果没有它,我们如何声明以及验证我们需要的XML数据文件的格式和合法性呢?那是不可能完成的任务,如果你将XML数据文件当作普通…

Linux无法连接远程仓库,ssh无法连接到远端Ubuntu的解决方法

ssh无法连接到远端Ubuntu的解决方法2014-10-16 0个评论 来源:KiteRunner的专栏近日,饱受无法远程登录到新安装在VMWare上的Ubuntu虚拟机,如今发现问题所在,故记录此问题的解决方案,以备后用。一、远程登录虚拟…

kohana3 数据库模块配置

Kohana 3.0 有一个很强壮的数据库模块。默认情况下数据库模块支持 MySQL 和 PHP-PDO 驱动 数据库模块已经包含在了 Kohana 3.0 安装程序之中,但是还需要在使用之前启动它。在你的 application/bootstrap.php 文件里修改 Kohana::modules() 方法中 database 模块&…

LeetCode 255. 验证前序遍历序列二叉搜索树(单调栈)*

文章目录1. 题目2. 解题2.1 递归超时解2.2 单调栈1. 题目 给定一个整数数组,你需要验证它是否是一个二叉搜索树正确的先序遍历序列。 你可以假定该序列中的数都是不相同的。 参考以下这颗二叉搜索树:5/ \2 6/ \1 3 示例 1: 输入: [5,2…

spring代码执行Linux命令,Linux 运行管理SpringBoot Shell 脚本.md

最近在做Linux 环境下的一个运行管理通用脚本,用来管理我的Java 小程序启动、停止等操作。虽说这些可以用手敲命令的方式实现,也不复杂,但程序员么,不就喜欢封装点代码,减少操作啥的。先讲下脚本的主要逻辑&#xff0c…

SQL基础---SQL AND OR 运算符

SQL AND OR 运算符 AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤。 AND 和 OR 运算符 AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。 如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。 如果第一个条件和第二个条件中只要有一个…

LeetCode 259. 较小的三数之和(固定一点,内层双指针)

文章目录1. 题目2. 解题1. 题目 给定一个长度为 n 的整数数组和一个目标值 target&#xff0c;寻找能够使条件 nums[i] nums[j] nums[k] < target 成立的三元组 i, j, k 个数&#xff08;0 < i < j < k < n&#xff09;。 示例&#xff1a; 输入: nums [-2…

linux虚拟中断virq,一种微内核操作系统的分区多核方法与流程

本发明涉及一种计算机领域&#xff0c;特别涉及一种微内核操作系统的分区多核方法。背景技术&#xff1a;在宏内核操作系统(如Linux&#xff0c;Windows)中,网络、文件系统、设备驱动等大量系统服务都在操作系统内核中&#xff0c;微内核操作系统与宏内核操作系统相反&#xff…

Android心得8--Internet

1.从Internet获取数据 利用HttpURLConnection对象,我们可以从网络中获取网页数据. URLurl new URL("http://www.sohu.com"); HttpURLConnectionconn (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5*1000);//设置连接超时 conn.setRequestMet…

LeetCode 487. 最大连续1的个数 II(滑动窗口)

文章目录1. 题目2. 解题1. 题目 给定一个二进制数组&#xff0c;你可以最多将 1 个 0 翻转为 1&#xff0c;找出其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;[1,0,1,1,0] 输出&#xff1a;4 解释&#xff1a;翻转第一个 0 可以得到最长的连续 1。当翻转以后…

SketchUp 7 linux,SketchUp各版本有哪些兼容性更改?

兼容性更改SketchUp 2018随着SketchUp 2018的发布&#xff0c;对OpenGL版本有了更高的要求&#xff0c;另外增加了模型显示效果。SketchUp 2017随着SketchUp 2017的发布&#xff0c;我们已经取消了对32位操作系统&#xff0c;OpenGL 2.0和模型的软件渲染(而不是硬件加速)的支持…

行向量,列向量,行主序矩阵,列主序矩阵

原理: PS: 很不喜欢OGL的列矩阵方式&#xff0c;不过本质上是一样的。 v2 v1 * ma * mb;        (dx) v2 mb(T) * ma(T) * v1     (ogl) 关于这个话题&#xff0c;网上有n多个版本&#xff0c;今天&#xff0c;我也来说说这个话题。&#xff08;一&#xff09;…

LeetCode 1429. 第一个唯一数字(map+queue)

文章目录1. 题目2. 解题1. 题目 给定一系列整数&#xff0c;插入一个队列中&#xff0c;找出队列中第一个唯一整数。 实现 FirstUnique 类&#xff1a; FirstUnique(int[] nums) 用数组里的数字初始化队列。int showFirstUnique() 返回队列中的 第一个唯一 整数的值。如果没…

msp430流水灯c语言程序,超详细msp430示例程序汇编.doc

超详细msp430示例程序汇编一、基础_实验【10个】1、入门试验&#xff1a;LED闪烁(1个)2、时钟实验&#xff1a;设置MCLK、ACLK、SMCLK(1个)3、低功耗实验&#xff1a;设置低功耗模式(1个)4、IO端口试验&#xff1a; IO端口寄存器设置(1个)5、定时器&#xff1a;看门狗定时器、T…

LeetCode 1244. 力扣排行榜(map+multiset)

文章目录1. 题目2. 解题1. 题目 新一轮的「力扣杯」编程大赛即将启动&#xff0c;为了动态显示参赛者的得分数据&#xff0c;需要设计一个排行榜 Leaderboard。 请你帮忙来设计这个 Leaderboard 类&#xff0c;使得它有如下 3 个函数&#xff1a; addScore(playerId, score)…

c语言实现ftp网络应用程序,使用C语言socket实现windows pc与ftp服务器通信---socket实现ftp客户端...

code// Client.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include #pragma comment(lib,"WS2_32.lib")using namespace std;#define PORT 21//FTP端口#define IP_ADDR "x.x.x.x"//主机地址int getPortNum(cha…

Readonly 与Const

Readonly 与Const readonly 关键字是可以在字段上使用的修饰符。当字段声明包括 readonly修饰符时&#xff0c;该声明引入的字段赋值只能作为声明的一部分出现&#xff0c;或者出现在同一类的构造函数中。 对于实例字段&#xff0c;在包含字段声明的类的实例构造函数中&#x…