Linux自旋锁具体是什么?

Linux自旋锁具体是什么?,第1张

自旋锁(Spin Lock)是一种典型的对临界资源进行互斥访问的手段,其名称来源于它的工作方式。为了获得一个自旋锁,在某CPU上运行的代码需先执行一个原子 *** 作,该 *** 作测试并设置(Test-AndSet)某个内存变量。由于它是原子 *** 作,所以在该 *** 作完成之前其他执行单元不可能访问这个内存变量。如果测试结果表明锁已经空闲,则程序获得这个自旋锁并继续执行;如果测试结果表明锁仍被占用,程序将在一个小的循环内重复这个“测试并设置” *** 作,即进行所谓的“自旋”,通俗地说就是“在原地打转”。当自旋锁的持有者通过重置该变量释放这个自旋锁后,某个等待的“测试并设置” *** 作向其调用者报告锁已释放。理解自旋锁最简单的方法是把它作为一个变量看待,该变量把一个临界区标记为“我当前在运行,请稍等一会”或者标记为“我当前不在运行,可以被使用。如果A执行单元首先进入例程,它将持有自旋锁;当B执行单元试图进入同一个例程时,将获知自旋锁已被持有,需等到A执行单元释放后才能进入。在ARM体系结构下,自旋锁的实现借用了ldrex指令、strex指令、ARM处理器内存屏障指令dmb和dsb、wfe指令和sev指令,这类似于代码清单7.1的逻辑。可以说既要保证排他性,也要处理好内存屏障。

自旋锁主要针对SMP或单CPU但内核可抢占的情况,对于单CPU和内核不支持抢占的系统,自旋锁退化为空 *** 作。在单CPU和内核可抢占的系统中,自旋锁持有期间中内核的抢占将被禁止。由于内核可抢占的单CPU系统的行为实际上很类似于SMP系统,因此,在这样的单CPU系统中使用自旋锁仍十分必要。另外,在多核SMP的情况下,任何一个核拿到了自旋锁,该核上的抢占调度也暂时禁止了,但是没有禁止另外一个核的抢占调度。尽管用了自旋锁可以保证临界区不受别的CPU和本CPU内的抢占进程打扰,但是得到锁的代码路径在执行临界区的时候,还可能受到中断和底半部的影响。为了防止这种影响,就需要用到自旋锁的衍生。

   起源于前段时间做的一个GPU实验,关于两个CUDA进程的进程间通信(用CUDA-IPC机制,一个进程在显存中写,另一个进程一边自旋锁一边读数据是否被更改)。实验过程中发现(环境为Ubuntu16/18),在 Pascal 架构的电脑上做的时候,实验是 成功 的。然而转到 Maxwell 架构的电脑上做,发现CUDA程序自旋锁会导致 桌面卡住 ,即使放弃桌面转到tty控制台中做 依然失败 ,因为B进程自旋锁的时候会导致 A进程卡主 *,根本写不进去。

  一开始认为 原因 是在Pascal架构之前,没有MPS技术,多个cuda进程无法同时在GPU中执行。但事实上软件支持的MPS对硬件计算能力要求不高(>=3.5),cuda>=5.5就可以。且MPS一般默认关闭,在Pascal架构上实验时也并没有开启MPS。

  后来发现原因是Pascal架构开始支持计算抢占。

相关技术及对应的架构:

CUDA Context

MPS

推荐阅读 MPS官方文档 以及 MPS相关博客 。

个人理解:相当于用一个context整合了多个context。

待深入了解:MPS的硬件隔离?

自问自答:

Q:多个主机进程默认创建的Context是同一个吗?

A:是不同的Context。

Q:Pascal架构之前,桌面渲染和通用计算也是可以同时进行的呀?

A:事实上并没有真正同时进行,只是交替进行,宏观看上去会有并发的效果。如果cuda程序占用GPU时间过长,会被桌面图形程序停掉。

Q:图像渲染都需要用GPU吗?

A:不一定,某些软件计算量大且专门针对GPU做了优化的话才会用到GPU。

Q:GPU 通用计算会影响渲染任务吗?

A:如果两个计算量都比较大的话肯定会相互影响

 采用PID向导生产的符号表和数据块能看到:Gain 增益;Ti 积分时间;Td 微分时间,所对应的VD地址。这些都是实数,时间单位是分钟。可以在触摸屏上建立相应的变量,直接修改。

注意:修改只在当前的运行中有效。由于数据块是PLC上电后马上加载,所以修改将丢失。可以在触摸屏中另外建立3个实数变量,通过PLC的程序在初始化程序中对比例,积分和微分重新赋值,就能保持修改。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11382921.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存