zoukankan      html  css  js  c++  java
  • linux内核情景分析之锁机制


    1. /*
    2. * These are the generic versions of the spinlocks and read-write
    3. * locks..
    4. *///自旋锁加锁,irqsave表示把标志寄存器存储起来
    5. #define spin_lock_irqsave(lock, flags) do { local_irq_save(flags);//关闭本地中断,保存标志位 spin_lock(lock); } while (0)
    6. #define spin_lock_irq(lock) do { local_irq_disable(); spin_lock(lock); } while (0)
    7. #define spin_lock_bh(lock) do { local_bh_disable(); spin_lock(lock); } while (0)
    8. //读锁与下面写锁,构成读写锁
    9. #define read_lock_irqsave(lock, flags) do { local_irq_save(flags); read_lock(lock); } while (0)
    10. #define read_lock_irq(lock) do { local_irq_disable(); read_lock(lock); } while (0)
    11. #define read_lock_bh(lock) do { local_bh_disable(); read_lock(lock); } while (0)
    12. //写锁,与上面构成读写锁
    13. #define write_lock_irqsave(lock, flags) do { local_irq_save(flags); write_lock(lock); } while (0)
    14. #define write_lock_irq(lock) do { local_irq_disable(); write_lock(lock); } while (0)
    15. #define write_lock_bh(lock) do { local_bh_disable(); write_lock(lock); } while (0)
    16. //自旋锁解锁
    17. #define spin_unlock_irqrestore(lock, flags) do { spin_unlock(lock); local_irq_restore(flags); } while (0)
    18. #define spin_unlock_irq(lock) do { spin_unlock(lock); local_irq_enable(); } while (0)
    19. #define spin_unlock_bh(lock) do { spin_unlock(lock); local_bh_enable(); } while (0)
    20. //读锁解锁
    21. #define read_unlock_irqrestore(lock, flags) do { read_unlock(lock); local_irq_restore(flags); } while (0)
    22. #define read_unlock_irq(lock) do { read_unlock(lock); local_irq_enable(); } while (0)
    23. #define read_unlock_bh(lock) do { read_unlock(lock); local_bh_enable(); } while (0)
    24. //写锁解锁
    25. #define write_unlock_irqrestore(lock, flags) do { write_unlock(lock); local_irq_restore(flags); } while (0)
    26. #define write_unlock_irq(lock) do { write_unlock(lock); local_irq_enable(); } while (0)
    27. #define write_unlock_bh(lock) do { write_unlock(lock); local_bh_enable(); } while (0)

    自旋锁加锁解析
    1. static inline void spin_lock(spinlock_t *lock)
    2. {
    3. #if SPINLOCK_DEBUG
    4. __label__ here;
    5. here:
    6. if (lock->magic != SPINLOCK_MAGIC) {//判断是否等于魔数
    7. printk("eip: %p ", &&here);
    8. BUG();
    9. }
    10. #endif
    11. __asm__ __volatile__(
    12. spin_lock_string
    13. :"=m" (lock->lock) : : "memory");
    14. }
    其中spin_lock_string为一个宏
    1. #define spin_lock_string
    2. " 1: "
    3. "lock ; decb %0 " //将lock->lock减1,指令带lock表示把总线锁住,禁止其他cpu访问
    4. "js 2f " //不是非负数,直接进入临界区
    5. ".section .text.lock,"ax" "
    6. "2: "
    7. "cmpb $0,%0 " //如果-1结果为负数,那就循环检测
    8. "rep;nop "
    9. "jle 2b " //如果检测依旧是负数,跳转到2
    10. "jmp 1b " //否则检测
    11. ".previous"


    互斥锁,读写锁,条件变量,自旋锁(用于线程互斥)
    信号量,文件锁用于进程同步






  • 相关阅读:
    Maven相关
    System.Math 方法
    css简单实现五角星评分、点赞收藏、展示评分(半颗星、1/3颗星)
    微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示
    如何基于layui的laytpl实现数据绑定
    layui表格和弹出框的简单示例
    css超简单实现div页面居中【适合做弹出框】
    如何简单方便的用字体代替页面中常见常用的小图标小按钮(上)
    用css3的cursor:zoom-in/zoom-out实现微博看图片放大镜效果
    完整版ajax+百度echarts实现统计图表demo并随着窗口大小改变而自适应
  • 原文地址:https://www.cnblogs.com/zengyiwen/p/d1362441af6e81449aeeed13a137784d.html
Copyright © 2011-2022 走看看