Error[8]: Undefined offset: 4, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述在阅读了解 Linux内核(Bovet& Cesati)之后,关于内核同步的章节指出自旋锁获取代码归结为: 1: lock: btsl $0, slp jnc 32: testb $1, slp jne 2 jmp 13: 现在我原本以为嵌套循环似乎很浪费你可以实现类似的东西: 1: lock: btsl $0, slp 在阅读了解 Linux内核(Bovet& Cesati)之后,关于内核同步的章节指出自旋锁获取代码归结为:
1: lock:   btsl    
1: lock:   btsl    
lock:   btrl    
static __always_inline voID __ticket_spin_unlock(arch_spinlock_t *lock){    asm volatile(UNLOCK_LOCK_PREFIX "incb %0"         : "+m" (lock->slock)         :         : "memory","cc");}
,slp
,slp jc 1
,slp jnc 32: testb ,slp jne 2 jmp 13:

现在我原本以为嵌套循环似乎很浪费你可以实现类似的东西:

[+++]

这会简单得多.但是,我知道为什么他们这样做,因为锁影响其他cpu并且btsl的时间比一个简单的testb的时间更大.

我无法理解的一件事是旋转锁的后续释放.该书指出它产生以下结果:

[+++]

我的问题基本上是为什么?在我看来,lock / mov-immediate组合更快.

您不需要将旧状态转换为进位标志,因为遵循内核无错误的规则(假设在所述内核中的许多其他位置),旧状态将为1(您不会试图释放它,如果你还没有获得它).

并且mov比btrl快得多,至少在386上.

那我错过了什么?

在后来的芯片上更改了那些指令的时间吗?

自书籍印刷以来内核是否已更新?

这本书是完全错误的(或显示简化说明)?

我是否错过了快速指令不满足的cpu之间同步化的其他方面?

解决方法 好吧,了解linux内核已经过时了.自编写以来,linux内核已更新为使用所谓的票证自旋锁.锁定基本上是一个16位数量,分为两个字节:让我们调用一个Next(就像分配器中的下一个票证)和另一个所有者(比如计数器上的’Now Serving’号码).初始化自旋锁,两个部分都设置为零.锁定注意到自旋锁的值并递增下一步,原子地.如果递增前的Next值等于Owner,则已获得锁定.否则,它会旋转,直到所有者增加到正确的值,依此类推.

相关代码在asm/spinlock.h(对于x86).解锁 *** 作确实比书中说的更快更简单:

[+++]

因为inc比btr快约8或9倍.

希望这可以帮助;如果没有,我会很乐意深入挖掘.

总结

以上是内存溢出为你收集整理的x86 – Linux / SMP自旋锁不必要地慢吗?全部内容,希望文章能够帮你解决x86 – Linux / SMP自旋锁不必要地慢吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 5, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述在阅读了解 Linux内核(Bovet& Cesati)之后,关于内核同步的章节指出自旋锁获取代码归结为: 1: lock: btsl $0, slp jnc 32: testb $1, slp jne 2 jmp 13: 现在我原本以为嵌套循环似乎很浪费你可以实现类似的东西: 1: lock: btsl $0, slp 在阅读了解 Linux内核(Bovet& Cesati)之后,关于内核同步的章节指出自旋锁获取代码归结为:
1: lock:   btsl    
1: lock:   btsl    
lock:   btrl    
static __always_inline voID __ticket_spin_unlock(arch_spinlock_t *lock){    asm volatile(UNLOCK_LOCK_PREFIX "incb %0"         : "+m" (lock->slock)         :         : "memory","cc");}
,slp
,slp jc 1
,slp jnc 32: testb ,slp jne 2 jmp 13:

现在我原本以为嵌套循环似乎很浪费你可以实现类似的东西:

这会简单得多.但是,我知道为什么他们这样做,因为锁影响其他cpu并且btsl的时间比一个简单的testb的时间更大.

我无法理解的一件事是旋转锁的后续释放.该书指出它产生以下结果:

