Algorithme du banquier

Cet article est une ébauche concernant l’informatique.

Vous pouvez partager vos connaissances en l’améliorant (comment ?) selon les recommandations des projets correspondants.

L'algorithme du banquier est un algorithme qui a été mis au point par Edsger Dijkstra en 1965[1] pour éviter les problèmes d'interblocage et gérer l'allocation des ressources.

Cet algorithme est nommé ainsi car il reproduit le modèle du prêt à des clients par un banquier.

Énoncé du problème

On considère un système disposant de n {\displaystyle n} types de ressource, dont la quantité totale est connue, constante et finie. Sur ce système, un nombre fini m {\displaystyle m} processus. L'état initial du système est caractérisé par la quantité de ressource de chaque type que consomme chacun des processus.

Lorsqu'on alloue à un processus l'ensemble des ressources dont il a besoin, le processus se termine en temps fini et libère les ressources qu'il utilisait. Ceci correspond à un changement d'état.

Le but du problème est de déterminer s'il existe au moins une séquence d'états permettant de terminer l'ensemble des processus. Dans ce cas, l'état initial est dit sûr.

Algorithme

L'algorithme du banquier part du principe que si l'on alloue les ressources à un processus et que celui-ci se termine, on se retrouve dans une situation avec plus de ressources disponible. En conséquence, on peut choisir de manière gloutonne un processus parmi ceux en cours d'exécution et dont les besoins sont compatibles avec les ressources disponibles.

Si l'on parvient à exécuter tous les processus, on a mis en évidence que l'état initial était sûr.

Si par contre, l'algorithme ne parvient plus à progresser alors certains processus sont toujours en cours d'exécution, l'état initial n'est pas sûr et l'algorithme s'interrompt car l'état initial n'est pas sûr.

Paramètres :

  • n N {\displaystyle n\in \mathbb {N} ^{*}} le nombre de ressources.
  • m N {\displaystyle m\in \mathbb {N} ^{*}} le nombre de processus.
  • a v a i l a b l e {\displaystyle available} le vecteur de taille n {\displaystyle n} tel que a v a i l a b l e [ j ] {\displaystyle available[j]} indique la quantité de ressource j {\displaystyle j} disponible.
  • a l l o c a t e d {\displaystyle allocated} la matrice de taille m × n {\displaystyle m\times n} telle que a l l o c a t e d [ i , j ] {\displaystyle allocated[i,j]} indique la quantité de ressource j {\displaystyle j} initialement allouée au processus i {\displaystyle i} .
  • n e e d {\displaystyle need} la matrice de taille m × n {\displaystyle m\times n} telle que n e e d [ i , j ] {\displaystyle need[i,j]} indique la quantité de ressource j {\displaystyle j} requises par le processus i {\displaystyle i} .

Algorithme :

  • Soit r e m a i n i n g {\displaystyle remaining} le vecteur de taille n {\displaystyle n} qui indique la quantité de ressource de chaque type encore disponible: j { 1 , . . . , n } , r e m a i n i n g [ j ] a v a i l a b l e [ j ] i = 1 m a l l o c a t e d [ i , j ] {\displaystyle \forall j\in \{1,...,n\},remaining[j]\leftarrow available[j]-\sum _{i=1}^{m}allocated[i,j]} .
  • Soit R {\displaystyle R} l'ensemble des processus en cours de lancement: R { 1 , . . . , m } {\displaystyle R\leftarrow \{1,...,m\}} .
  • Tant que R {\displaystyle R\neq \emptyset } :
    • Chercher i R {\displaystyle i\in R} tel que j { 1 , . . . , n } , r e m a i n i n g [ j ] ( n e e d [ i , j ] a l l o c a t e d [ i , j ] ) 0 {\displaystyle \forall j\in \{1,...,n\},remaining[j]-(need[i,j]-allocated[i,j])\geq 0} .
    • Si i {\displaystyle i} n'existe pas :
      • Retourner l'état initial n'est pas sûr.
    • Sinon :
      • Allouer au processus i {\displaystyle i} les ressources qu'il demande et attendre qu'il se termine
      • Terminer le processus i {\displaystyle i}  : R R { i } {\displaystyle R\leftarrow R\backslash \{i\}}
      • Libération des ressources consommées par i {\displaystyle i}  : j { 1 , . . . , n } , r e m a i n i n g [ j ] r e m a i n i n g [ j ] + a l l o c a t e d [ i , j ] {\displaystyle \forall j\in \{1,...,n\},remaining[j]\leftarrow remaining[j]+allocated[i,j]}
  • Retourner l'état initial est sûr.

Exemple

On considère dans cet exemple 5 processus actifs { P 1 , P 2 , P 3 , P 4 , P 5 } {\displaystyle \{P1,P2,P3,P4,P5\}} et mettant en jeu 4 ressources { A , B , C , D } {\displaystyle \{A,B,C,D\}} .

État à l'instant t d'un ordinateur : ressources actuellement attribuées et ressources demandées, pour cinq processus (P1 à P5) et quatre ressources (A à D)
Processus Ressources attribuées Ressources supplémentaires demandées
A B C D A B C D
P1 3 0 1 1 1 1 0 0
P2 0 1 0 0 0 1 1 2
P3 1 1 1 0 3 1 0 0
P4 1 1 0 1 0 0 1 0
P5 0 0 0 0 2 1 1 0
Total 5 3 2 2

La partie gauche du tableau correspond à l'état initial du système ( a l l o c a t e d {\displaystyle allocated} ). Il indique la quantité de ressource déjà allouée à chaque processus pour chacun des types de ressource. La somme de chaque colonne correspond donc à la quantité de ressources consommées d'un type donnée (on appelle ce vecteur intermédiaire t o t a l {\displaystyle total} ).

