This document discusses solutions to the critical-section problem in operating systems. It describes the critical-section problem, which involves processes accessing shared resources and needing to prevent concurrent access to critical sections. It outlines three requirements for a solution: mutual exclusion, progress, and bounded waiting. Two general approaches are described - preemptive and nonpreemptive kernels. Peterson's solution and use of synchronization hardware like mutex locks and semaphores are presented as classic software solutions to enforce mutual exclusion between processes in critical sections.