[+++]

我的问题基本上是为什么?在我看来,lock / mov-immediate组合更快.

您不需要将旧状态转换为进位标志,因为遵循内核无错误的规则(假设在所述内核中的许多其他位置),旧状态将为1(您不会试图释放它,如果你还没有获得它).

并且mov比btrl快得多,至少在386上.

那我错过了什么?

在后来的芯片上更改了那些指令的时间吗?

自书籍印刷以来内核是否已更新?

这本书是完全错误的(或显示简化说明)?

我是否错过了快速指令不满足的cpu之间同步化的其他方面?

解决方法 好吧,了解linux内核已经过时了.自编写以来,linux内核已更新为使用所谓的票证自旋锁.锁定基本上是一个16位数量,分为两个字节:让我们调用一个Next(就像分配器中的下一个票证)和另一个所有者(比如计数器上的’Now Serving’号码).初始化自旋锁,两个部分都设置为零.锁定注意到自旋锁的值并递增下一步,原子地.如果递增前的Next值等于Owner,则已获得锁定.否则,它会旋转,直到所有者增加到正确的值,依此类推.

相关代码在asm/spinlock.h(对于x86).解锁 *** 作确实比书中说的更快更简单:

[+++]

因为inc比btr快约8或9倍.

希望这可以帮助;如果没有,我会很乐意深入挖掘.

总结

以上是内存溢出为你收集整理的x86 – Linux / SMP自旋锁不必要地慢吗?全部内容,希望文章能够帮你解决x86 – Linux / SMP自旋锁不必要地慢吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 6, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述在阅读了解 Linux内核(Bovet& Cesati)之后,关于内核同步的章节指出自旋锁获取代码归结为: 1: lock: btsl $0, slp jnc 32: testb $1, slp jne 2 jmp 13: 现在我原本以为嵌套循环似乎很浪费你可以实现类似的东西: 1: lock: btsl $0, slp 在阅读了解 Linux内核(Bovet& Cesati)之后,关于内核同步的章节指出自旋锁获取代码归结为:
1: lock:   btsl    
1: lock:   btsl    
lock:   btrl    
static __always_inline voID __ticket_spin_unlock(arch_spinlock_t *lock){    asm volatile(UNLOCK_LOCK_PREFIX "incb %0"         : "+m" (lock->slock)         :         : "memory","cc");}
,slp
,slp jc 1
,slp jnc 32: testb ,slp jne 2 jmp 13:

现在我原本以为嵌套循环似乎很浪费你可以实现类似的东西:

这会简单得多.但是,我知道为什么他们这样做,因为锁影响其他cpu并且btsl的时间比一个简单的testb的时间更大.

我无法理解的一件事是旋转锁的后续释放.该书指出它产生以下结果:

我的问题基本上是为什么?在我看来,lock / mov-immediate组合更快.

您不需要将旧状态转换为进位标志,因为遵循内核无错误的规则(假设在所述内核中的许多其他位置),旧状态将为1(您不会试图释放它,如果你还没有获得它).

并且mov比btrl快得多,至少在386上.

那我错过了什么?

在后来的芯片上更改了那些指令的时间吗?

自书籍印刷以来内核是否已更新?

这本书是完全错误的(或显示简化说明)?

我是否错过了快速指令不满足的cpu之间同步化的其他方面?

解决方法 好吧,了解linux内核已经过时了.自编写以来,linux内核已更新为使用所谓的票证自旋锁.锁定基本上是一个16位数量,分为两个字节:让我们调用一个Next(就像分配器中的下一个票证)和另一个所有者(比如计数器上的’Now Serving’号码).初始化自旋锁,两个部分都设置为零.锁定注意到自旋锁的值并递增下一步,原子地.如果递增前的Next值等于Owner,则已获得锁定.否则,它会旋转,直到所有者增加到正确的值,依此类推.

相关代码在asm/spinlock.h(对于x86).解锁 *** 作确实比书中说的更快更简单:

