Nejsem guru plánovačů, ale rád bych vysvětlil, jak to vidím já. Zde je několik věcí.
- preempt_disable() nezakáže IRQ . Pouze se zvýší
thread_info->preempt_count
proměnná. - Zakázání přerušení také zakáže preempci, protože plánovač poté nefunguje – ale pouze na počítači s jedním CPU. Na SMP to nestačí, protože když zavřete přerušení na jednom CPU, druhý / ostatní stále dělají / dělají něco asynchronně.
- Big Lock (znamená - uzavření všech přerušení na všech CPU) dramaticky zpomaluje systém - proto se již nepoužívá. To je také důvod, proč preempt_disable() neuzavře IRQ.
Můžete vidět, co je preempt_disable(). Zkuste toto:1. Získejte spinlock.2. Plán hovorů()
V dmesg uvidíte něco jako "BUG:scheduling while atomic". K tomu dojde, když plánovač zjistí, že váš proces je v atomickém (nikoli preemptivním) kontextu, ale naplánuje se sám.
Hodně štěstí.
V modulu testovacího jádra, který jsem napsal za účelem monitorování/profilování úlohy, jsem se pokusil zakázat přerušení pomocí:
1 – Použití local_irq_save()
2 - Použití spin_lock_irqsave()
3 – Ručně zakázat_irq() všem IRQ v /proc/interrupts
Ve všech 3 případech jsem stále mohl používat hrtimer k měření času, i když byly IRQ zakázány (a úkol, který jsem monitoroval, byl také vyloučen).
Připadá mi to veeeeerrrryyyy divné... Osobně jsem očekával to, na co upozornil Sebastian Mountaniol -> Žádná přerušení - žádné hodiny. Žádné hodiny – žádné časovače...
Linuxové jádro 2.6.32 na jednom jádru, jediném CPU... Může někdo mít lepší vysvětlení?