Linux线程同步

2024-01-10

我是 Linux 和 Linux 线程的新手。我花了一些时间谷歌搜索来尝试了解可用于线程同步的所有函数之间的差异。我还有一些问题。

我发现了所有这些不同类型的同步,每种都有许多用于锁定、解锁、测试锁定等的功能。

  • gcc原子操作
  • futexes
  • mutexes
  • 自旋锁
  • seqlocks
  • rculocks
  • 状况
  • 信号量

我目前(但可能有缺陷)的理解是这样的:

信号量是进程范围内的,涉及文件系统(实际上我假设),并且可能是最慢的。

Futexes 可能是互斥锁、自旋锁、seqlocks 和 rculocks 使用的基本锁定机制。 Futexes 可能比基于它们的锁定机制更快。

自旋锁不会阻塞,从而避免上下文切换。然而,它们避免了上下文切换,代价是消耗 CPU 上的所有周期,直到锁被释放(旋转)。出于显而易见的原因,它们只应该在多处理器系统上使用。永远不要睡在自旋锁中。

seq 锁只是告诉您何时完成工作,如果编写者更改了工作所基于的数据。在这种情况下,你必须返回并重复该工作。

原子操作是最快的同步调用,并且可能在所有上述锁定机制中使用。您不想对共享数据中的所有字段使用原子操作。当您访问多个数据字段时,您希望使用锁(mutex、futex、spin、seq、rcu)或对锁标志进行单个原子操作。

我的问题是这样的:

  1. 到目前为止我的假设正确吗?

  2. 有谁知道各种选项的CPU周期成本吗?我正在向应用程序添加并行性,以便我们可以获得更好的挂机时间响应,但代价是每个盒子运行更少的应用程序实例。表演是最重要的考虑因素。我不想通过上下文切换、旋转或大量额外的 cpu 周期来消耗 cpu 来读写共享内存。我绝对关心消耗的CPU 周期数。

  3. 哪些锁(如果有)可以防止调度程序或中断中断线程......或者我只是一个白痴,所有同步机制都会这样做。可以防止哪些类型的中断?我可以阻止所有线程或仅阻止锁定线程的 CPU 上的线程吗?这个问题源于我担心中断持有一个非常常用的函数的锁的线程。我预计调度程序可能会调度任意数量的其他工作人员,这些工作人员可能会遇到此函数,然后因为它被锁定而阻塞。在具有锁的线程被重新调度并完成之前,大量的上下文切换将被浪费。我可以重写这个函数以最小化锁定时间,但它仍然如此普遍地被称为我想使用一个锁来防止中断......跨所有处理器。

  4. 我正在编写用户代码......所以我得到软件中断,而不是硬件中断......对吗?我应该远离任何带有“irq”一词的函数(自旋/序列锁)。

  5. 哪些锁用于编写内核或驱动程序代码,哪些锁用于用户模式?

  6. 有人认为使用原子操作让多个线程在链表中移动是疯狂的吗?我正在考虑以原子方式将当前项目指针更改为列表中的下一个项目。如果尝试有效,则线程可以安全地使用当前项目在移动之前所指向的数据。其他线程现在将沿着列表移动。

  7. 未来?有什么理由使用它们而不是互斥体?

  8. 有没有比在没有工作时使用条件使线程休眠更好的方法?

  9. 当使用 gcc 原子操作(特别是 test_and_set)时,我可以通过先进行非原子测试然后使用 test_and_set 进行确认来提高性能吗?我知道这将视具体情况而定,所以情况如下。有大量的工作项目,比如说数千个。每个工作项都有一个初始化为 0 的标志。当线程具有对该工作项的独占访问权限时,该标志将为 1。将会有很多工作线程。每当线程寻找工作时,它们都可以非原子地测试 1。如果它们读取到 1,我们就可以确定该工作不可用。如果他们读取到零,则需要执行原子 test_and_set 来确认。因此,如果原子 test_and_set 是 500 个 cpu 周期,因为它禁用了流水线,导致 cpu 进行通信并且 L2 缓存刷新/填充....并且一个简单的测试是 1 个周期....那么只要我有更好的比率当遇到已经完成的工作项目时,比例为 500 比 1……这将是一场胜利。

