Université des Sciences et Technologies de Lille
Licence Miage - Programmation 1 - TP



Répartition de charges




Un problème d'ordonnancement, dans sa version la plus simple, peut être formulé ainsi. On dispose d'un côté de n tâches, de l'autre d'une machine multi-processeurs sur laquelle les tâches doivent s'exécuter. Il s'agit de savoir dans quel ordre traiter les tâches, et sur quel processeur les affecter pour obtenir une durée globale d'exécution satisfaisante.

Ici, nous acceptons les hypothèses suivantes :

1ère Méthode

Une solution pour ce problème consiste à traiter les n tâches par ordre de durée décroissante, et à affecter une tâche dès qu'un processeur est libre.

Écrire une procédure Ordonnancement qui prend en arguments un ensemble de tâches, figuré par un tableau d'entiers, un nombre k de processeurs, et qui affiche l'affectation de chacune des tâches, ainsi que la durée globale d'exécution. Bien sûr, vous pouvez (et même, vous devez) utiliser votre travail précédent sur les tris.

La procédure Ordonnancement fournit-elle toujours la solution optimale, c'est-à-dire celle de durée minimale ? Regardez ce qui se passe avec l'affectation de cinq tâches de durée 6, 6, 4, 4 et 4 sur deux processeurs.

2ème Méthode

Devant l'échec relatif de la première approche, nous allons essayer une autre voie. Le nouvel algorithme procède par examen systématique de toutes les affectations possibles et conserve la meilleure. Pour simplifier le problème, on se restreint à des machines bi-processeurs (k=2). Une affectation globale est alors représentée par un tableau de booléens : True pour le premier processeur, False pour le second, par exemple. On définit le type

     type Affectation is array(Natural range <>) of Boolean;
1. Le premier travail demandé par l'algorithme est de savoir énumérer toutes les affectations possibles de n tâches sur deux processeurs. Pour cela, on peut classer les affectations comme des nombres binaires, de (False, ..., false) à (True, ..., True). Écrire une fonction
     Suivante(A:Affectation) return Affectation
qui retourne l'affectation qui succède à A dans l'ordre d'énumération.


2. Écrire une fonction Duree qui prend en argument un ensemble de tâches, une affectation et renvoie la durée globale d'éxécution.


3. Écrire une procédure Ordonnancement2 qui prend en argument un ensemble de tâches et qui affiche l'affectation optimale, ainsi que la durée globale d'exécution. Que pensez-vous de la complexité de ce nouvel algorithme ?