Le système MicroHash

Dans le document en fr (Page 125-128)

capteurs sans fil

3.2 La gestion de la mémoire Flash

3.2.3 Comparaison avec les autres systèmes

3.2.3.3 Le système MicroHash

intéressantes ou importantes pour l’utilisateur situé à l’autre bout de la chaîne d’acquisition.

L’énergie des capteurs est ainsi économisée en évitant les transmissions inutiles de données.

Des hypothèses sont définies au niveau des données collectées. Celles-ci sont collectées à un instant donné et stockées sous forme d’enregistrements de type numérique avec des valeurs situées dans des intervalles connus. En règle générale, les données générées par un capteur de grandeur physique ont un format fixe. Par conséquent, la taille des enregistrements peut également être considérée comme fixe.

La mémoire Flash est utilisée comme une file circulaire. Les programmations commencent au début de la mémoire. Les données sont ainsi insérées progressivement et sont donc triées automatiquement par date d’acquisition. Quand la mémoire est pleine, la programmation reprend au début de celle-ci. Ce mode de fonctionnement est obtenu à l’aide de deux compteurs. Le premier « idx » joue plus un rôle de pointeur vers la page courante à programmer. Il est initialisé avec le numéro de la première page pouvant être programmée et est ensuite incrémenté au fur et à mesure des écritures. Le second « cycle » indique le nombre de fois où le compteur « idx » est remis à zéro ce qui correspond au nombre de fois où la mémoire Flash a été complètement utilisée. Ainsi, les écritures sont réparties uniformément entre toutes les pages. De plus, comme pour les autres systèmes présentés précédemment, un buffer de mémoire vive est utilisé pour accumuler une certaine quantité de données avant d’effectuer une programmation.

Ces techniques sont plus adaptées aux ressources limitées des capteurs sans fil en comparaison avec celles basées sur des adresses virtuelles. Une couche supplémentaire d’abstraction est ajoutée pour convertir une adresse réelle en adresse virtuelle. Après une modification, les données restent associées à la même adresse virtuelle mais sont stockées dans une autre page physique.

Chaque page est munie d’un en-tête de 8 octets avec les attributs suivants :

• Type de page (3 bits) ;

• Code de contrôle d’erreurs de type CRC (16 bits) ;

• Nombre d’enregistrements stockés dans la page (7 bits) ;

• Pointeur vers la page précédente (23 bits) ;

• Nombre d’écritures subies par la page (15 bits).

Les différents types de page sont : « Root », « Repertory », « Index » et « Data ». La partie « donnée » d’une page est spécifique au type de celle-ci. Les pages de type « Root » contiennent des informations relatives au fonctionnement de la mémoire Flash comme le type d’index utilisé, la position de la dernière écriture et l’adresse des différentes pages

« Directory ». Ces dernières ont pour rôle la gestion des groupements de pages. Des répertoires de grande taille peuvent être obtenus grâce à l’attribut « pointeur vers la page précédente » des en-têtes de pages. Sous le système MicroHash, les index sont construits à partir des informations issues de pages « Directory » et « Index ». Un nombre fixe d’index vers les données ainsi que la date d’acquisition du dernier enregistrement indexé sont stockés dans les pages « Index ». Il est ainsi possible de se repérer plus rapidement durant les requêtes temporelles et de déterminer s’il faut se diriger vers la page précédente ou suivante. Les index sur les enregistrements sont de deux types avec ou sans « offset » mais comprennent tous les deux l’identifiant de la page où les données sont stockées. L’« offset » correspond au nombre d’octets séparant le début de la partie « donnée » d’une page du début de l’enregistrement indexé. Le code de contrôle des erreurs s’applique à la partie « donnée » de chaque page. Les pages « Data » contiennent un nombre fixé d’enregistrements. Au sein de la mémoire Flash, les pages de différents types sont intercalées les unes avec les autres.

CemOA : archive ouverte d'Irstea / Cemagref

Le fonctionnement du système MicroHash est divisé en quatre phases (voir Figure 3.19) :

• la phase d’initialisation (« The Initialization Phase ») ;

• la phase de croissance (« The Growing Phase ») ;

• la phase de répartition (« The Repartition Phase ») ;

• la phase de suppression (« The Deletion Phase »).

Figure 3.19 – Fonctionnement du système MicroHash [Zeinalipour-Yazti 2005]

La phase d’initialisation consiste à charger, dans la mémoire RAM, la page « Root » et une partie des pages « Directory ». Elles sont stockées en mémoire vivre pour en faciliter et accélérer l’accès. Elles sont sauvegardées périodiquement dans la mémoire Flash. La première étape consiste à localiser la page « Root » dans la mémoire Flash. En règle générale, la page

