我在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中程序的内存布局
如何在x64上为我的进程启用alignment例外?
在x86中将string定义为字节(db)和将string定义为字/双字(dw / dd)有什么区别?
从x86 asm在Linux中访问命令行参数的问题
如何在64位Windows中运行旧的x86 DOS程序集?
这个方法好吗?
让我先解释一下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
我没有测试过这个,但是这是一般的想法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。