Fedora-ARM
全部博文(241)
分类: LINUX
2011-11-13 23:00:50
在研究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的那个提交:
找到了这个提交,好的,这样就可以确定消失的时间了:
可以证明ioctl消失的版本是v2.6.38到v2.6.39-rc1间,其中删除了3个BKL的源码文件: