It is important to distinguish preemptive from non-preemptive scheduling algorithms.
Preemption means the operating system moves a process from running to ready without the process requesting it.
Without preemption, the system implements ``run to completion (or yield or block)''.
The ``preempt'' arc in the diagram.
We do not consider yield (a solid arrow from running to ready).
Preemption needs a clock interrupt (or equivalent).
Preemption is needed to guarantee fairness.
Found in all modern general purpose operating systems.
Even non preemptive systems can be multiprogrammed (e.g., when processes block for I/O)"