École polytechnique Promotion 2012 Majeure informatique Cours de conception et analyse d'algorithmes TD 8 Algorithmes on-line 19 novembre 2013 1. Gestion de mémoire (Pâle 2011) On considère un modèle de mémoire dans lequel on peut consulter les données non seulement en mémoire centrale, mais aussi directement dans la mémoire externe : les données sont découpées en pages, la consultation d'une page en mémoire centrale est gratuite, celle d'une page en mémoire externe à un coût unitaire et le chargement d'une page en mémoire centrale coûte D fois le coût d'une consultation. Nous nous intéressons à la conception d'un gestion- naire de mémoire qui décide au fur et à mesure de l'arrivée des requêtes s'il vaut la peine de charger la page demandée en mémoire ou pas. On se concentre ici sur le cas où le découpage en pages des données est calibré sur la taille de la mémoire centrale : il y a à tout moment une unique page en mémoire centrale, toutes les autres sont en mémoire externe. p c(p). Au départ tous les L'algorithme de gestion de la mémoire centrale que nous étudions associe à chaque page (qu'elle soit en mémoire externe ou en mémoire centrale) un compteur compteurs sont mis à zéro, puis le gestionnaire de mémoire eectue les opérations suivantes en boucle : a. Réceptionner la prochaine requête b. Incrémenter le compteur c. Si c(p) = D p. c(p). alors p en c(p) > 0 Charger la page Tant que mémoire centrale si elle n'y est pas déjà, Réceptionner la prochaine requête Décrémenter le compteur d. Retourner en c(p) q chaque fois que q 6= p. a. La réception des requêtes est bloquante : lorsqu'il n'y pas de requête à traiter le gestionnaire de mémoire attend. Remarquer que durant la boucle interne Tant que... les compteurs pour q 6= p c(q) sont bloqués. 1. Compléter l'évolution des compteurs pour s = (s1 , s2 , . . .) i si c(1) c(4) c(6) 1 1 1 0 0 2 1 2 0 0 D=3 dans l'exemple ci-dessous d'une suite de requêtes portant sur les pages 1, 4 et 6 : 3 4 2 1 0 4 6 2 1 1 5 4 2 2 1 6 1 3 2 1 7 8 9 10 11 12 13 14 15 16 17 18 . . . 4 6 1 1 4 1 4 6 1 4 6 6 ... 2 2 1 1 s = (s1 , s2 , . . .) en sous-ensembles de requêtes p à zéro d'un compteur : la phase Ij contient les j ème et la (j + 1)ème remise à zéro du compteur Pour étudier cet algorithme, divisons la séquence appelées indices c(p) i phases, associées à chaque remise des requêtes réceptionnées entre la et satisfaisant l'une des deux conditions suivantes : soit la requête soit la requête pour la si provoque l'incrément du compteur c(p), si est réceptionnée après la requête ayant (j + 1)ème amené le compteur c(p) à D fois. Dans l'exemple de la question 1, vérier que les premières phases sont I01 = (1, 2, 6, 7, 8, 9, 10, 11), I04 I06 I11 = (12, . . .), = (3, 5, 13, 14, 15, 16, 17), = (4, 18, . . .), ... ... ... On remarque que deux phases portant sur des requêtes distinctes peuvent s'entrelacer et que Ijp commence par une suite D + 1 requêtes consécutives. la requête moins de requête à la page 2. Montrer que le coût d'une phase est au plus p et se termine par une suite d'au 3D. On va comparer ce coût payé par notre gestionnaire de mémoire à celui d'un algorithme arbitraire qu'on appelera OPT. 3. Étant donnée la séquence de requêtes OPT sur les diérentes phases à chaque phase soit au moins Ijp D. s, montrer qu'on peut répartir le coût payé par précédemment dénies de sorte que coût ainsi attribué (Indication : attribuer le coût payé par OPT pour le chargement d'une page qui fait sortir p du cache à la phase Iip durant laquelle ce chargement est eectué, et analyser le coût payé par OPT pour le traitement des autres requêtes de chaque phase.) 4. En déduire le facteur de compétitivité de notre algorithme. 2. Stratégies de cache On considère maintenant un modèle de mémoire dans lequel on doit nécessairement charger les pages dans le cache pour pouvoir les consulter. La question devient de savoir quelle page rejeter quand le cache est plein. On s'intéresse pour cela à des et probabilistes. Soit k stratégies de cache déterministes le nombre d'unités de mémoire du cache. On se place dans le régime permanent : à chaque fois qu'une requête sollicite une information non présente, il faut la charger dans le cache, et l'algorithme doit pour cela choisir une information à éliminer du cache. On considère un algorithme O optimal en ce sens qu'il a connaissance de toute la suite des requêtes futures et peut ainsi choisir sa stratégie d'élimination en conséquence. On va comparer les performances de O à celles d'un algorithme déterministe quelconque celle d'un algorithme probabiliste donné A, puis à Marker. Pour cela on va considérer chaque requête comme une lettre de l'alphabet (une lettre diérente par page mémoire demandée) ainsi la donnée de l'algorithme est un mot f représentant la suite des requêtes. i. Quel est le nombre minimum de transferts du cache vers la mémoire pour un cache composé de 3 emplacements dans le cas où le mot d'entrée est abdabecbcabadbac 2 lorsque le cache contient a, b, c au départ ? Dans le cas général, on suppose d'abord que l'on a connaissance de la suite complète des requêtes futures et on considère la stratégie suivante : à chaque fois qu'une lettre du cache doit être éliminée, choisir parmi les lettres du cache celle qui apparaît le plus tard dans la suite des requêtes futures. Montrer que cette stratégie est optimale. ii. On suppose que le cache est plein au début de la procédure. Montrer que pour tout algorithme online déterministe k eectue iii A, il existe un mot de longueur transferts alors que l'algorithme optimal Montrer que la stratégie O k pour lequel l'algorithme A en fait seulement 1. Least Frequently Used n'est pas compétitive. Rappelons que LFU consiste à se rappeler du nombre d'occurrence de chaque requête depuis le lancement de l'algo et de jeter la moins fréquement utilisée. On considère la stratégie probabiliste Marker suivante. À chaque emplacement du cache, on associe un bit initialement mis à 0. Pour chaque requête, on opère de la façon suivante : si la page cherchée est en cache, on met le bit correspondant à 1. si la page n'est pas en cache, on la charge, et on rejette une page à un emplacement choisi au hasard dans le cache parmi ceux dont le bit est à 0, et on met le bit de cet emplacement à 1. Une fois que les bits de tous les emplacements sont à 1, on les remet tous à 0 et on recommence. On note f1 f2 . . . fm le mot d'entrée. Une étape est un facteur du mot d'entrée entre deux remises à 0 des bits. iv. v Montrer qu'une étape contient exactement On considère une étape : fp fp+1 . . . fq k lettres distinctes. de l'algorithme Marker, on dit qu'un indice Marker au début de l'étape. i, p ≤ i ≤ q est actif si la lettre fi n'était pas dans le cache de Soit ` le nombre d'indices actifs lors de l'étape considérée, dI le nombre de O qui ne sont pas dans le cache de Marker en début d'étape, et dF d'objets du cache l'analogue en n d'étape. Montrer que le nombre de transferts de O est au moins max(`−dI , dF ), donc (`−dI +dF )/2. (L − k)/2 où L désigne le nombre En déduire que le nombre de transferts au total est au moins total d'indices actifs. vi. Rappelons qu'un indice est actif si la lettre fi n'était pas dans le cache de Marker au début de l'étape. Inversement on dit qu'il est inactif s'il y était. On s'intéresse toujours à une étape aucours de laquelle ` indices actifs vont être rencontrés. j indices On se place maintenant au cours du déroulement de l'étape, alors qu'on a rencontré actifs et i indices inactifs. Montrer que la probabilité qu'une lettre correspondant à un indice inactif (non encore requis) soit présente dans le cache lors de son examen est (k −i−j)/(k −i). En déduire que si on veut insérer la lettre à ce moment là, la probabilité de ne pas la trouver est j/(k − i). En déduire que le pire des cas pour une étape avec actifs, puis vii. quand k−` En déduire qu'en moyenne O ` indices actifs est : d'abord ` indices indices inactifs. Marker eectue au plus en eectue 1. 3 2 Pk j=1 1/j = O(log k) transferts 3. On line scheduling On considère m machines identiques et une séquence de des temps d'exécution p1 , . . . , pn . n tâches auxquels sont associés Il faut placer les tâches sur les machines au fur et à mesure de leur arrivée en minisant le temps d'exécution. Montrer que l'algo glouton qui place chaque tâches sur la machine la moins chargée est α-compétitive pour α = 2 − 1/m. 4. Accès séquenciel dans une liste i. ii. Montrer que les politiques Transpose et Compteur ne sont pas compétitives. L'algorithme BIT considère associe un bit à chaque cellule de la liste : lorsque la cellule est requise, on ippe le bit. Chaque fois que le bit passe à 1, la cellule est déplacée en tête. Au départ les bits sont initialisés aléatoirement. Montrer que l'algorithme BIT est 1.75-compétitif contre un adversaire qui ne voit pas les mouvements de BIT (oblivious adversary). On rappelle que le coût d'un accès à un élément de la liste est son rang et qu'après un accès on peut déplacer l'élément x x n'importe où dans la liste gratuitement. Il est également possible de transposer deux éléments adjacents pour un coût unitaire. Indication : On peut considérer au temps i les inversions entre un algorithme optimal OPT et l'algorithme BIT, c'est-à-dire les paires {x, y} telles que, à l'étape i, x est avant y dans OPT et où y est avant x dans BIT. On peut ensuite distinguer les paires en type 0 ou 1 selon que le bit aecté à x est mis à 0 ou 1 dans l'algorithme BIT et considérer comme fonction de potentiel Φ = φ0 + 2φ1 , où φ0 et φ1 désignent le nombre d'inversions de type 0 ou de type 1. 4