When I'm talking preemptive I simply mean something can undergo a context switch and not bomb out when it returns. For NT anything up in user mode will work golden like this. I'm sure linux has some ring that does the same. Down in kernel mode it gets a bit more complicated. Not everything can be preempted without problems. Some actions must be atomic so semaphores, locks and the like are used to make them survive the preemption.
IRQLs handle pretty much everything else. They provide a nifty method to determine what can and cannot be preempted (ie you can preempt my i8042prt.sys keyboard driver any time you want...except when the IRQL is jacked way up while it's pulling something off the buffer...prempting at this point could result in data coming off a fifo buffer but the buffer pointer not getting updated)
So there are always going to be components that are not preemptive (you can't preempt the preemption code for example 😛 ) but the details of the discussion are really silly. Both Linux and Windows are very much preemptive multitasking systems in every regard that counts.
IRQLs handle pretty much everything else. They provide a nifty method to determine what can and cannot be preempted (ie you can preempt my i8042prt.sys keyboard driver any time you want...except when the IRQL is jacked way up while it's pulling something off the buffer...prempting at this point could result in data coming off a fifo buffer but the buffer pointer not getting updated)
So there are always going to be components that are not preemptive (you can't preempt the preemption code for example 😛 ) but the details of the discussion are really silly. Both Linux and Windows are very much preemptive multitasking systems in every regard that counts.