我希望使用互斥锁或自旋锁来保护我只希望系统上的一个线程(而不是 CPU)一次访问的代码部分。我希望谨慎使用 gcc 原子操作来选择工作并尽量减少互斥锁和自旋锁的使用。例如:可以检查工作项中的标志以查看线程是否已对其进行工作(0 = 否,1 = 是或正在进行)。一个简单的 test_and_set 告诉线程是否有工作或需要继续。我希望在有工作的时候使用条件来唤醒线程。

Thanks!


应用程序代码可能应该使用 posix 线程函数。我假设你有手册页,所以输入

man pthread_mutex_init
man pthread_rwlock_init
man pthread_spin_init

阅读它们以及对它们进行操作的函数以找出您需要的内容。

如果您正在进行内核模式编程,那么情况就不同了。您需要了解您正在做什么、需要多长时间以及它被调用的上下文,以便了解您需要使用什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux线程同步 的相关文章

  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • 高效秒表

    您好 我正在用 javascript 编写一个秒表实用程序 我有一个关于效率和开销的问题 我考虑过两种制作秒表的方法 1 存储开始日期并不断测量自该日期以来经过的毫秒数 2 创建一个整数并按设定的时间间隔递增其值 我想知道哪个最有效 另外
  • 无法访问类型的封闭实例。 [复制]

    这个问题在这里已经有答案了 整个代码是 public class ThreadLocalTest ThreadLocal
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • 配置tomat的server.xml文件并自动生成mod_jk.conf

    我在用apache 2 2 15 and tomcat6 6 0 24 on CentOS 6 4并希望使用 tomcat 服务器的功能 通过添加以下内容自动生成 mod jk conf 文件
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • 从创建 UI 的同一线程更新 VCL。为什么?

    我知道我必须调用 Synchronize 来从未创建控件或向窗口发送消息的线程更新 vcl 我经常听到 线程不安全 这个词 但我找不到关于正在发生的事情的实际解释 我知道应用程序可能会因访问冲突而崩溃 但我又不知道为什么 请阐明这个主题 V
  • 可升级读锁的优点?

    我想知道使用可升级读锁与执行这些步骤相比有什么优势 获取读锁 检查条件以查看是否需要进行写锁定 释放读锁 采取写锁定 执行更新 释放写锁 与获取可升级读锁相比 执行上述步骤的一个明显缺点是 步骤 3 和步骤 4 之间存在一个时间窗口 其中另
  • 使用 AJAX 或多线程加速页面加载

    我的页面有 5 个部分 每个部分大约需要 1 秒来渲染 Page Load RenderSection1 1 sec RenderSection2 1 sec RenderSection3 1 sec RenderSection4 1 se
  • 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) 存在性能问题?

    LDAP 搜索有一些内置规则 其中之一是LDAP MATCHING RULE IN CHAIN From MSDN https msdn microsoft com en us library aa746475 v vs 85 aspx 1
  • linux下如何从文本文件中获取值

    我有一些文本格式的文件 xxx conf 我在这个文件中有一些文本 disablelog 1 当我使用 grep r disablelog oscam conf 输出是 disablelog 1 但我只需要值1 请问你有什么想法吗 一种方法
  • 使用多线程并行化 Java 中的 for 循环

    我对java很陌生 我想使用执行器服务或使用java中的任何其他方法并行化嵌套for循环 我想创建一些固定数量的线程 这样CPU就不会完全被线程占用 for SellerNames sellerNames sellerDataList fo
  • 排序线程按照它们创建/启动的顺序运行

    我如何按照线程实例化的顺序对线程进行排序 我怎样才能让下面的程序按顺序打印数字1 10 public class ThreadOrdering public static void main String args class MyRunn
  • 提高第一个查询的性能

    如果执行以下数据库 postgres 查询 则第二次调用要快得多 我猜第一个查询很慢 因为操作系统 linux 需要从磁盘获取数据 第二个查询受益于文件系统级别和 postgres 中的缓存 有没有一种方法可以优化数据库以快速获得结果fir
  • 删除行导致锁超时

    当我尝试从表中删除行时 我不断收到这些错误 这里的特殊情况是我可能同时运行5个进程 该表本身是一个 Innodb 表 约有 450 万行 我的 WHERE 子句中使用的列没有索引 其他指数按预期运行 这是在事务中完成的 首先删除记录 然后插
  • 检查已安装的软件包,如果没有找到则安装

    我需要检查已安装的软件包 如果未安装则安装它们 RHEL CentOS Fedora 示例 rpm qa grep glibc static glibc static 2 12 1 80 el6 3 5 i686 如何在 BASH 中进行检
  • 会话重新启动后 AVcapture 会话启动缓慢

    我有一个主视图控制器 它连接到具有 avcapturesession 的第二个视图控制器 我第一次从主视图控制器转向捕获会话控制器 大约需要 50 毫秒 使用 仪器 检查 然后我从捕获会话返回到主视图控制器 然后从主控制器返回到 avcap
  • 多处理器机器中秒表的最佳实践?

    我找到了一个好的question https stackoverflow com questions 28637 is datetime now the best way to measure a functions performance
  • 如何知道Matlab中系统命令执行过程中经过的时间?

    我有一个运行系统脚本的 Matlab 代码 该脚本可能会因命令运行而停止 我想知道是否有一种方法可以让程序知道它是否花费了很长时间并执行其他操作 这是代码 tic status cmdout system iperfcmd The prog
  • x86-64 AMD 上 CALL 指令的操作数生成

    以下是示例程序 objdump 的输出 080483b4

