Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157193
  • 博文数量: 152
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-08 15:46
文章分类

全部博文(152)

文章存档

2016年(152)

我的朋友

分类: LINUX

2016-06-02 14:03:46

原文地址:消逝的BKL 作者:tekkamanninja

在研究ioctl的消失时,碰到了BKL。顺便看了一下BKL的问题。
1、大内核锁起源
     BKL是一个被内核抛弃的同步机制,用于避免在SMP系统中出现多个处理器并行处理临界区(可能是设备)。
     当初的目的应该是为了稳定地渡过早期Linux支持SMP时的过渡期,在保证稳定的基础上慢慢地向细粒度锁过渡。
     据说BKL是在Linux-2.2时期加入的,git追踪不到~~,先暂且道听途说下吧。

2、先用大锁的缘由
    为什么要先用大锁,然后向小锁过渡?
    这个应该为了稳定。这点从《LDD3》中的《第五章 并发和竞态》中“锁陷阱--细粒度锁和粗粒度锁的对比”的介绍中可以找到理论依据:

  1.     作为通用的规则,我们应该在最初使用粗粒度的锁,除非有真正的原因相信竞争会导致问题。我们需要抑制自己过早考虑优化的欲望,应为真正的性能约束通常出现在非预期的情况下。

3、BKL的缺点
     这个机制的缺点在于它是一个全局的大锁(或者说一把锁保护一个很大的临界区),只要一个处理器进入了临界区,加了锁,其他处理器就进不了临界区。这导致了SMP系统在陷入内核之后就好像是单核处理一样(这彻底解决了SMP在内核态的竞态),几乎是在应用层才有多核并行,这严重制约了SMP的性能。

~~~~~~~~~~~~~~~~~~~~~~~~~~~

关于BKL的详细介绍,请看:转载好文:《大内核锁将何去何从》

~~~~~~~~~~~~~~~~~~~~~~~~~~~

4、BKL的替代
     必然的,为改善性能,之后的内核慢慢地包含了更细粒度的锁以替代这个大内核锁。在内核中不鼓励使用BKL。事实上,新代码中不再使用BKL。这样慢慢地缩小BKL的使用范围,用小锁接管。通过使用小锁来保护每一个小的临界区(例如单个设备),比如使用自旋锁和互斥体等等。

5、消失的具体时间

    通过对Linux内核代码的git搜索,可以追查到彻底删除BKL的那个提交:

  1. commit f74b9444192c60603020c61d7915b72893137edc
  2. Merge: 7a63628 4ba8216
  3. Author: Linus Torvalds
  4. Date: Wed Mar 16 17:21:00 2011 -0700
  5. Merge branch 'config' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/bkl
  6. * 'config' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/bkl:
  7. BKL: That's all, folks
  8. fs/locks.c: Remove stale FIXME left over from BKL conversion
  9. ipx: remove the BKL
  10. appletalk: remove the BKL
  11. x25: remove the BKL
  12. ufs: remove the BKL
  13. hpfs: remove the BKL
  14. drivers: remove extraneous includes of smp_lock.h
  15. tracing: don't trace the BKL
  16. adfs: remove the big kernel lock

     找到了这个提交,好的,这样就可以确定消失的时间了:

  1. tekkaman@Super-MAGI:~/NAS_NFS/development_resource/Linux_kernel/linux.git$ git tag --contains f74b944
  2. v2.6.39
  3. v2.6.39-rc1
  4. v2.6.39-rc2
  5. v2.6.39-rc3
  6. v2.6.39-rc4
  7. v2.6.39-rc5
  8. v2.6.39-rc6
  9. v2.6.39-rc7
  10. ......以下省略ooxx行

    可以证明ioctl消失的版本是v2.6.38到v2.6.39-rc1间其中删除了3个BKL的源码文件:

  1. include/linux/smp_lock.h
  2. include/trace/events/bkl.h
  3. lib/kernel_lock.c

阅读(526) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~