Algorithms
Main server reads configuration file and starts Bandwidth Manager (BM), which maintains bandwidth information
BM periodically reduces average bandwidth (exponentially to zero) of inactive client
Child process can have request in one of three stages: Processing, Delayed, or Rejection
Processing includes reading file and sending it over network
Once admitted for processing, child updates and accesses bandwidth information (protected by a semaphore)
Child delays request using sleep() with delay equals difference between time allowed (based on bandwidth available to client) and least time with no delay (based on maximum measured bandwidth)