In a multi-tasking operating system, one of the most fundamental operations is process scheduling. In any system where you would like to be able to run multiple processes concurrently on a machine with a single processor, some form of process scheduling must take place. This is obvious when you consider that, at any particular instant, the CPU can only be executing a single instruction, and that on behalf of a single process. For several processes to be making progress on the machine together, the CPU time must be shared between the processes that are ready to rim. The task of the scheduler, then, is to choose which of the processes that are ready to run should be allocated the CPU next.