Brevet FR2778761A1 — publié le 19991119

La présente invention concerne un dispositif et un procédé de gestions de conditions d'exécution de programme d'ordinateur. Elle s'applique, en particulier, aux programmes multitâches temps réel. Actuellement, les systèmes d'exploitation (appelés "operating systems" ou "OS", en anglais) temps réel, programmes de base permettant de faire cohabiter plusieurs applications dans une même machine et de faciliter leur communication avec les différents périphériques, fournissent un mécanisme d'ordonnancement préemptif permettant de définir une unité ou quantum de temps de processeur (aussi appelé "Central Processing Unit" ou "CPU" en anglais) pour chaque processus ou tâche (appelé "thread", "task" ou "process" en anglais) actif dans le système. Par quantum de temps, on entend durée pendant laquelle un processus est exécuté par le processeur. A chaque processus peut être associé un quantum dont la durée dépend de l'ordonnancement du système d'exploitation et des paramètres d'exécution du processus (l'ordonnancement est fonction de priorités temps-réel, de niveaux de privilège, de contextes d'exécution...). En régime périodique, le processeur consacre donc un temps égal à ce quantum pour un processus donné. Ce mécanisme permet de garantir une distribution de la ressource du processeur aux différents processus, sans monopolisation par l'un d'entre eux. La mise en oeuvre (ou "implémentation") habituelle de cette partition du temps en quanta de temps repose sur l'utilisation d'une base de temps disponible sur la machine, telle qu'un compteur, ou diviseur, de fréquence d'horloge (appelée "timer" en anglais) du système informatique qui n'effectuent que la division ou le décompte d'unité élémentaires de temps. Cette division est programmable et l'horloge ainsi que le diviseur sont externes au processeur. La fréquence en sortie de ce diviseur définit le quantum de temps minimum ou "grain" du quantum de temps, chaque quantum étant donc un multiple entier de ce grain. Lorsque le compteur/diviseur atteint la valeur nulle, une interruption du processeur est déclenchée, et le système d'exploitation prend connaissance de l'échéance de la période programmée. La survenance de l'interruption permet au système d'exploitation de suspendre le processus en cours et de passer à l'exécution d'un autre processus. Un problème apparaît lorsque l'on désire attribuer des quanta de temps différents à différents processus, et lorsque l'on désire monter à une fréquence d'ordonnancement relativement élevée. Une première solution consiste à fixer définitivement la période du diviseur de fréquence d'horloge telle qu'elle définisse un très petit grain de quantum. Alors, un processus peut se voir attribuer un quantum de temps constitué de dix périodes de sortie du diviseur, alors qu'un autre processus s'en verra attribuer quinze. En effet, I'ordonnanceur peut ne changer de processus qu'après dix interruptions pour le premier processus et après quinze interruptions pour le deuxième. Un problème de surcoût apparaît alors: lorsque le quantum de temps est composé de plusieurs périodes de base du diviseur de fréquence d'horloge, c'est-à-dire de plusieurs grains, seule la dernière interruption active effectivement l'ordonnancement. Toutes les interruptions précédentes n'occupent le processeur que pour comptabiliser le nombre total de grains accumulés. Même si le temps de traitement de l'interruption reste faible devant le grain, ce temps est de toute façon du gaspillage qui nuit à l'efficacité du système informatique. Deux autres problèmes exclusifs apparaissent ensuite À si la période de sortie du diviseur est trop élevée, un processus peut se voir attribuer un quantum beaucoup trop grand vis-à-vis de la période à laquelle le système doit répondre aux événements extérieurs, mais si la période est trop faible, le coût du temps d'interruption (appelé "interrupt overhead" en anglais) n'est plus négligeable devant la période de sortie du diviseur. Une deuxième solution consiste à modifier la période de sortie du diviseur à chaque ordonnancement d'un processus. Cette méthode permet d'avoir un grain aussi fin que ce que permet la période de base du diviseur. De plus, un processus n'est plus interrompu inutilement. Elle ne l'est qu'à l'échéance du diviseur et le problème du coût du temps d'interruption n'existe plus. Mais, compte tenu du nombre restreint de diviseurs de fréquences d'horloge sur une carte mère, celui qui sert à l'ordonnancement des processus est utilisé conjointement pour mettre à jour une "horloge absolue". Cette dernière est référencée à chaque service du système d'exploitation relatif au temps, tel qu'une demande de délai... La modification de la fréquence de sortie de ce diviseur à chaque changement de processus, sans perturbation de l'ensemble du système rend cette solution très complexe, voire impraticable. On connaît le document US 5,657,253 (Intel Corp.) qui présente des compteurs de performance intégrés à un processeur. Ces compteurs sont destinés à être utilisés par les programmeurs pour analyser le fonctionnement d'un logiciel en cours de développement, pour que le programmeur puisse modifier le code source du logiciel en fonction de l'observation autorisée par ces compteurs. L'utilisation de ces compteurs n'est donc pas envisagée en dehors de la phase de développement de logiciel. On connaît des méthodes assurant une adaptation continuelle d'un programme en prenant en compte des mesures de sa performance. Dans une première approche, un système "adaptatif" consiste en deux entités distinctes: (1) le programme à adapter et (2) un "adaptateur", surveillant et modifiant le programme afin d'améliorer sa performance. Par exemple, dans l'optimisation dirigée par les traces ("profile-driven optimization" en anglais) le rôle de l'adaptateur est joué par un compilateur qui prend en entrée non seulement le programme à compiler, mais aussi des traces de ses exécutions précédentes. Ce type de compilateur a déjà été proposé: - par DEC (marque déposée de Digital Equipment Corporation, aux Etats-Unis d'Amérique) dans le document "continuous profiling: where as ail the cycles gone ?" de Anderson et al., DEC Systems Research Center and Western Research Lab, Proceedings of the 17th ACM Symposium on Operating Systems Principles, Decembre 1997, pages 1 à 14, et - par l'article de Jeremy Brown, Andre DeHon, lan Eslick, Michelle Goldberg, Ahmed Shah, et Massimiliano Poletto "The C/ever Compiler: Proposai for a First-Cut Smart Compile/', Transit Note 101, MIT Artificial Intelligence Laboratory, Janvier 1994. Dans le document DEC, les traces des exécutions passées peuvent contenir y compris des informations provenant des compteurs de performance tels que dans la proposition courante. Par contre, une limitation de principe de cette approche est que le flot d'informations passe dans un seul sens, de l'application vers l'adaptateur. Ainsi, basé sur les informations des traces, le compilateur prend la décision de réécrire le code de l'application, sans que cette dernière ne soit au courant. L'avantage en est la transparence par rapport à l'application; en revanche, une limitation essentielle en est que l'adaptateur ne peut avoir qu'une compréhension limitée de l'application et de ses intentions, donc de la manière d'améliorer son comportement. Dans une deuxième approche, une application "adaptative" joue à la fois le rôle du programme à adapter et de son propre adaptateur. Le cycle d'adaptation d'une telle application consiste en trois étapes: introspection, prise de décision et action. Dans l'étape d'introspection, I'application adaptative ramasse de l'information sur son propre contexte d'exécution ou sur son efficacité. Dans l'étape de prise de décision, cette information est analysée pour déterminer un changement éventuel de comportement, permettant de mieux l'adapter au nouveau contexte. L'étape d'action consiste à appliquer le changement de comportement à travers une "action" sur l'application. Les actions peuvent concerner un changement des paramètres de l'application, un changement de politique de gestion de ressources, ou même la modification du code de l'application, elle-même. Parmi les nombreux travaux existants, citons le système adaptatif de gestion de fichiers décrit par S.B. Lim, dans "Adaptative caching in a distributed file system" Technical Report 1936, Department of Computer Sciences, University of Illinois at Urbana, Champaign, Urbana, Illinois, 1995. Cependant, à notre connaissance il n'existe pas d'applications adaptatives qui exploitent des informations internes au processeur. L'application n'est donc pas consciente de l'utilisation des ressources au plus bas niveau da la machine cible. La conception d'applications adaptées au plus près à un matériel particulier n'y est donc pas décrit. L'invention entend améliorer ces différentes limitations de l'art antérieur. A cet effet, la présente invention vise, selon un premier aspect, un procédé, caractérisé en ce qu'il comporte: - une opération de préchargement d'au moins un compteur, par une première valeur prédéterminée, - une opération de décompte, par chaque dit compteur, d'occurrences d'un événement prédéterminé interne audit processeur, - une opération de comparaison de la valeur de chaque dit compteur avec une deuxième valeur prédéterminée associée audit compteur, et, lorsque l'un desdits compteurs atteint ladite deuxième valeur prédéterminée qui lui est associée, une opération de modification immédiate d'exécution de programme. On observe ici que l'opération de modification d'exécution de programme d'ordinateur concerne aussi bien: - un changement de contexte de l'exécution du programme, - un changement de programme (ou de processus) exécuté, et - une modification du code de ce programme. Grâce à ces dispositions, I'exécution du programme peut s'adapter immédiatement au nombre et à la nature d'événements internes décomptés. Non seulement parmi les événements se trouvent, d'une part, le cycle de processeur mais aussi, d'autre part, d'autres événements internes au processeur. Selon des caractéristiques particulières, au cours de l'opération de comparaison de la valeur de chaque dit compteur avec une deuxième valeur prédéterminée associée audit compteur, la deuxième valeur prédéterminée est égale à "0". Comme le retour à zéro du compteur est généralement l'objet d'un signal particulier de la part d'un compteur intégré dans un circuit intégré, le passage dudit compteur à ladite deuxième valeur prédéterminée est facile à détecter. Selon des caractéristiques particulières, au cours de l'opération de décompte d'occurrences d'événements prédéterminés, I'un desdits compteurs décompte des impulsions d'horloges. Grâce à ces dispositions, une durée avant un changement d'exécution de programme, peut être prédéterminée. Selon d'autres caractéristiques particulières, au cours de l'opération de décompte d'occurrences d'événements prédéterminés, on décompte des événements susceptibles de retarder l'exécution d'un programme, puis, en fonction du résultat d'une ou plusieurs opérations de décompte, on effectue, de manière différée, une modification du contexte interne ou externe dudit programme. Grâce à ces dispositions, la survenance de tels événements peut être surveillée et peut être corrigée. Selon d'autres caractéristiques particulières, au cours de l'opération de préchargement d'un compteur, un dit compteur est un compteur de performance interne à un processeur. Grâce à ces dispositions, des compteurs déjà intégrés dans des processeurs de type connu sont utilisés et sont donc d'une mise en oeuvre simple et bon marché. Selon d'autres caractéristiques particulières, au cours de I'opération de préchargement, la première valeur prédéterminée dépend du processus, de manière prédéterminée. Grâce à ces dispositions, chaque processus peut obtenir un nombre différents d'occurrences d'événement, par exemple une durée d'exécution différente, ce qui permet de tenir compte du besoin de ressource dudit processus. Selon d'autres caractéristiques particulières, au cours de l'opération de préchargement, la première valeur prédéterminée dépend d'une valeur donnée au cours de l'exécution dudit programme. Grâce à ces dispositions, chaque processus peut obtenir un nombre d'occurrences d'événement, par exemple une durée d'exécution différente, qui tienne compte de ses besoins immédiats, ce qui permet de tenir compte, pratiquement en temps réel, de l'évolution du besoin de ressource dudit processus. Selon d'autres caractéristiques particulières - au cours de l'opération de préchargement d'au moins un compteur, par une première valeur prédéterminée, on précharge au moins deux compteurs avec des premières valeurs prédéterminées, et - au cours de l'opération de décompte, chaque compteur décompte des occurrences d'un événement prédéterminé interne audit processeur, événement associé audit compteur. Grâce à ces dispositions, plusieurs nombres d'occurrences d'événements peuvent être simultanément surveillés pour modifier l'exécution de programmes. Selon d'autres caractéristiques particulières, ledit procédé comporte, préliminairement aux opérations de préchargement, de décompte, de comparaison et de modification, une opération de sélection d'événement au cours de laquelle on associe à chaque dit compteur un événement interne audit processeur. Grâce à ces dispositions, chaque type d'événement dont le nombre occurrences est surveillé peut être prédéfini en fonction de l'application mise en oeuvre. Selon des caractéristiques particulières, au moins un compteur décompte le nombre d'occurrences d'impulsions d'horloge simultanées à un autre événement interne audit processeur. Grâce à ces dispositions, la durée dudit événement est surveillée pour déclencher un changement d'exécution de programme. Selon un deuxième aspect, la présente invention vise un dispositif de gestion de conditions d'exécution de programme d'ordinateur, caractérisé en ce qu'il comporte: - au moins un compteur d'occurrences d'au moins un événement interne, adapté à être préchargé par ledit processeur, à une première valeur prédéterminée, - au moins un moyen de détection qu'un dit compteur atteint une deuxième valeur prédéterminée, et - un processeur adapté à modifier immédiatement l'exécution de programme qu'il effectue, lorsque ledit moyen de détection détecte que ledit compteur atteint la deuxième valeur prédéterminée. L'invention vise aussi un ordinateur, une caméra, un télécopieur, un appareil photographique, un téléviseur, une imprimante, un scanner et un lecteur audio/vidéo, caractérisés en ce qu'ils comportent un dispositif tel que succinctement exposé ci-dessus. L'invention vise aussi: - un moyen de stockage d'informations lisible par un ordinateur ou un microprocesseur conservant des instructions d'un programme informatique caractérisé en ce qu'il permet la mise en oeuvre du procédé de l'invention telle que succinctement exposée ci-dessus, et - un moyen de stockage d'informations amovible, partiellement ou totalement, et lisible par un ordinateur ou un microprocesseur conservant des instructions d'un programme informatique caractérisé en ce qu'il permet la mise en oeuvre du procédé de l'invention telle que succinctement exposée ci- dessus. Les caractéristiques préférentielles ou particulières, et les avantages de ce dispositif, de cet ordinateur, de cette caméra, de ce télécopieur, de cet appareil photographique, de ce téléviseur, de cette imprimante, de ce scanner, de ce lecteur audio/vidéo et de ces moyens de stockage d'information étant identiques à ceux du procédé tel que succinctement exposé ci-dessus, ces avantages ne sont pas rappelés ici. L'invention sera mieux comprise à la lecture de la description qui va suivre, faite en regard des dessins annexés dans lesquels: - la figure 1 représente schématiquement un dispositif selon la présente invention, la figure 2 représente schématiquement une partie de la structure interne d'un processeur incorporé dans le dispositif illustré en figure 1, et - la figure 3 représente un organigramme schématique de fonctionnement du dispositif illustré en figures 1 et 2. En figure 1, un dispositif conforme à la présente invention est illustré sous forme de schéma synoptique et représenté sous référence générale 10. Il comporte, reliés entre eux par un bus d'adresses et de données 102: - un processeur Intel Pentium P6 (marques déposées) 106; - un diviseur de fréquence d'horloges 109 - une mémoire vive RAM 104; - une mémoire morte ROM 105; - un port d'entrée/sortie 103 servant à émettre et à recevoir des signaux à destination ou en provenance, respectivement, d'un réseau 107; - un écran de visualisation 108; - un clavier 101 fournissant des octets représentatifs des touches de clavier successivement utilisées; et - une mémoire de masse 110, par exemple constituée d'un disque dur. Chacun des éléments illustrés en figure 1 est bien connu de l'homme du métier des systèmes de transmission et, plus généralement, des systèmes de traitement de l'information. Ces éléments ne sont donc pas décrits ici. On observe ici que les mots "segment de mémoire" utilisés ci- dessous désignent, dans chacune des mémoires, aussi bien une zone mémoire de faible capacité (ne conservant que quelques données binaires) qu'une zone mémoire de grande capacité (permettant de stocker un programme entier). La mémoire vive 104 conserve des données, des variables et des résultats intermédiaires de traitement, dans des segments de mémoire portant, dans la suite de la description, les mêmes noms que les données dont ils conservent les valeurs. La mémoire vive 104 comporte notamment: - un segment de mémoire "pile A "dans lequel est conservé un contexte d'exécution d'une tâche référencée "A", - un segment de mémoire "pile B "dans lequel est conservé un contexte d'exécution d'une tâche référencée "B", - un segment de mémoire "code " dans lequel est conservé le code du programme mis en oeuvre par le processeur 106. La mémoire vive 104 constitue un moyen de stockage d'informations lisible par un ordinateur ou un microprocesseur. Elle conserve des instructions d'un programme informatique qui permet la mise en oeuvre du procédé de codage objet de l'invention. Selon une variante, la mémoire vive 104 est amovible, partiellement ou totalement, et comporte, par exemple une bande magnétique, une disquette ou un compact disque réinscriptible. La mémoire morte 105 conserve un logiciel permettant le démarrage correct du dispositif. La figure 2 représente une partie de la structure interne d'un processeur 106 connu à la date de la présente invention, le processeur Intel Pentium P6 (marques déposées). DESCRIPTION SUCCINCTE DU MODE DE REALISATION Dans ce processeur 106, il existe deux compteurs 201 et 202 qui peuvent mémoriser le nombre d'occurrences de certains événements. Parmi ceux-ci, il existe, par exemple: - un événement relatif aux cycles machines. Contrairement à tous les autres événements, celui-ci est une variable directement proportionnelle au temps puisque le compteur associé est incrémenté à chaque cycle d'horloge; - un événement correspondant au nombre d'instructions exécutées, qui n'est pas proportionnel au temps écoulé, puisque le processeur 106 peut exécuter plusieurs instructions en un cycle d'horloge comme il peut prendre plusieurs cycles d'horloges pour exécuter une seule instruction, suivant la complexité de cette instruction; - un événement correspondant à une prédiction de saut conditionnel qui a échoué ("miss predicted branches" en anglais); et - un événement correspondant à un accès à une donnée absente du cache ("cache miss" en anglais). De plus, il est possible de contrôler l'incrémentation de chaque compteur en fonction du contexte d'exécution du processeur 106. En effet, chaque compteur peut être paramétré de telle manière qu'il ne soit incrémenté que pendant, d'une part, I'exécution du code utilisateur, et, d'autre part, l'exécution du code relatif à du code utilisateur. Cette technique permet de ne pas comptabiliser, sur le quantum de temps d'un processus, le temps d'exécution des interruptions indépendantes de ce processus. Ensuite, un compteur peut générer une interruption lorsqu'il repasse à zéro (passage à zéro connu de l'homme du métier sous le nom anglais de "overflow", qui signifie "dépassement de capacité"). Cette interruption est prise en compte par un contrôleur d'interruption programmable interne 203 (appelé "APIC" pour "Advanced Programmable Interrupt Controler", en anglais) qui provoque une interruption du processeur 106. Initialement destiné à faciliter la communication entre les différents processeurs dans une architecture multiprocesseurs, le contrôleur interne APIC 203 intègre, en plus, un contrôleur d'interruptions externes et quelques fonctionnalités vis-à-vis des événements internes (interruptions d'erreurs de communication avec un autre APIC,...). Comme chaque compteur, 201 ou 202, peut être initialisé avec une première valeur prédéterminée, il est possible de définir le nombre d'occurrences de l'événement avant la génération de l'interruption, ce nombre étant le complémentaire de la première valeur prédéterminée à une deuxième valeur prédéterminée, ici égale à 232. Dans le mode de réalisation décrit et représenté, I'invention consiste à utiliser ce type de compteur interne en tant que compteur de cycle d'horloge et une génération d'interruption interne lors de la remise à zéro du compteur 201, pour obtenir un système: * à quantum variable: il suffit d'écrire différentes valeurs dans le compteur avant d'ordonnancer pour définir différents quanta attribués aux processus ordonnancés, * sans surcharge d'interruptions: une seule interruption est générée pour déclencher l'ordonnancement, avec un coût d'interruption d'ordonnancement minimal: l'interruption reste interne au processeur 106, * sans perturber le reste du système: la période de sortie du diviseur de fréquence d'horloge de la carte mère n'est pas altérée. Grâce aux différents événements gérés par le processeur Pentium, cette technique d'ordonnancement préemptif, communément basée sur un quantum de temps, peut être étendue à d'autres critères de préemption. Par exemple, le système d'exploitation peut utiliser le deuxième compteur pour comptabiliser le nombre de cycles pendant lesquels les interruptions sont inhibées et qu'une interruption est en attente. Ainsi, le processus ne sera pas forcément préempté pour cause de fin de quantum temporel, mais parce qu'il a abusé du temps de blocage des interruptions alors qu'un périphérique attendait d'être servi. DESCRIPTION DETAILLEE DU MODE DE REALISATION Le processeur Intel Pentium P6 (marques déposées) contient deux compteurs 201 et 202 respectivement appelés "PerfCtrO" "PerfCtrl" et deux registres 204 et 205 de contrôle de ces compteurs, registres appelés "EvntSeIO" et "EvntSeil", résidant dans les registres spécifiques de machine (appelés "MSRs" pour "Machine Specific Registers", en anglais). Propres à l'architecture Intel, ces registres sont définis pour une version particulière d'un processeur Pentium. Les adresses de ces registres sont données dans le tableau suivant: Registre Adresses 201 EvntSe0l 0x186 202: EvntSeil 0x187 204: PerfCtr0 0xC1 205: PerfCtrl 0xC2 Pour mesurer le temps d'exécution avec le compteur 201 "EvntSelO", le processeur écrit donc le numéro "0x79" dans le registre 204 "PerfCtrO", puisque l'événement permettant de mesurer le temps d'exécution est le numéro "0x79", défini dans la documentation Intel comme le nombre de cycles au cours duquel le processeur n'est pas arrêté. Or, le processeur 106 est dans l'état "arrêté" lorsqu'une instruction "HLT" est exécutée. Lorsque le processeur 106 rencontre cette instruction, il s'arrête jusqu'à ce qu'une interruption externe (si elles ne sont pas masquées), une interruption non masquable ("NMI" pour "No Maskable Interrupt" en anglais) ou une remise à zéro ("RESET" en anglais) apparaisse. De plus, cette instruction "HLT" fait partie des instructions privilégiées, c'est-à-dire que seul le système d'exploitation peut l'exécuter sans générer d'exception de protection générale. En conclusion, cette instruction "HLT" est introuvable dans du code utilisateur et donc celui-ci ne peut arrêter le processeur. On peut donc considérer que l'événement "0x79" correspond donc exactement au nombre de cycles consommés par le code utilisateur. Le niveau de privilège courant ("CPL" pour "Current Privilege Level") est une notion propre à l'architecture Intel, elle fixe le niveau de protection dans lequel du code s'exécute. Bien qu'il existe quatre niveaux, de 0 (niveau dans lequel le code a le plus de privilège, donc a le droit de faire le plus de choses) à 3 (niveau le moins privilégié), le niveau 0 est généralement appelé niveau superviseur ou noyau, et les niveaux 1 à 3 les niveaux utilisateurs. Cette architecture permet d'exécuter le noyau du système d'exploitation au niveau 0, et les différentes applications au niveau utilisateur. Les registres de contrôle 204 et 205 permettent notamment de spécifier: l 'événement à mesurer par chaque compteur, si cet événement doit être pris en compte lors de l'exécution du code non superviseur ("CPL" compris entre 1 et 3), si cet événement doit être pris en compte lors de l'exécution du code superviseur ("CPL" égal à 0), si une interruption doit être générée lorsque le compteur repasse à zéro. Dans le cas d'un système d'exploitation dans lequel: - les routines de service pour l'utilisateur sont au niveau de privilège 1 ou 2, et - les routines asynchrones à l'exécution du code utilisateur ("user" en anglais) (dont l'ordonnanceur) au niveau 0, il est possible de compter encore plus facilement la durée d'exécution d'un processus: il suffit de spécifier que l'incrémentation du compteur n'a lieu que lorsque le code exécuté n'est pas au niveau 0. Le composant 207 "LOGIC" comporte des composants de logique combinatoire bien connus, tels que des portes logiques, qui sélectionnent pour chaque compteur les valeurs de CPL à considérer. Le composant 208 multiplexeur sélectionne, pour chaque compteur, I'événement à considérer. Le processeur 106 est programmé pour mettre en oeuvre l'organigramme illustré en figure 3. D'abord, le processeur 106 effectue une opération d'initialisation 301, qui comporte: -la mise en place du système d'exploitation, de manière connue, -le démarrage du logiciel, de manière bien connue, et - la sélection de l'événement interne qui va être décompté par le compteur 201, comme indiqué ci-dessus. Cet événement est, dans l'exemple décrit et représenté, la survenance d'un cycle de processeur. Ensuite, le processeur 106 effectue une opération 302 de préchargement du compteur 201 avec une valeur telle que le complémentaire de ce nombre à 232 soit égal au nombre d'occurrences de l'événement interne considéré, que l'on souhaite dénombrer avant de changer de processus ou decontexte de processus. Ensuite, au cours d'une opération 303, un processus est exécuté et le compteur 201 décompte le nombre d'occurrences de l'événement qui lui a été associé, c'est-à-dire qu'à chaque occurrence de cet événement associé, il incrémente sa valeur de 1. Puis, au cours d'une opération 304, une interruption est déclenchée par l'APIC 203, dès que le compteur 201 repasse à la valeur "0". Dès que l'interruption est reçue, le processeur change de processus en cours d'exécution ou change de contexte du processus en cours d'exécution, au cours d'une opération 305. Ensuite, l'opération 302 est réitérée. On observe ici qu'un événement décompté peut aussi bien être I'un des événements présentés dans la documentation du processeur considéré, qu'une combinaison logique de ces événements (avec des fonctions logiques telles que "et",...). Ainsi, chaque cycle d'horloge survenant pendant un événement interne au processeur constitue un nouvel événement interne au processeur. On observe aussi que la présence de deux compteurs permet d'assigner à chaque compteur un événement particulier, au cours de l'initialisation 301, chaque compteur étant alors préchargé individuellement avec une première valeur prédéterminée particulière au cours de l'opération 302 et le premier compteur repassant à zéro déclenchant l'interruption 304. Selon une variante non représentée, à chaque processus est associée une première valeur prédéterminée qui lui est particulière. Dans cette variante, au cours de l'opération 302, le processeur précharge le compteur 201 à une première valeur prédéterminée qui dépend du processus qui va être exécuté au cours de l'opération 303. Plus généralement, tous les modes d'ordonnancement connus antérieurement à la présente invention et qui modifient dynamiquement les quanta attribués à chaque processus, bénéficient de la présente invention, puisqu'il n'est, grâce à elle, plus nécessaire de multiplier les interruptions correspondant au grain de ces quanta pour mesurer leur durée. Selon une autre variante non représentée, à chaque processus est associée une première valeur prédéterminée qui lui est particulière, en fonction des besoins exprimés par le processus. Par exemple, un processus qui sait qu'il va avoir besoin d'une grande partie de la ressource du processeur indique, à une adresse prédéterminée de la mémoire vive 104, une première valeur prédéterminée dite "requise" qui correspond à son besoin. Au cours de l'opération 302, le processeur 106 effectue alors un préchargement du compteur 201 avec cette première valeur prédéterminée requise, ou avec une première valeur qui en dépend, en fonction des besoins des autres processus, et des qualités de service qui leur sont attribuées. Selon une autre variante non représentée: - au cours de l'opération d'initialisation 301, les événements décomptés par le compteur 201 sont d'autres événements que des impulsions d'horloge et - I'opération 305 comporte d'autres étapes que le changement de processus ou le changement de contexte. Ainsi, par exemple, si l'événement considéré est relatif à une opération prédéterminée coûteuse en temps de traitement, comme l'accès systématique à une adresse dont la donnée n'est pas dans la mémoire cache, l'opération de modification immédiate d'exécution de programme peut comporter une opération de correction de ce défaut par exemple par préchargement de zones de mémoire destinées à être utilisées par ladite opération. En variante, I'homme du métier utilise l'accès aux événements internes que lui permet l'invention pour améliorer, de manière connue en soi, la programmation adaptative décrite ci-dessus. Plus généralement, I'opération 305 comporte une modification immédiate d'exécution de programme, et comporte, par exemple comporte: - au moins un changement de contexte de l'exécution du programme, - au moins un changement de processus exécuté et/ou - au moins une modification du code de ce programme. Selon une variante, la deuxième valeur prédéterminée qui déclenche la modification immédiate d'exécution de programme est initialisée au cours de l'opération de préchargement 302, dans un comparateur qui effectue en permanence la comparaison de la valeur du compteur avec la deuxième valeur prédéterminée et déclenche la modification immédiate d'exécution du programme dès que ces valeurs sont égales, au cours de l'opération 304. REVENDICATIONS 1. Procédé, caractérisé en ce qu'il comporte: - une opération de préchargement (302) d'au moins un compteur (201, 202), par une première valeur prédéterminée, - une opération de décompte (303), par chaque dit compteur, d'occurrences d'un événement prédéterminé interne audit processeur, - une opération de comparaison (304) de la valeur de chaque dit compteur avec une deuxième valeur prédéterminée associée audit compteur, et, lorsque l'un desdits compteurs atteint ladite deuxième valeur prédéterminée qui lui est associée, une opération de modification immédiate d'exécution de programme (305). 2. Procédé selon la revendication 1, caractérisé en ce que ladite opération de modification immédiate d'exécution de programme comporte au moins un changement de contexte de l'exécution du programme. 3. Procédé selon l'une quelconque des revendications 1 ou 2, caractérisé en ce que ladite opération de modification immédiate d'exécution de programme comporte au moins un changement de processus exécuté. 4. Procédé selon l'une quelconque des revendications 1 à 3, caractérisé en ce que ladite opération de modification immédiate d'exécution de programme comporte au moins une modification du code de ce programme. 5. Procédé selon l'une quelconque des revendications 1 à 4, caractérisé en ce que, au cours de l'opération de comparaison (304) de la valeur de chaque dit compteur avec une deuxième valeur prédéterminée associée audit compteur, la deuxième valeur prédéterminée est égale à "0". 6. Procédé selon l'une quelconque des revendications 1 à 5, caractérisé en ce que, au cours de l'opération de décompte d'occurrences d'événements prédéterminés (303), I'un desdits compteurs décompte des impulsions d'horloges. 7. Procédé selon l'une quelconque des revendications 1 à 6, caractérisé en ce que, au cours de l'opération de décompte d'occurrences d'événements prédéterminés (303), on décompte des événements susceptibles de retarder l'exécution d'un programme, puis, en fonction du résultat d'une ou plusieurs opérations de décompte, on effectue, de manière différée, une modification du contexte interne ou externe dudit programme. 8. Procédé selon l'une quelconque des revendications 1 à 7, caractérisé en ce que, au cours de l'opération de préchargement d'un compteur (302), un dit compteur est un compteur de performance interne à un processeur. 9. Procédé selon l'une quelconque des revendications 1 à 8, caractérisé en ce que, au cours de l'opération de préchargement (302), la première valeur prédéterminée dépend du processus, de manière prédéterminée. 10. Procédé selon l'une quelconque des revendications 1 à 9, caractérisé en ce que, au cours de l'opération de préchargement (302), la première valeur prédéterminée dépend d'une valeur donnée au cours de l'exécution dudit programme. 11. Procédé selon l'une quelconque des revendications 1 à 10, caractérisé en ce que: - au cours de l'opération de préchargement d'au moins un compteur (302), par une première valeur prédéterminée, on précharge au moins deux compteurs (201, 202) avec des premières valeurs prédéterminées, et - au cours de l'opération de décompte (303), chaque compteur décompte des occurrences d'un événement prédéterminé interne audit processeur, événement associé audit compteur. 12. Procédé selon l'une quelconque des revendications 1 à 11, caractérisé en ce qu'il comporte, préliminairement aux opérations de préchargement (302), de décompte (303), de comparaison (304) et de modification (305), une opération de sélection d'événement (301) au cours de laquelle on associe à chaque dit compteur un événement interne audit processeur. 13. Procédé selon l'une quelconque des revendications 1 à 12, caractérisé en ce que au moins un compteur (201) décompte le nombre d'occurrences d'impulsions d'horloge simultanées à un autre événement interne audit processeur. 14. Dispositif, caractérisé en ce qu'il comporte: - un processeur (106) adapté à précharger au moins un compteur (201, 202), par une première valeur prédéterminée, - à faire décompter, par chaque dit compteur un événement prédéterminé interne audit processeur, - à faire comparer la valeur de chaque dit compteur avec une deuxième valeur prédéterminée associée audit compteur, et, lorsque l'un desdits compteurs atteint ladite deuxième valeur prédéterminée qui lui est associée, à modifier immédiatement l'exécution de programme. 15. Dispositif selon la revendication 14, caractérisé en ce que ledit processeur (106) est adapté à modifier immédiatement l'exécution de programme en changeant, au moins, le contexte de l'exécution du programme, 16. Dispositif selon l'une quelconque des revendications 14 ou 15, caractérisé en ce que ledit processeur (106) est adapté à modifier immédiatement l'exécution de programme en changeant, au moins, le processus exécuté. 17. Dispositif selon l'une quelconque des revendications 14 à 16, caractérisé en ce que ledit processeur (106) est adapté à modifier immédiatement l'exécution de programme en modifiant, au moins, du code de ce programme. 18. Dispositif selon l'une quelconque des revendications 14 à 17, caractérisé en ce que ledit processeur (106) est adapté à ce que la deuxième valeur prédéterminée soit égale à "0". 19. Dispositif selon l'une quelconque des revendications 14 à 18, caractérisé en ce que ledit processeur (106) est adapté à faire décompter, à l'un desdits compteurs (201,202), des impulsions d'horloges. 20. Dispositif selon l'une quelconque des revendications 14 à 19, caractérisé en ce que ledit processeur (106) est adapté à faire décompter, à l'un desdits compteurs (201, 202), des événements susceptibles de retarder I'exécution d'un programme, puis, en fonction du résultat d'une ou plusieurs opérations de décompte, à modifier le contexte interne ou externe dudit programme. 21. Dispositif selon l'une quelconque des revendications 14 à 20, caractérisé en ce que au moins un dit compteur (201, 202) est un compteur de performance dudit processeur (106). 22. Dispositif selon l'une quelconque des revendications 14 à 21, caractérisé en ce que le processeur (106) est adapté à précharger un dit compteur (201, 202) à une première valeur prédéterminée dépendant du processus, de manière prédéterminée. 23. Dispositif selon l'une quelconque des revendications 14 à 22, caractérisé en ce que le processeur (106) est adapté à précharger un dit compteur (201, 202) à une première valeur prédéterminée dépendant d'une valeur donnée au cours de l'exécution dudit programme. 24. Dispositif selon l'une quelconque des revendications 14 à 23, caractérisé en ce que: - le processeur (106) est adapté à précharger au moins deux compteurs (201, 202) avec des premières valeurs prédéterminées, et - chaque compteur est adapté à décompter des occurrences d'un événement prédéterminé interne audit processeur, événement associé audit compteur. 25. Dispositif selon l'une quelconque des revendications 14 à 24, caractérisé en ce que le processeur (106) est adapté, avant de précharger chaque compteur (201, 202) et de modifier l'exécution, à sélectionner au moins un événement interne audit processeur, événement dont les occurrences sont décomptées par ledit compteur. 26. Dispositif selon l'une quelconque des revendications 14 à 25, caractérisé en ce que le processeur (106) est adapté à ce que au moins un dit compteur décompte le nombre d'occurrences d'impulsions d'horloge simultanées à un autre événement interne audit processeur. 27. Ordinateur, caractérisé en ce qu'il comporte un dispositif selon l'une quelconque des revendications 14 à 26. 28. Caméra, caractérisée en ce qu'elle comporte un dispositif de gestion selon l'une quelconque des revendications 14 à 26. 29. Télécopieur, caractérisé en ce qu'il comporte un dispositif de gestion selon l'une quelconque des revendications 14 à 26. 30. Appareil photographique, caractérisé en ce qu'il comporte un dispositif de gestion selon l'une quelconque des revendications 14 à 26. 31. Téléviseur, caractérisé en ce qu'il comporte un dispositif de gestion selon l'une quelconque des revendications 14 à 26. 32. Imprimante, caractérisée en ce qu'elle comporte un dispositif de gestion selon l'une quelconque des revendications 14 à 26. 33. Scanner, caractérisé en ce qu'il comporte un dispositif de gestion selon l'une quelconque des revendications 14 à 26. 34. Lecteur audio/vidéo, caractérisé en ce qu'il comporte un dispositif de gestion selon l'une quelconque des revendications 14 à 26.