随机推荐

  • 为什么我无法注销 django 用户身份验证?

    我正在使用 django contrib auth 用户管理系统 因此 我将注册 插入到用户表 模型中 并从 django contrib auth views login 进行登录 以便我可以登录 但是 我无法使用 django cont
  • 类方法上的 functools.partial

    我试图使用另一个更通用的类方法定义一些类方法 如下所示 class RGB object def init self red blue green super RGB self init self red red self blue blu
  • 我什么时候应该为 Map 键创建一个类?

    我正在使用 Java 6 假设我有一个类 我想将其实例保存到地图中 后来我想仅使用 关键字段 来检索实例 为了简洁起见 我将忽略字段修饰符 getter 和 setter class A String field1 String field
  • 如何在 Url.Content 中包含 MVC Razor 变量?

    使用 MVC 3 Razor 如何在调用中指定变量 Url Content Example var myVar Request QueryString foo a href Url Content a bar myvar gt click
  • 程序在其他 Windows 机器上无法正常运行

    我的应用程序遇到问题 我试图获取它运行的系统的所有网络配置 最终目标是找到优先级最高的MAC地址 当我使用 QtCreator 运行代码时 代码运行正常并且可以工作 当我创建包含 dll 文件和 exe 文件的文件夹时 代码也运行正常 但问
  • 无法使用 API Gateway 运行 AWS Lambda 函数

    我创建了一个简单的 python 3 7 lambda 函数 import json import boto3 s3 boto3 client s3 def lambda handler event context bucket nubi
  • 如何按 R 数据表中的特定列分组后选择行的子集[重复]

    这个问题在这里已经有答案了 我想在按 R 数据表中的特定列分组后根据条件选择行的子集 以Mtcars数据为例 dt mtcars lt as data table mtcars dt mtcars N by hp hp N 1 110 3
  • HTML Canvas 上的发光效果,可能使用卷积核/矩阵

    我正在将 PNG 图像绘制到 HTML 画布上 并且实现了一个过滤器系统 以允许在将图像数据传输到画布之前对图像数据执行卷积过滤器 有谁知道如何使用卷积核 矩阵创建发光效果 我不确定术语是什么 但我正在谈论这些 http www html5
  • IEnumerable 的扩展方法?

    我有很多不同的枚举 例如 public enum MyEnum Description Army of One one Description Dynamic Duo two Description Three Amigo s three
  • 使用 .htaccess 重定向移动设备 // 排除 IPAD

    我在 htaccess 中使用此代码来重定向移动设备 目前iPad也是一种移动设备 我该如何更改此设置 以便 ipad 不会重定向到移动版本 谢谢你 RewriteEngine on RewriteBase Check if this is
  • IDLE 和 Python 在 Mac OS X 中具有不同的路径

    我运行的是 Mac OS X 10 5 8 我已经从网站安装了 Python 2 6 它在我的应用程序目录中 我已经编辑了我的 bash profile 以具有 Setting PATH for MacPython 2 6 The orgi
  • 使用Volley进行Android开发时,setRetryPolicy()方法调用应该写在哪里

    这可能是一个简单的问题 但我在实际代码中测试了它 无法判断正确的行为setRetryPolicy 凌空的功能 请任何人告诉我该声明的正确位置 我应该写这个方法调用吗onErrorResponse 函数还是在将请求输入队列之前 这是我的位图图
  • Helper Devise:无法在请求环境中找到“Warden::Proxy”实例

    我尝试将 Devise 用于我的 Rails 应用程序 我可以注册并登录 但是当我转到其他页面 构建 时 出现以下错误 Devise Home 中的 MissingWarden show Devise 找不到Warden Proxy您的请求
  • 如何用 LESS 混合多种背景

    我有一个小问题 是否有任何选项可以将多个背景与 LESS 混合 我在 LESS 中有这样的背景设置 background centered url position horizontal center position vertical t
  • 如何在 ios 和 android 的 flutter 中检测模拟位置

    我在屏幕上使用位置包和谷歌地图 flutter 我想检测用户是否使用假 GPS 是否有一个包可以检测 android 和 ios 中可用的 flutter 中的模拟位置 我尝试过使用 TrustFall 包 但我的应用程序总是意外关闭 是否
  • 无法使用 ImagePicker Flutter 分配文件

    我正在学习 imagepickerhttps pub dev packages image picker https pub dev packages image picker 但我不明白为什么当我一步步使用该方法时会出现错误 这就是问题
  • 如何使 EditText 不可编辑/禁用

    我有一个 EditText 用户不应在其中提供输入 所以我尝试禁用它 edittext setEnabled false edittext setClickable false 但是 当我从其他 EditText 中按软键盘中的 下一步 按
  • Maven 从 url 下载或获取 wsdl 到项目目录

    我们使用 url 位置的 wsdls 开发了一个 Web 服务客户端应用程序 我不希望 Web 服务客户端每次都去验证实际的 wsdls 因此想将 wsdls 下载到本地项目中 有什么方法可以使用类似于复制资源的maven下载wsdls吗
  • 你能解释一下这个 sed 一行吗?

    下面一行逆向打印出文件的内容 sed n 1 G h p test txt sed 逐行读取文件怎么可能呢 你能解释一下它的含义吗 n flag 1 G h and p 在这个命令中 这将完成与以下相同的工作tac 即恢复行的顺序 将sed
  • Linux线程同步

    我是 Linux 和 Linux 线程的新手 我花了一些时间谷歌搜索来尝试了解可用于线程同步的所有函数之间的差异 我还有一些问题 我发现了所有这些不同类型的同步 每种都有许多用于锁定 解锁 测试锁定等的功能 gcc原子操作 futexes