linux内核启动需要时间,并且需要很多的时间,这是逃避不了的,了解linuxbios的朋友可能知道,linuxbios作为bios和别的bios相比启动的特别快,因为它把硬件检测的任务交给了linux内核而不是bios,毕竟bios检测完了内核再检测是一种浪费,为了bios的性能,把工作推给内核是不负责任的行为吗?其实不是,实际上启动时最耗时的操作就是硬件检测和初始化,正是因为如此,linuxbios才把如此艰巨的任务避开,一并给了操作系统内核。
那么内核能把这些任务给谁呢?它必须自己解决之,因为它是基础。为了加快启动速度,linux设计者将硬件检测和初始化的任务交给了很多的内核线程,这样的话,一个内核线程在检测初始化一个硬件等待的时候就可以去检测初始化另一个硬件,一个并行进行,在多cpu机器上会更好。依照linux的传统,一切都是进程,最起码你得有这个意思想让任务成为进程,在内核初始化期间,内核维护了两个链表,一个是pending链表,一个是running链表,将要检测饼初始化的硬件相关的函数加入pending链表就不用管了,linux强大的进程调度机制会很好的处理诸多硬件初始化内核线程的执行,另外,在内核初始化完成以后,这些内核线程的机制接口将长期保留,一旦有繁琐的任务需要并发执行仍然可以用和硬件检测初始化的内核线程的方式来完成,这个机制十分灵活。
我有一点不解的是,为何不能用更加统一的工作队列来实现呢?难道工作队列的并行性不好吗?