Task Scheduling for Multi-core and Parallel Architectures: Challenges, Solutions and Perspectives