We understood in Chapter 1, Comprehending Processes, Address Space, and Threads that user-mode processes invoke system calls to switch into kernel mode for executing kernel services. When a process enters a kernel service routine, there is a possibility of the routine being blocked for availability of resources (for example, wait on exclusion lock) or occurrence of an event (such as interrupts). Such blocking operations require the caller process to be put into the TASK_INTERRUPTIBLE,
TASK_UNINTERRUPTIBLE
, orTASK_KILLABLE
state. The specific state effected depends on the choice of blocking call invoked in the system calls.
If the caller task is put into the TASK_UNINTERRUPTIBLE
state, occurrences of signals on that task are generated, causing them to enter the pending list, and are delivered to the process only after completion of the service routine (on its return path to user mode). However, if the task was put into the TASK_INTERRUPTIBLE
state, occurrences...