The operating system controls the computer itself and provides a useful interface for users and application programs. The operating system controls all the computer resources: processors, main storage, secondary storage, I/O devices, and files. It determines which programs will be in memory at any given time and the order in which programs will run. The operating system should resolve conflicts between processes, attempt to optimize the performance of the computer, allow the computer to communicate with other computers, and maintain a record of actions performed as it goes about its system tasks. This course investigates the basic design issues encountered in order to produce an operating system that can address the above problems in an efficient manner. These concepts are reinforced by a series of programming projects that include both design and implementation.