The CPU Scheduler is invoked and must make a decision in every one of the following 4 scenarios:
In case the running process starts waiting or terminates, the Scheduler must run a different process on the CPU.
A CPU Scheduler that lets a process run on the CPU until it starts waiting or terminates is called a non-preemptive (also: cooperative) scheduler. Otherwise, if the Scheduler forcefully removes a running process from the CPU (and puts it into the ready state) and instead lets a different process run on the CPU, the Scheduler is called preemptive.