如何监控linux自旋锁等待时间?

如何监控linux自旋锁等待时间?,第1张

概述如何监控linux自旋等待时间?

我在linux内核中读取了spinlock函数代码。 有两个与自旋锁相关的function。 请参阅下面的代码:

static __always_inline voID __ticket_spin_lock(raw_spinlock_t *lock) { short inc = 0x0100; asm volatile ( LOCK_PREFIX "xadDW %w0,%1n" "1:t" "cmpb %h0,%b0nt" "je 2fnt" "rep ; nopnt" "movb %1,%b0nt" /* don't need lfence here,because loads are in-order */ "jmp 1bn" "2:" : "+Q" (inc),"+m" (lock->slock) : : "memory","cc"); } static __always_inline voID __ticket_spin_lock(raw_spinlock_t *lock) { int inc = 0x00010000; int tmp; asm volatile(LOCK_PREFIX "xaddl %0,%1n" "movzwl %w0,%2nt" "shrl $16,%0nt" "1:t" "cmpl %0,%2nt" "je 2fnt" "rep ; nopnt" "movzwl %1,%2nt" /* don't need lfence here,because loads are in-order */ "jmp 1bn" "2:" : "+r" (inc),"+m" (lock->slock),"=&r" (tmp) : : "memory","cc"); }

我有两个问题:

1.上面两个函数有什么区别?

2.我能做些什么来监控自旋锁的等待时间(第一次尝试锁的时间并最终获得锁)?variablesinc是指自旋锁的等待时间吗?

关于linux中程序的内存布局

如何取消引用一个函数指针并读取为MSVC ++下的数据?

套接字调用linux的64位版本

计算PE文件中入口点的文件偏移量

如何在x64上为我的进程启用alignment例外?

在x86中将string定义为字节(db)和将string定义为字/双字(DW / dd)有什么区别?

从x86 asm在linux中访问命令行参数的问题

如何在64位windows中运行旧的x86 DOS程序集?

这个方法好吗?

内存负载何时会导致x86-64 linux上的总线错误?

让我先解释一下spinlock代码是如何工作的。 我们有变数

uint16_t inc = 0x0100,lock->slock; // I'll just call this "slock"

在汇编程序代码中, inc被称为%0 , slock称为%1 。 而且, %b0表示低8位,即inc % 0x100 , %h0是inc / 0x100 。

现在:

lock xadDW %w0,%1 ;; "inc := slock" and "slock := inc + slock" ;; simultaneously (atomic exchange and increment) 1: cmpb %h0,%b0 ;; "if (inc / 256 == inc % 256)" je 2f ;; " goto 2;" rep ; nop ;; "yIEld();" movb %1,%b0 ;; "inc = slock;" jmp 1b ;; "goto 1;" 2:

如果inc为零,则比较inc的高位字节和低位字节。 由于inc具有原始锁的值,所以如果锁被解锁,则会发生这种情况。 在这种情况下,锁已经被原子交换和增量增加到非零,所以现在它被锁定了。

否则,即,如果锁已经被锁定,我们暂停一下,然后更新inc到当前的锁的值,然后再试一次。

(我相信实际上有一个溢出的可能性,如果2 8个线程同时试图获得自旋锁,在这种情况下, slock更新为0x0100,0x0200,… 0xFF00,0x0000,然后似乎是解锁。这就是为什么代码的第二个版本使用一个16位宽的计数器,这将需要2 16个同时尝试。)

现在让我们插入一个计数器:

uint32_t spincounter = 0; asm volatile( /* code below */ : "+Q" (inc),"+m" (lock->slock) : "=r" (spincounter) : "memory","cc");

现在spincounter可能被称为%2 。 我们只需要每次递增计数器:

1: inc %2 cmpb %h0,%b0 ;; etc etc

我没有测试过这个,但是这是一般的想法。

总结

以上是内存溢出为你收集整理的如何监控linux自旋锁等待时间?全部内容,希望文章能够帮你解决如何监控linux自旋锁等待时间?所遇到的程序开发问题。

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

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

原文地址: http://outofmemory.cn/langs/1254523.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存