Various prototypes of scheduling problems in production systems, project management, and computer systems are discussed in view of resources and tasks, problem structure, performance measures, and complexity. Complexity analysis, specialized solution algorithms for each prototype, and the use of general solution techniques like mixed integer programming, network and combinatorial optimization techniques, dynamic programming, branch and bound techniques, and other recent search techniques are explained. Also, queueing theory, stochastic analysis, and simulation techniques for dynamic or stochastic scheduling problems are also introduced.