The term
preemptive multitasking is used to distinguish a
multitasking operating system, which permits preemption of tasks, from a
cooperative multitasking system wherein processes or tasks must be explicitly programmed to
yield when they do not need system resources. In simple terms: Preemptive multitasking involves the use of an
interrupt mechanism which suspends the currently executing process and invokes a
scheduler to determine which process should execute next. Therefore, all processes will get some amount of CPU time at any given time. In preemptive multitasking, the operating system
kernel can also initiate a
context switch to satisfy the
scheduling policy's priority constraint, thus preempting the active task. In general, preemption means "prior seizure of". When the high-priority task at that instance seizes the currently running task, it is known as preemptive scheduling. The term "preemptive multitasking" is sometimes mistakenly used when the intended meaning is more specific, referring instead to the class of scheduling policies known as
time-shared scheduling, or
time-sharing. Preemptive multitasking allows the computer system to more reliably guarantee each process a regular "slice" of operating time. It also allows the system to rapidly deal with important external events like incoming data, which might require the immediate attention of one or another process. At any specific time, processes can be grouped into two categories: those that are waiting for input or output (called "
I/O bound"), and those that are fully utilizing the CPU ("
CPU bound"). In early systems, processes would often "
poll" or "
busy-wait" while waiting for requested input (such as disk, keyboard or network input). During this time, the process was not performing useful work, but still maintained complete control of the CPU. With the advent of interrupts and preemptive multitasking, these I/O bound processes could be "blocked", or put on hold, pending the arrival of the necessary data, allowing other processes to utilize the CPU. As the arrival of the requested data would generate an interrupt, blocked processes could be guaranteed a timely return to execution. Although multitasking techniques were originally developed to allow multiple users to share a single machine, it became apparent that multitasking was useful regardless of the number of users. Many operating systems, from mainframes down to single-user personal computers and no-user
control systems (like those in
robotic spacecraft), have recognized the usefulness of multitasking support for a variety of reasons. Multitasking makes it possible for a single user to run multiple applications at the same time, or to run "background" processes while retaining control of the computer.
Time slice The period of time for which a process is allowed to run in a preemptive multitasking system is generally called the
time slice or
quantum. The scheduler is run once every time slice to choose the next process to run. The length of each time slice can be critical to balancing system performance vs process responsiveness - if the time slice is too short then the scheduler itself will consume too much processing time, but if the time slice is too long, processes will take longer to respond to input. An
interrupt is scheduled to allow the
operating system kernel to switch between processes when their time slices expire, effectively allowing the processor's time to be shared among a number of tasks, giving the illusion that it is dealing with these tasks in parallel (simultaneously). The operating system which controls such a design is called a multi-tasking system.
System support Today, nearly all operating systems support preemptive multitasking, including the current versions of
Windows,
Linux (including
Android), and
Darwin (including
macOS and
iOS). An early microcomputer operating system providing preemptive multitasking was
Microware's
OS-9, available for computers based on the
Motorola 6809, including home computers such as the
TRS-80 Color Computer 2 when configured with disk drives, with the operating system supplied by Tandy as an upgrade.
Sinclair QDOS and
AmigaOS on the
Amiga were also microcomputer operating systems offering preemptive multitasking as a core feature. These both ran on
Motorola 68000-family
microprocessors without memory management. Amiga OS used
dynamic loading of relocatable code blocks ("
hunks" in Amiga jargon) to multitask preemptively all processes in the same flat address space. Early operating systems for
IBM PC compatibles such as
MS-DOS and
PC DOS, did not support multitasking at all, however alternative operating systems such as
MP/M-86 (1981) and
Concurrent CP/M-86 did support preemptive multitasking. Other
Unix-like systems including
MINIX and
Coherent provided preemptive multitasking on 1980s-era personal computers. Later
MS-DOS compatible systems natively supporting preemptive multitasking/multithreading include
Concurrent DOS,
Multiuser DOS,
Novell DOS (later called
Caldera OpenDOS and
DR-DOS 7.02 and higher). Since
Concurrent DOS 386, they could also run multiple DOS programs concurrently in
virtual DOS machines. The earliest version of Windows to support a limited form of preemptive multitasking was
Windows/386 2.0, which used the
Intel 80386's
Virtual 8086 mode to run DOS applications in
virtual 8086 machines, commonly known as "DOS boxes", which could be preempted. In
Windows 95, 98 and Me, 32-bit applications were made preemptive by running each one in a separate address space, but 16-bit applications remained cooperative for backward compatibility. In Windows 3.1x (protected mode), the kernel and virtual device drivers ran preemptively, but all 16-bit applications were non-preemptive and shared the same address space. Preemptive multitasking has always been supported by
Windows NT (all versions),
OS/2 (native applications),
Unix and
Unix-like systems (such as
Linux,
BSD and
macOS),
VMS,
OS/360, and many other operating systems designed for use in the academic and medium-to-large business markets. Early versions of the
classic Mac OS did not support multitasking at all, with cooperative multitasking becoming available via
MultiFinder in
System Software 5 and then standard in
System 7. Although there were plans to upgrade the cooperative multitasking found in the classic Mac OS to a preemptive model (and a preemptive API did exist in
Mac OS 9, although in a limited sense), these were abandoned in favor of
Mac OS X (now called macOS) that, as a hybrid of the old Mac System style and
NeXTSTEP, is an operating system based on the
Mach kernel and derived in part from
BSD, which had always provided Unix-like preemptive multitasking. == See also ==