[+++]

因为inc比btr快约8或9倍.

希望这可以帮助;如果没有,我会很乐意深入挖掘.

总结

以上是内存溢出为你收集整理的x86 – Linux / SMP自旋锁不必要地慢吗?全部内容,希望文章能够帮你解决x86 – Linux / SMP自旋锁不必要地慢吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
, slp jnc 32:"og:type" content="webpage">, slp jnc 32:" /> , slp jnc 32:"> x86 – LinuxSMP自旋锁不必要地慢吗?_系统运维_内存溢出

阅读 59

x86 – LinuxSMP自旋锁不必要地慢吗?,第1张

概述在阅读了解 Linux内核(Bovet& Cesati)之后,关于内核同步的章节指出自旋
锁获取代码归结为: 1: lock:   btsl    $0, slp   jnc     32: testb   $1, slp   jne     2   jmp     13: 现在我原本以为嵌套循环似乎很浪费你可以实现类似的东西: 1: lock:   btsl    $0, slp                        在阅读了解  Linux内核(Bovet& Cesati)之后,关于内核同步的章节指出自旋锁获取代码归结为:      
1: lock:   btsl    
1: lock:   btsl    
lock: btrl
static __always_inline voID __ticket_spin_unlock(arch_spinlock_t *lock){ asm volatile(UNLOCK_LOCK_PREFIX "incb %0" : "+m" (lock->slock) : : "memory","cc");}
,slp
,slp jc 1

,slp jnc 32: testb ,slp jne 2 jmp 13:

现在我原本以为嵌套循环似乎很浪费你可以实现类似的东西:

这会简单得多.但是,我知道为什么他们这样做,因为锁影响其他cpu并且btsl的时间比一个简单的testb的时间更大.

我无法理解的一件事是旋转锁的后续释放.该书指出它产生以下结果:

我的问题基本上是为什么?在我看来,lock / mov-immediate组合更快.

您不需要将旧状态转换为进位标志,因为遵循内核无错误的规则(假设在所述内核中的许多其他位置),旧状态将为1(您不会试图释放它,如果你还没有获得它).

并且mov比btrl快得多,至少在386上.

那我错过了什么?

在后来的芯片上更改了那些指令的时间吗?

自书籍印刷以来内核是否已更新?

这本书是完全错误的(或显示简化说明)?

我是否错过了快速指令不满足的cpu之间同步化的其他方面?

解决方法 好吧,了解linux内核已经过时了.自编写以来,linux内核已更新为使用所谓的票证自旋锁.锁定基本上是一个16位数量,分为两个字节:让我们调用一个Next(就像分配器中的下一个票证)和另一个所有者(比如计数器上的’Now Serving’号码).初始化自旋锁,两个部分都设置为零.锁定注意到自旋锁的值并递增下一步,原子地.如果递增前的Next值等于Owner,则已获得锁定.否则,它会旋转,直到所有者增加到正确的值,依此类推.

相关代码在asm/spinlock.h(对于x86).解锁 *** 作确实比书中说的更快更简单:

因为inc比btr快约8或9倍.

希望这可以帮助;如果没有,我会很乐意深入挖掘. 总结 以上是内存溢出为你收集整理的x86 – Linux / SMP自旋锁不必要地

慢吗?全部内容,希望文章能够帮你解决x86 – Linux / SMP自旋锁不必要地慢吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:

内存溢出

原文地址:

https://outofmemory.cn/yw/1049639.html
要地
(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
仙剑online 仙剑online 一级用户组
除了root之外的所有内容的Apache mod_rewrite
上一篇
2022-05-25
hrtimer在Linux内核中重复任务
2022-05-25

发表评论
请登录后评论... 登录
提交

    评论列表(0条)
保存
{label} {label} , slp jnc 32: testb , slp j', author : '仙剑online', cat_name : '系统运维', time_y_m : '2022年05月', time_d : '25', site_motto : '内存溢出' }; {script} {script}