This document discusses CPU scheduling in operating systems. It covers basic scheduling concepts like multiprogramming and preemptive scheduling. It then describes the role of the scheduler and dispatcher in selecting which process runs on the CPU. Several common scheduling algorithms are explained like first-come first-served, shortest job first, priority scheduling, and round robin. Factors for evaluating scheduling performance and examples of scheduling in Linux and real-time systems are also summarized.