Brevet FR2706651A1 — publié le 19941223

Procédé de gestion des accès concurrents à une mémoire par plusieurs utilisateurs L'invention porte sur un procédé de gestion des accès concurrents à une mémoire par plusieurs utilisateurs se partageant le temps de traitement d'un processeur de traitement de données pour faire exécuter chacune une séquence d'instructions dudit processeur afin de lire ou écrire des données dans des zones mémoire de ladite mémoire à partir d'un index ayant une valeur identifiant une zone mémoire dans ladite mémoire. Un procédé analogue, pour une architecture multiprocesseurs, est connu du bulletin technique de la société Digital Equipment Corporation du 2 octobre 199t intitulé "A Methodology for Implementing Highly Concurrent15 Data Objects". Il est destiné, en premier lieu, pour la gestion des accès concurrents à une mémoire par plusieurs processeurs dans un contexte de tolérance aux fautes. L'invention porte plus particulièrement sur un procédé de gestion des accès concurrents à une mémoire par plusieurs20 activités (connues sous le nom de "threads") dans un contexte uniprocesseur. Ce type de traitement multi-activités permet de gérer des échanges très rapides de données entre des tâches asynchrones émettrices et réceptrices de telles données.25 Chaque donnée émise par une tâche est récupérée par une activité qui l'enregistre dans une zone de la mémoire identifiée par la valeur d'un index d'écriture. Lorsqu'une tâche requiert une donnée, une activité procède à la lecture d'une donnée dans une zone de la mémoire identifiée par un30 index de lecture. A chaque phase de lecture ou d'écriture dans la mémoire, l'index de lecture ou l'index d'écriture est mis à jour pour la prochaine opération de lecture ou d'écriture. Le problème principale de l'utilisation d'une mémoire partagée entre plusieurs activités concurrentes est d'assurer l'intégrité des données échangées entre les activités. Ce problème peut se présenter ainsi qu'il suit. Une activité A commence à écrire une donnée dans une zone de la mémoire identifiée par l'index d'écriture. Une activité B commence peu après à écrire une donnée dans la même zone de la mémoire, l'index d'écriture n'ayant pas été mis à jour entre- temps. Il en résulte un mélange des données des deux activités A et B puisqu'aucune des deux activités n'a pu exploiter la mémoire pour son propre compte. Si une activité C lit la même zone mémoire, elle récupère donc une donnée qui est incohérente par rapport aux opérations d'écriture des activités A ou B. Une solution connue du document cité précédemment est d'assurer que chaque utilisateur de la mémoire écrit ou lit une donnée dans une zone de la mémoire en faisant exécuter une séquence d'instructions atomique, c'est-à-dire une séquence d'instructions non interruptible par un autre utilisateur.20 La séquence d'instructions, dans ce document, met en oeuvre une opération de positionnement d'un verrou qui si elle réussit permet à l'utilisateur qui a posé le verrou d'avoir l'exclusivité d'accès à la mémoire jusqu'à la levée du verrou par cet utilisateur. Une implémentation possible25 de la pose et de la levée d'un verrou en appliquant des instructions du type "store-conditional" et "load-linked" est décrit dans le document cité précédemment. Pendant qu'un utilisateur a l'exclusivité d'accès à la mémoire, les autres utilisateurs, en attente, recherchent l'accès à la mémoire.30 Les inconvénients d'un tel procédé sont les suivants. Si l'utilisateur qui a posé le verrou entre dans un cycle bouclé, les autres utilisateurs en attente d'accès à la mémoire restent bloqués. Par ailleurs, si les utilisateurs qui partagent la mémoire fonctionnent dans un35 cadre temps réel, le temps d'exécution d'une séquence d'instructions par un utilisateur pour accéder à la mémoire peut aller au-delà du temps de réponse imposé aux autres utilisateurs partageant l'accès à cette mémoire. Il en résulte qu'un tel procédé connu n'est pas adapté au traitement temps réel. 5 Dans ce procédé connu, la séquence d'instructions atomique exécutées par un processeur pour le compte d'un utilisateur inclut les opérations de lecture ou d'écriture d'une donnée dans une zone de la mémoire. Cette séquence d'instructions atomique est appelée section critique.10 le but de l'invention est de réduire au maximum la taille de cette section critique et d'éviter le phénomène de blocage des utilisateurs en attente d'accès à la mémoire dans le cadre d'une architecture uniprocesseur. A cet effet, l'invention a pour objet un procédé de gestion des accès concurrents à une mémoire par plusieurs utilisateurs, caractérisé en ce qu'il est mis en oeuvre dans ladite séquence d'instructions les opérations suivantes et dans l'ordre: a) enregistrement de la valeur de l'index dans un premier registre mémoire, b) sommation du contenu du premier registre mémoire avec une valeur d'incrément, c) enregistrement du résultat de la sommation dans un second registre mémoire, d) permutation atomique de la valeur de l'index avec le contenu du second registre, e) si le contenu du second registre mémoire est identique au contenu du premier registre, alors prendre le contenu du premier registre en tant que valeur courante30 d'index, sinon recommencer les opérations a), b), c), d), e). Contrairement au procédé connu, la section critique est limité à l'opération d) de mise à jour de l'index. Les opérations de lecture ou d'écriture dans la mémoire par un35 utilisateur sont mises en oeuvre en dehors de la section critique. Les défauts de zone mémoire libre ou de zone mémoire occupée peuvent donc être gérés par chaque utilisateur en dehors de la section critique. Le procédé selon l'invention ne comporte aucun verrouillage explicite si la permutation atomique est réalisée par une seule instruction du processeur. Une telle instruction peut consister dans l'instruction "SWAP" du processeur "SPARC" de la société "Cypress Semiconductors". La gestion de la mémoire est facilitée si la sommation dans l'opération b) est effectuée modulo la taille de la mémoire. L'invention est maintenant décrite en détail ci-après en référence à la figure qui est un organigramme illustrant les opérations mis en oeuvre dans la séquence d'instructions du procédé selon l'invention.15 Par la suite, on considérera que la mémoire est un buffer cyclique comprenant un nombre fixe N de zones mémoire de taille fixe. Les accès en lecture/écriture à la mémoire sont gérés à l'aide d'un index d'écriture E et d'un index de lecture L indépendant de l'index E, les valeurs des deux20 index identifiant une adresse (numéro de 1 à N) d'une zone mémoire de cette mémoire. Un buffer cyclique est bien connu et ne sera pas décrit plus en détail. On comprendra toutefois que les utilisateurs de la mémoire partagent les deux index L et E. Par ailleurs, le fonctionnement cyclique25 du buffer fait que la valeur de chaque index progresse par pas fixe, par exemple de 1, et lorsque celle-ci arrive à N elle est remise à 1. Il s'agit donc d'une sommation modulo N. En se reportant maintenant à la figure, la séquence d'instructions permettant à un utilisateur, telle qu'une activité, d'accéder à la mémoire met en oeuvre les opérations suivantes. a) enregistrer, en 20, la valeur courante de l'index (index L ou index E selon le cas) dans un premier registre Regl, b) puis sommer, en 30, le contenu du premier registre Regl avec une valeur d'incrément, de préférence la valeur 1, modulo la taille N de la mémoire et c) mettre, en 30, le résultat de la sommation de l'opération précédente dans un second registre Reg2, d) puis permuter atomiquement la valeur de l'index avec le contenu du second registre Reg2, en 40, e) si, en 50, le contenu du second registre Reg2 est identique au contenu du premier registre Regl, alors prendre, en 60, comme valeur courante d'index la valeur contenue dans le premier registre mémoire Regl, sinon recommencer les opérations précédentes à partir du bloc 20. Un exemple de séquence d'instructions pour la mise en oeuvre des opérations, a) à e) est donné ci-dessous. Ces instructions font partie de l'ensemble d'instructions du processeur "SPARC" figurant dans l'ouvrage "SPARC Instruction Set" publié par la société "Cypress Semiconductor". Dans cet exemple "ModulatomAdd" est le nom d'une fonction logicielle qui retourne la valeur courante d'un index et met à jour la valeur de cet index. Cette fonction a pour arguments d'entrée: - l'index désigné par la lette i. - l'incrément d'index désigné par la lettre "j" - la taille de la mémoire en nombre N de zones mémoire désignée par "mod". ModuloatomAdd (i, j, mod) int j, *i, mod; int regl, reg2;{ do { regl = *i; reg2 = (regl + j) & mod; reg2 = swap (i, reg2); j = reg2-regl; } while (j!=O); return regl; } La section critique comprend que la seule instruction "swap" du processeur "SPARC". La taille de la mémoire en nombre de zones mémoire doit être choisie en fonction du nombre d'accès en lecture et en écriture à cette mémoire par unité de temps. Les problèmes de débordement de la mémoire peuvent être réglés par l'adjonction de zones mémoires supplémentaires chaînées entre elles par des pointeurs10 d'adresses classiques en soi, de manière à étendre dynamiquement la capacité de la mémoire. Il est entendu, qu'après récupération d'une valeur courante d'index, chaque activité doit contrôler que la zone mémoire identifiée par cette valeur courante d'index correspond à une zone libre ou15 une zone occupée, selon le cas, de la mémoire avant d'entreprendre une opération de lecture ou d'écriture dans cette zone mémoire. REVENDICATIONS 1 - Un procédé de gestion des accès concurrents à une mémoire par plusieurs utilisateurs se partageant le temps de traitement d'un processeur de traitement de données pour faire exécuter chacune une séquence d'instructions dudit processeur afin de lire ou écrire des données dans des zones mémoire de ladite mémoire à partir d'un index ayant une valeur identifiant une zone mémoire dans ladite mémoire,10 caractérisé en ce qu'il est mis en oeuvre dans ladite séquence d'instructions les opérations suivantes et dans l'ordre: a) enregistrement de la valeur de l'index dans un premier registre mémoire (20), b) sommation du contenu du premier registre mémoire avec une valeur d'incrément (30), c) enregistrement du résultat de la sommation dans un second registre mémoire (30), d) permutation atomique de la valeur de l'index avec le contenu du second registre (40), e) si (50) le contenu du second registre mémoire est identique à l'ancienne valeur de l'index, alors prendre le contenu du premier registre en tant que valeur courante d'index, sinon recommencer les opérations a), b), c), d),25 e). 2 - Le procédé selon la revendication 1, dans lequel la permutation atomique est réalisée par une seule instruction du processeur.30 3 - Le procédé selon l'une des revendications 1 ou 2, dans lequel la mémoire comporte N zones mémoire et la sommation de l'opération b) est effectuée modula N.