1. Determines which applications should run in what order and how much time should be allowed for each application before giving another application a turn
2. Manages the sharing of internal memory among multiple applications
3. Handles input and output to and from attached hardware devices, such as hard disks, printers, and dial-up ports
4. Manages how to divide the program so that it runs on more than one processor at a time
5. Sends messages to each application or interactive user (or to a system operator) about the status of operation and any errors that may have occurred