Algorithms for task scheduling in heterogeneous computing environments