It handles input and output process
It sends messages to each application or interactive user about the status of operation and any errors
It can off load the management of what are called batch jobs so that the initiating application is freed from this work (i.e. print spool)
It can manage how to divide the program (in parallel processing)