Process vs.Atomic Context (Slideshow)#
Process Context#
Process context: everything that can be identified by a process ID
Processes (and threads) that execute in user mode ⟶ process address space
Processes (and threads) that execute in kernel mode ⟶ kernel address space
Kernel threads ⟶ kernel address space
Preemption …
Process context is subject to scheduling
Fair scheduling: preemption at end of time slice (or after voluntary sleep)
Realtime: preemption when higher priority process/thread is runnable
Race Conditions#
When do race conditions occur?
Two processes/threads share the same address space
Manipulate the same data structure
In kernel address space?
Userspace processes executing a system call (“switch to kernel mode”)
Kernel threads
Protection through locking
Mutexes: locker has to wait until unlocked
Spinlocks: locker loops until unlocked (on different CPU obviously)
Atomic context
Atomic Context#
Atomic context is where code must not sleep!
Interrupt service routine
Interrupts disabled
No preemption, no scheduling, no nothing
⟶ primary source of latency
Bottom half - code that runs in interrupt context (not subject to scheduling), but interrupts are already enabled
Deferred work ⟶ “tasklet”, “soft-IRQ”
Best avoided because not easily controllable, realtime-wise
All code that holds a spinlock
Atomic vs. Process Context#
Atomic context must not sleep
Preemption disabled ⟶ prioritization impossible
High latency if atomic code runs for too long
Severe restrictions
Paging
Locking is difficult
…
Process context …
Subject to scheduling ⟶ easily prioritized (be it realtime or not)
Easy locking
Conclusion
Atomic context best avoided
… at least when absolute control is desired
“Sleep While Atomic” Debugging#
⟶ CONFIG_DEBUG_ATOMIC_SLEEP
