在研究ioctl的消失时,碰到了BKL。顺便看了一下BKL的问题。
1、大内核锁起源
BKL是一个被内核抛弃的同步机制,用于避免在SMP系统中出现多个处理器并行处理临界区(可能是设备)。
当初的目的应该是为了稳定地渡过早期Linux支持SMP时的过渡期,在保证稳定的基础上慢慢地向细粒度锁过渡。
据说BKL是在Linux-2.2时期加入的,git追踪不到~~,先暂且道听途说下吧。
2、先用大锁的缘由
为什么要先用大锁,然后向小锁过渡?
这个应该为了稳定。这点从《LDD3》中的《第五章 并发和竞态》中“锁陷阱--细粒度锁和粗粒度锁的对比”的介绍中可以找到理论依据:
- 作为通用的规则,我们应该在最初使用粗粒度的锁,除非有真正的原因相信竞争会导致问题。我们需要抑制自己过早考虑优化的欲望,应为真正的性能约束通常出现在非预期的情况下。
3、BKL的缺点
这个机制的缺点在于它是一个全局的大锁(或者说一把锁保护一个很大的临界区),只要一个处理器进入了临界区,加了锁,其他处理器就进不了临界区。这导致了SMP系统在陷入内核之后就好像是单核处理一样(这彻底解决了SMP在内核态的竞态),几乎是在应用层才有多核并行,这严重制约了SMP的性能。
~~~~~~~~~~~~~~~~~~~~~~~~~~~
关于BKL的详细介绍,请看:转载好文:《大内核锁将何去何从》
~~~~~~~~~~~~~~~~~~~~~~~~~~~
4、BKL的替代
必然的,为改善性能,之后的内核慢慢地包含了更细粒度的锁以替代这个大内核锁。在内核中不鼓励使用BKL。事实上,新代码中不再使用BKL。这样慢慢地缩小BKL的使用范围,用小锁接管。通过使用小锁来保护每一个小的临界区(例如单个设备),比如使用自旋锁和互斥体等等。
5、消失的具体时间
通过对Linux内核代码的git搜索,可以追查到彻底删除BKL的那个提交:
- commit f74b9444192c60603020c61d7915b72893137edc
-
Merge: 7a63628 4ba8216
-
Author: Linus Torvalds
-
Date: Wed Mar 16 17:21:00 2011 -0700
-
-
Merge branch 'config' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/bkl
-
-
* 'config' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/bkl:
-
BKL: That's all, folks
-
fs/locks.c: Remove stale FIXME left over from BKL conversion
-
ipx: remove the BKL
-
appletalk: remove the BKL
-
x25: remove the BKL
-
ufs: remove the BKL
-
hpfs: remove the BKL
-
drivers: remove extraneous includes of smp_lock.h
-
tracing: don't trace the BKL
-
adfs: remove the big kernel lock
找到了这个提交,好的,这样就可以确定消失的时间了:
- tekkaman@Super-MAGI:~/NAS_NFS/development_resource/Linux_kernel/linux.git$ git tag --contains f74b944
-
v2.6.39
-
v2.6.39-rc1
-
v2.6.39-rc2
-
v2.6.39-rc3
-
v2.6.39-rc4
-
v2.6.39-rc5
-
v2.6.39-rc6
-
v2.6.39-rc7
-
......以下省略ooxx行
可以证明ioctl消失的版本是v2.6.38到v2.6.39-rc1间,其中删除了3个BKL的源码文件:
- include/linux/smp_lock.h
-
include/trace/events/bkl.h
-
lib/kernel_lock.c
阅读(413) | 评论(0) | 转发(0) |