BKL: Código de 2.0, quando SMP foi introduzido: artigo do Alan Cox sobre SMP no 2.0. Existe deste então. No entanto, sua característica é permitir que apenas um processador execute código de kernel space. Por isso, foram criados os demais mecanismos para evitar concorrência, como spinlock. TODO: verificar de quando é spinlock e referenciar texto do Linus em Documentation/. O BKL ainda se encontra hoje no código do Linux e muitos tem tentado removê-lo. Um dos maiores obstáculos é o subsistema de tty, que ainda é um código bem antigo. -- Condições de corrida: exemplos clássicos!?! Clássico exemplo do incremento. Sessão crítica. Uma interrupção pode acontecer, e o código de interrupção geralmente é uma sessão crítica. Em sistemas SMP, outro processador pode executar a mesma sessão crítica. O escalonador pode executar (provavelmente, ocorreu uma interrupção, como o timer) e executar outro processo que executará a mesma sessão crítica. Para tanto, desabilitar interrupções é uma opção. Mas, muitas vezes, não é a melhor. Em sistemas SMP, pode não ser suficiente. Com a preempção suportada (escalonador pode ser executado em uma CPU mesmo quando ela executa código em kernel space) (TODO: estudar melhor as três opções atuais de preempção), outros problemas, antes não existentes aparecem. (TODO: quais? exemplos!) smp_processor_id: o escalonador pode executar e trocar o processo de CPU. Desabilitar preempção basta. TODO: Mais referências Exemplos Mais e melhores descrições dos problemas e das soluções Referências: Livros acadêmicos sobre sistemas operacionais Documentação histórica do Linux sobre as soluções que foram surgindo Código de preempção, interrupção global, softirq/BH.