Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198298
  • 博文数量: 56
  • 博客积分: 125
  • 博客等级: 入伍新兵
  • 技术积分: 427
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-21 20:45
文章分类

全部博文(56)

文章存档

2018年(9)

2017年(10)

2016年(33)

2012年(4)

我的朋友

分类: LINUX

2018-04-18 12:45:51


点击(此处)折叠或打开

  1. ------------------------内核锁:------------------------
  2. 原子锁:    x86使用独占系统总线。
  3. 自旋锁:     使用时不能睡眠,spin_lock spin_lock_irq spin_lock_irqsave spin_lock_bh .
  4.             使用try的是非阻塞版本 spin_trylock_irqsave spin_trylock_bh
  5. 读写锁:     是自旋锁的细分,因为拿不到锁也会自旋。read_lock write_lock
  6. 信号量:    相对自旋锁,允许调用他的线程进入睡眠状态。sema_init 、DECLARE_MUTEX(count==1)
  7.             down 、up、即使不是信号量的拥有者也能调用up释放一个信号量。
  8.             https://blog.csdn.net/gatieme/article/details/50994533
  9. 读取者和写入者信号量:DECLARE_RWSEM init_rwsem、down_read、up_read。down_write,up_write.
  10. 互斥锁mutex:实现原理同信号量 == 1时。DEFINE_MUTEX/ mutex_init。mutex_lock。获取锁的进程会
  11.     在尽可能短的时间里释放,因为当前进程在进入wait_list之前会多次检查该锁是否已经被释放。
  12. 顺序锁seqlock:spinlock在多个写入者之间互斥。读取者:读取前读取sequence read_seqbegin --
  13.     读取数据-- 读取sequence(read_seqretry)。 写入者:在开始写入时更新sequence。
  14.     DEFINE_SEQLOCK/seqlock_init,write_seqlock。write_tryseqlock(不进入自旋状态)。
  15.     和rwlock相似,当要保护的资源很小很简单时,
  16.     会很频繁被访问并且写入操作很少发生且必须快速时,使用seqlock。
  17. RCU:读临界区:关抢占、不能睡眠,也就是意味着:该期间不会发送进程切换。写临界区:指针替换是
  18.     原子操作,关键是释放旧数据的时机,调用call_rcu函数注册回调函数。
  19.     因此内核确定没有对老指针的引用的条件是:系统中所有处理器上都至少发生了一次进程切换。
  20.     rcu_read_lock -- rcu_dereference -- rcu_read_unlock.
  21.     kmalloc -- rcu_assign_pointer -- call_rcu/synchronize_rcu. synchronize_rcu可能会阻塞,
  22.     如果在中断上下文中执行写入者操作不能用synchronize_rcu,只能用call_rcu。
  23. 等待队列:DECLARE_WAIT_QUEUE_HEAD、 init_waitqueue_head,是完成量的实现基础。
  24. 完成量:实现基于等待队列,DECLARE_COMPLETION/INIT_COMPLETION/init_completion。wait_for_completion、

  25. 内存屏障:内存屏障也隐含了编译屏障的作用,编译屏障指令barrier()。volatile mb(), rmb(), wmb()
  26.     基于( lfence,sfence,和mfence) 。Smp_mb Smp_rmb Smp_wmb
  27.     乱序,并非是全乱执行,它只是对于没有依赖性的指令乱序执行
  28.     内存屏障解决的是load/store的乱序问题,不是cache一致性问题,cache一致性问题由cache snooping协议保证,intel x86的规范是MESI
  29.     barrier()宏:
  30.         CPU越过内存屏障后,将刷新自己对存储器的缓冲状态,可使gcc在barrier()之后invalidate cache重新读内存。
  31.         
  32.     在单CPU中,smp_*mb*()只是一个compiler barrier,仅仅是防止编译器错误地优化访问内存代码:
  33.     #define barrier() __asm__ __volatile__("":::"memory") https://blog.csdn.net/njuitjf/article/details/20448959
  34.     volatile告诉编译器,这段代码不能忽略, "memory" 是编译器的clobber,告诉编译器,
  35.     1. 内存信息已经修改,在这条指令后面的寄存器的值必须从内存中重新获取
  36.     2. 代码的先后顺序必须按照原有的产生汇编代码
  37.     在SMP中,smp_*mb*()是一个hardware barrier和compiler barrier的组合
  38.     https://blog.csdn.net/world_hello_100/article/details/50131497
  39.     http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=14528823&id=4337007
  40.     http://dingdingji.iteye.com/blog/2075292
  41. 每cpu变量:    percpu_counter 和 DEFINE_PER_CPU per_cpu __this_cpu_ptr
  42.     http://blog.chinaunix.net/uid-25002135-id-3012953.html
  43.     
  44. ------------------------用户态锁:------------------------
  45. 原子操作:    __sync_fetch_and_add
  46. 自旋锁:    pthread_spin_init -- pthread_spin_lock --pthread_spin_destroy
  47. 读写锁:    pthread_rwlock_init -- pthread_rwlock_rdlock --pthread_rwlock_wrlock -- pthread_rwlock_destroy
  48. 信号量:    分为POSIX信号量(有名信号量(保存在文件,线程/进程)和无名信号量(保存在内存,线程/有亲缘关系的进程))和SYSTEM V信号量。
  49.         POSIX信号量:<semaphore.h> 多用于线程,有名的也可以用于进程
  50.             无名:一般用于线程同步,是进程持续的,sem_init sem_wait    sem_post sem_destroy
  51.             有名:一般用于进程同步,是内核持续的,sem_open sem_wait sem_post sem_close sem_unlink
  52.         SYSTEM V信号量:<sys/sem.h> 多用于进程,且是内核持续的,SYSTEM V 相对更复杂
  53.             semget semctl semop, 如果设置了SEM_UNDO标志,进程结束时,相应的操作将被取消。
  54.         https://blog.csdn.net/silent123go/article/details/52763420
  55.         http://www.360doc.com/content/12/0722/23/9298584_225895213.shtml
  56. 互斥锁:    pthread_mutex_init -- pthread_mutex_lock -- pthread_mutex_destroy pthread_mutexattr_setpshared pthread_mutexattr_settype
  57.      互斥锁,是一种信号量, 一般用在线程间,当然可以通过设置互斥锁的属性让它在进程间使用
  58.      https://blog.csdn.net/silent123go/article/details/52760590
  59. 用户态RCU:
  60. 记录锁fcntl:可以用来对有亲缘或无亲缘关系的进程进行文件读与写的同步
  61.     https://blog.csdn.net/anonymalias/article/details/9197641
  62.     Linux文件锁学习-flock, lockf, fcntl https://www.cnblogs.com/charlesblc/p/6287631.html
  63. 条件变量:pthread_cond_init pthread_cond_destroy pthread_cond_signal pthread_cond_broadcast pthread_cond_wait要和mutex配合使用
  64.     https://blog.csdn.net/tuanxuan123/article/details/51699005

  65. 注意:
  66.     local_irq_enable local_irq_save的区别:
  67.         第一个版本将local_irq_save保存的flags状态值恢复, 而local_irq_enable无条件打开中断.
  68.         disable_irq不同, local_irq_disable不会维护对多次的调用的跟踪。
  69.         如果调用链中有多个函数需要禁止中断, 应该使用local_irq_save.
  70.     semget sem_init sema_init的区别        
  71.         https://blog.csdn.net/gatieme/article/details/50994533
  72.     信号量和自旋锁比较:
  73.         信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下
  74.         文使用(_trylock的变种能够在中断上下文使用),而自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用。
  75.         http://blog.chinaunix.net/uid-24069997-id-341674.html
  76.         
  77. ------------------------用户态锁:end------------------------


阅读(2635) | 评论(0) | 转发(0) |
0

上一篇:svn代码回滚命令

下一篇:没有了

给主人留下些什么吧!~~