sunplusedu的个人空间 https://blog.eetop.cn/sunplusedu [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

Linux内核学习之排队自旋锁详解

已有 992 次阅读| 2013-9-23 10:27 |个人分类:嵌入式学习

    传统的自旋锁实际上就是一个整数,值为1时表示没有被占用,值为0或负数时表示锁已经被占用,此时spin_lock循环等待,直到spin_unlock将自旋锁的值置为1,在这个过程中没有保存线程申请自旋锁的顺序信息,后进入等待的线程有可能先获得自旋锁。

    排队自旋锁(FIFO Ticket Spinlock)是 Linux 内核 2.6.25 版本引入的一种新型自旋锁,它通过保存执行线程申请锁的顺序信息解决了这种问题,让先申请自旋锁的线程先得到锁。

    1. Ticket spinlock的实现原理

    排队自旋锁还是使用一个整形slock,并将其分为两个部分:

    Ticket Number

    Next和Owner的长度与CPU的个数相关, 当CPU的个数 < 256时,Next和Owner为8位。当CPU的个数 > 256时,Next和Owner为16位。

    #if (NR_CPUS < 256)

    #define TICKET_SHIFT 8

    ...

    #else

    #define TICKET_SHIFT 16

    slock初始化时被置为0NextOwner都被置为0当内核线程申请自旋锁时比较原始的NextOwner并将Next1如果原始的Next域和Owner域相等则表示锁处理未使用状态否则改线程轮询等待直到Next域和Owner域相等。当释放锁时将Owner域加1.

    2. Ticket spinlock的实现代码

    下面查看__ticket_spin_lock和__ticket_spin_unlock两个函数(NR_CPUS < 256):

    加锁:

    点击(此处)折叠或打开

    static __always_inline void __ticket_spin_lock(arch_spinlock_t *lock)

    {

    short inc = 0x0100;

    asm volatile (

    LOCK_PREFIX "xaddw %w0, %1\n"

    "1:\t"

    "cmpb %h0, %b0\n\t"

    "je 2f\n\t"

    "rep ; nop\n\t"

    "movb %1, %b0\n\t"

    /* don't need lfence here, because loads are in-order */

    "jmp 1b\n"

    "2:"

    : "+Q" (inc), "+m" (lock->slock)

    :

    : "memory", "cc");

    }

    a. xaddw %w0, %1inclock->slock的低16位置交换并将相加后的值存贷lock->slock.

    slock = 0x00 00 11 10操作之后slock = 0x00 00 12 10, inc = 0x00 00 11 10.

    b. cmpb %h0, %b0: 比较inc的低8位(Owner)和高8位(Next),相等则获得锁返回,不相等则继续执行;

    c. 不断轮询lock->slock, 等待直到Next和Owner相等。

    解锁

    点击(此处)折叠或打开

    static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock)

    {

    asm volatile(UNLOCK_LOCK_PREFIX "incb %0" // 将owner加1

    : "+m" (lock->slock)

    :

    : "memory", "cc");

    }

    a. 解锁只执行一个操作就是讲slock的Owner字段加1;

    通过这种方式,线程调用__ticket_spin_lock的顺序存放在Next字段中,Next字段小的线程会先得到锁。

   凌阳嵌入式Linux培训网提供更多linux内核学习资料:http://emb.sunplusedu.com/answer/2013/0801/2064.html


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 0

    获赞
  • 2

    评论
  • 1928

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-6-1 16:49 , Processed in 0.026508 second(s), 15 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部