Rapid advances in communications technology and the proliferation of inexpensive PCs and workstations have created a wide avenue for Distributed Computing Systems to move into mainstream computing. A Distributed Computing System (DCS) consists of a number of PCs or workstations interconnected through PPP, LAN or WAN. These systems provide a higher performance, better reliability and throughput over centralized mainframe systems. Clearly, we have a set of M tasks connected in some fashion and a heterogeneous DCS composed of N computers of di erent capabilities. Tasks of a given application require certain computer resources (memory, processor and communication link). Indeed, computers and communication resources in the system are also capacitated. For these reasons, the issue is how to assign (allocate/schedule) the tasks of a given application onto the available computers of the system so as to maximize the system throughput i.e. minimize the total sum of execution and communication costs.