Saya bukan guru penjadwalan, tetapi saya ingin menjelaskan bagaimana saya melihatnya.Berikut adalah beberapa hal.
- preempt_disable() tidak menonaktifkan IRQ . Itu hanya meningkatkan
thread_info->preempt_count
variabel. - Menonaktifkan interupsi juga menonaktifkan preemption karena penjadwal tidak berfungsi setelah itu - tetapi hanya pada mesin CPU tunggal. Di SMP itu tidak cukup karena ketika Anda menutup interupsi pada satu CPU, yang lain/yang lain masih melakukan/melakukan sesuatu secara asinkron.
- Kunci Besar (artinya - menutup semua interupsi pada semua CPU) memperlambat sistem secara dramatis - jadi itu sebabnya tidak lagi digunakan. Ini juga alasan mengapa preempt_disable() tidak menutup IRQ.
Anda dapat melihat apa itu preempt_disable(). Coba ini:1. Dapatkan spinlock.2. Jadwal panggilan()
Di dmesg Anda akan melihat sesuatu seperti "BUG:penjadwalan saat atom". Ini terjadi ketika penjadwal mendeteksi bahwa proses Anda dalam konteks atomik (bukan preemptive) tetapi menjadwalkannya sendiri.
Semoga berhasil.
Dalam modul pengujian kernel yang saya tulis untuk memantau/memprofilkan tugas, saya telah mencoba menonaktifkan interupsi dengan:
1 - Menggunakan local_irq_save()
2 - Menggunakan spin_lock_irqsave()
3 - Disable_irq() secara manual ke semua IRQ di /proc/interrupts
Dalam semua 3 kasus saya masih bisa menggunakan hrtimer untuk mengukur waktu meskipun IRQ dinonaktifkan (dan tugas yang saya pantau juga sudah didahului).
Saya menemukan ini veeeeerrrryyyy aneh ... Saya pribadi mengantisipasi apa yang ditunjukkan oleh Sebastian Mountaniol -> Tidak ada interupsi - tidak ada jam. Tanpa jam - tanpa pengatur waktu...
Kernel Linux 2.6.32 pada satu inti, satu CPU... Adakah yang bisa memiliki penjelasan yang lebih baik?