« Root » est présente dans la « page 0 » de la mémoire Flash. Si la « page 0 » est arrivée en fin de vie, la page suivante est utilisée et ainsi de suite. Un bloc de pages est réservé en début de mémoire Flash pour stocker les pages « Root ».

La phase de croissance correspond à l’ajout progressif de pages « Data » et « Index » pour la gestion des données collectées. Les compteurs « idx » et « cycle » interviennent dans cette phase. A chaque écriture dans la mémoire Flash, un index est créé. Pour les enregistrements suivants {[1000,50], [1001,52], [1002,52]} au format « date, valeur », les index « ir = [idx, offset] » associés sont {[0,0], [0,12], [0,24]}. Les pages « Directory » servent à stocker l’adresse des pages « Index ». Chaque répertoire lié à une ou plusieurs pages

« Directory » est découpé en plusieurs ensembles appelés « buckets ». Ces sous-ensembles sont construits à partir des valeurs minimale « lb » (« lower bound ») et maximale

« ub » (« upper bound ») potentiellement récoltables et un nombre défini au départ de classes de répartition des données. Chaque sous-ensemble est donc établi en découpant l’intervalle des valeurs possibles en sous-intervalles de même dimension. Si la répartition des données collectées est uniforme, chaque sous-ensemble aura quasiment le même nombre d’enregistrements à indexer.

Durant la phase de répartition, ces sous-ensembles sont ensuite redéfinis pour que les données soient, si nécessaire, mieux réparties. Les index avec leurs pages associées (pages

« Index » et « Directory ») sont réorganisés durant cette phase. Les « buckets » répertoriant un grand nombre d’index par rapport aux autres sont, dans un premier temps, découpés. Plus

CemOA : archive ouverte d'Irstea / Cemagref

précisément, ceux stockant un nombre d’index supérieur à un seuil fixé par l’utilisateur sont, à leur tour, redécoupés. Dans un second temps, les « buckets » non utilisés depuis un certain temps sont stockés dans la mémoire Flash. Cela permet de libérer de la mémoire SRAM pour pouvoir stocker de nouveaux « buckets ».

La phase de suppression se résume en un appel au module ou fonction de nettoyage de la mémoire. Ce module est exécuté après chaque remplissage complet de la mémoire Flash et supprime les anciennes données, bloc par bloc, suivant les besoins. Ces suppressions sont répercutées au niveau des index grâce à un algorithme de recherche dédié. Il est également fait en sorte que les index qui pourraient être supprimés ne pointent pas vers des données valides.

Le système MicroHash permet d’indexer les données temporelles pour autoriser deux types de requêtes :

• les requêtes « égalité » (« equality queries ») ;

• les requêtes sur des intervalles de temps (« time-based range »).

Une requête « égalité » équivaut à comparer un attribut et une valeur donnée. La formalisation de ce type de requête est la suivante « Q(vi, a) » où « vi » est un attribut et « a » la valeur spécifiée pour le test. La requête « q=(temperature, 95F) » en est un exemple et vise à retourner les informations sur les enregistrements où la température est égale à 95F. Les requêtes sur des intervalles de temps sont définies de la manière suivante « Q(t,a,b) » où l’on va rechercher les enregistrements qui ont été collectés entre les instants a et b, avec la possibilité que a et b soient égaux.

En prenant en compte l’organisation propre au système MicroHash, les requêtes

« égalité » impliquent différentes étapes. La première consiste à trouver le « bucket » approprié dans lequel on peut extraire l’adresse de la dernière page « Index » référençant les données répondant potentiellement à la requête exprimée. Puis, la suivante est la lecture de l’ensemble de ces pages « Index » en mode page par page pour trouver la ou les pages

« Data » contenant les données recherchées. Enfin, l’extraction des enregistrements constitue la dernière étape.

Pour accélérer les requêtes temporelles, la recherche dichotomique a été implémentée sous deux différentes variantes appelées « LBSearch » et « ScaleSearch ». Dans la version

« LBSearch », une borne inférieure « pessimiste » de l’intervalle de recherche est redéfinie récursivement jusqu’à atteindre la valeur souhaitée. Celle de type « ScaleSearch » exploite la connaissance sur la distribution des données des pages « Data » et « Index ». Quand la distribution des données est uniforme au niveau de la mémoire Flash, la méthode

« ScaleSearch » est meilleure que celle de type « LBSearch ».

Dans le document en fr (Page 125-128)