La partie droite du tableau correspond aux ressources supplémentaires demandées par chaque processus pour chaque type de ressource ( r e q u e s t e d {\displaystyle requested} ). Pour faire le lien avec les notations de la section précédente : i { 1 , . . . , m } , j { 1 , . . . , n } , n e e d [ i , j ] = a l l o c a t e d [ i , j ] + r e q u e s t e d [ i , j ] {\displaystyle \forall i\in \{1,...,m\},\forall j\in \{1,...,n\},need[i,j]=allocated[i,j]+requested[i,j]} .

Enfin, on suppose que la quantité restante pour chaque ressource correspond à r e m a i n i n g = ( 1 , 1 , 1 , 0 ) {\displaystyle remaining=(1,1,1,0)} .

L'algorithme du banquier revient à :

  1. Trouver dans le tableau de droite un processus P i {\displaystyle P_{i}} dont les ressources demandées sont toutes inférieures ou égales à celles de disponibles ( j { 1 , . . . , n } , r e q u e s t e d [ i , j ] r e m a i n i n g [ i ] {\displaystyle \forall j\in \{1,...,n\},requested[i,j]\leq remaining[i]} ). Si i {\displaystyle i} n'existe pas, il y a interblocage.
  2. Allouer à P i {\displaystyle P_{i}} les ressources demandées et attendre se termine.
  3. Supprimer la ligne associée à P i {\displaystyle P_{i}} et mettre à jour r e m a i n i n g {\displaystyle remaining} .
  4. Répéter les étapes précédentes jusqu'à ce que tous les processus soient terminés. Si on y parvient, l'état initial était donc sûr. Sinon il y a eu un interblocage et l'état initial n'était pas sûr.

Dans cet exemple, l'état actuel est sûr car :

  1. À la première itération, on choisit forcément P 4 {\displaystyle P_{4}} les ressources demandées (car ( 0 , 0 , 1 , 0 ) ( 1 , 1 , 1 , 0 ) {\displaystyle (0,0,1,0)\leq (1,1,1,0)} ). On attend que P 4 {\displaystyle P_{4}} s'achève. Une fois P 4 {\displaystyle P_{4}} terminé, r e m a i n i n g {\displaystyle remaining} passe à ( 1 , 1 , 1 , 0 ) + ( 1 , 1 , 0 , 1 ) = ( 2 , 2 , 1 , 1 ) {\displaystyle (1,1,1,0)+(1,1,0,1)=(2,2,1,1)} .
  2. À l'itération suivante, on peut choisir arbitrairement parmi P 1 {\displaystyle P_{1}} (car ( 1 , 1 , 0 , 0 ) ( 2 , 2 , 1 , 1 ) {\displaystyle (1,1,0,0)\leq (2,2,1,1)} ) ou P 5 {\displaystyle P_{5}} (car ( 2 , 1 , 1 , 0 ) ( 2 , 2 , 1 , 1 ) {\displaystyle (2,1,1,0)\leq (2,2,1,1)} ). Choisissons P 5 {\displaystyle P_{5}} . Une fois qu'il se termine, r e m a i n i n g {\displaystyle remaining} passe à ( 2 , 2 , 1 , 1 ) + ( 0 , 0 , 0 , 0 ) = ( 2 , 2 , 1 , 1 ) {\displaystyle (2,2,1,1)+(0,0,0,0)=(2,2,1,1)} .
  3. À l'itération suivante, P 1 {\displaystyle P_{1}} est le seul processus que l'on peut choisir. Une fois qu'il se termine, r e m a i n i n g {\displaystyle remaining} passe à ( 2 , 2 , 1 , 1 ) + ( 3 , 0 , 1 , 1 ) = ( 5 , 2 , 2 , 2 ) {\displaystyle (2,2,1,1)+(3,0,1,1)=(5,2,2,2)} .
  4. À l'itération suivante, on peut choisir arbitrairement parmi P 2 {\displaystyle P_{2}} ou P 3 {\displaystyle P_{3}} . Choisissons P 2 {\displaystyle P_{2}} . Une fois qu'il se termine, r e m a i n i n g {\displaystyle remaining} passe à ( 5 , 2 , 2 , 2 ) + ( 0 , 1 , 0 , 0 ) = ( 5 , 3 , 2 , 2 ) {\displaystyle (5,2,2,2)+(0,1,0,0)=(5,3,2,2)} .
  5. À l'itération suivante, on choisit P 3 {\displaystyle P_{3}} . Comme tous les processus ont été exécutés avec succès, l'état initial était un état sûr.

Limitations

D'un point de vue pratique, l'algorithme du banquier n'est pas réaliste, car il suppose que l'on connaisse au préalable les ressources dont chaque processus à besoin pour s'achever. Il suppose que ces quantités sont fixes alors qu'en pratique, les besoins d'un processus évoluent dynamiquement.

Voir aussi

Notes et références

  1. Edsger Wybe Dijkstra, Selected writings on computing : a personal perspective, Springer-Verlag, (ISBN 0-387-90652-5, 978-0-387-90652-2 et 3-540-90652-5, OCLC 8533598, lire en ligne)
v · m
Synchronisation en programmation concurrente
Principes de base
  • Atomicité
  • Section critique
  • Communication inter-processus
  • Thread Local Storage
Patrons de conception
Problèmes classiques
  • icône décorative Portail de l'informatique théorique
  • icône décorative Portail de l’informatique