Maison >Tutoriel système >Linux >Un examen plus approfondi des minuteurs du noyau Linux : mécanismes asynchrones basés sur les interruptions et principes de contexte hors processus

Un examen plus approfondi des minuteurs du noyau Linux : mécanismes asynchrones basés sur les interruptions et principes de contexte hors processus

王林
王林original
2024-07-18 11:13:55697parcourir

深入了解 Linux 内核定时器:基于中断的异步机制与非进程上下文原则

1. Minuterie du noyau 1. Concepts de base

Dans certains scénarios, nous devons effectuer certaines actions après une heure précise, et nous ne voulons pas gaspiller de CPU en attendant. À ce moment-là, la minuterie est un mécanisme très approprié. Une minuterie est utilisée pour exécuter une fonction à un certain moment dans le futur afin d'accomplir une tâche spécifique.

Les minuteurs du noyau indiquent au noyau d'appeler une fonction spécifique avec des paramètres spécifiques à un moment donné. Le minuteur s'exécute de manière asynchrone sur son inscrit. Lorsque le minuteur est en cours d'exécution, la tâche qui a enregistré le minuteur peut être en veille ou en cours d'exécution sur d'autres processeurs, ou peut même s'être terminée depuis longtemps.

Le minuteur du noyau sous Linux est implémenté sur la base d'interruptions (douces) Minuterie d'application Linux, c'est-à-dire qu'il se trouve dans le contexte d'interruption plutôt que dans le contexte de processus. Il y a quelques principes à suivre dans un contexte non-processus :

L'accès à l'espace utilisateur n'est pas autorisé

actuel n'a aucun sens et donc indisponible

Impossible de dormir ou de planifier. Un planning ou une sorte de wait_event ne peut pas être appelé, et aucune fonction susceptible de provoquer une mise en veille ne peut être appelée. Les sémaphores ne sont pas non plus disponibles car ils peuvent provoquer une hibernation.

应用定时器2_linux 应用定时器_应用定时器2安卓版下载

Le code du noyau peut déterminer s'il est actuellement dans le contexte d'interruption en appelant la fonction in_interrupt(). Tant qu'il renvoie non 0, cela signifie qu'il est dans le contexte d'interruption. Le noyau peut déterminer si la planification est actuellement autorisée en appelant in_atomic(). Les situations dans lesquelles la planification n'est pas autorisée incluent : le fait d'être dans un contexte d'interruption et un contexte doté d'un verrou de transporteur.

Étant donné que la minuterie est exécutée de manière asynchrone, la fonction de traitement de la minuterie doit prêter attention à la protection d'exclusion mutuelle.

2.Timers pris en charge par le noyau Linux

Le noyau Linux prend en charge deux types de timers :

Timer classique : un timer dont la précision dépend de la fréquence des interruptions de l'horloge de l'ordinateur. La précision de la minuterie est généralement relativement faible, avec une précision de 1 000/HZms. Cette minuterie est générée à une fréquence fixe, c'est-à-dire toutes les 1000/HZms. Si la fonction d'horloge dynamique n'est pas activée, aucune perturbation de synchronisation réelle ne peut se produire lorsque la minuterie expire. Par exemple, seules les minuteries suivantes sont ajoutées au système : minuteries d'expiration de 11 ms, 52 ms et 78 ms, et les minuteries expirent avec précision. le temporisateur expirera tous les multiples de 4 ms (4, 8, 12...), il n'y aura donc pas nécessairement de perturbation de synchronisation au moment où le temporisateur expirera.

Minuterie à fréquence d'images élevée : la précision de la minuterie classique est relativement faible. Dans certaines situations, une minuterie de plus grande précision est requise, comme dans les applications multimédias du système d'exploitation Linux chinois, c'est pourquoi ce type de minuterie est introduit dans le système. Cette minuterie peut essentiellement se produire à tout moment.

应用定时器2_linux 应用定时器_应用定时器2安卓版下载

Deux notions d'exception s'imposent également ici :

Horloge dynamique : L'horloge périodique minuterie d'application Linux n'est activée que lorsqu'une tâche doit être réellement exécutée, sinon la technologie de l'horloge périodique est désactivée. L'approche consiste à désactiver l'horloge périodique si vous devez planifier l'exécution d'une inactivité ; puis à activer l'horloge périodique jusqu'à l'expiration de la minuterie suivante ou jusqu'à ce qu'une interruption se produise. L'horloge ponctuelle est une condition préalable à la réalisation d'une horloge dynamique, car la caractéristique clé de l'horloge dynamique est qu'elle peut être arrêtée ou redémarrée selon les besoins, et une horloge périodique pure ne convient pas à ces scénarios.

Horloge périodique : une horloge qui forme périodiquement l'heure.

En termes d'application, les minuteries ont deux utilisations principales :

Timeout : indique une perturbation qui se produira après une certaine période de temps. En fait, lors de l'utilisation du timeout, dans la plupart des cas, le timeout ne devrait pas se produire et la minuterie est souvent annulée avant l'expiration du délai. De plus, même s'il n'est pas annulé, l'incident de délai d'attente n'est souvent pas un incident précis. Par exemple, les différents temporisateurs utilisés dans le réseau expriment souvent le sens que s'il n'y a pas... avant ce moment, cela peut. être considéré..., la valeur de ce temps est souvent une valeur empirique ou une valeur calculée, et n'est pas une exigence temporelle précise. Dans ces situations, la minuterie classique est suffisante.

Timer : utilisé pour implémenter le timing. Par exemple, lors de la lecture du son, les données doivent être envoyées régulièrement à la carte son. Dans ces situations, il existe des exigences strictes en matière de temps si les données ne sont pas envoyées à la carte son à un moment donné. avec le temps, une distorsion sonore se produira. À ce stade, une minuterie de haute précision doit être utilisée.

应用定时器2安卓版下载_linux 应用定时器_应用定时器2

Linux peut être invité à fonctionner dans le mode suivant via la configuration :

Horloge dynamique à fréquence d'images élevée

Horloge de période de fréquence d'images élevée

Horloge dynamique à faible débit

Horloge de période à faible taux de code

3. Minuteur de noyau à faible débit

linux 应用定时器_应用定时器2安卓版下载_应用定时器2

Le temporisateur à faible débit est le temporisateur du noyau le plus courant. Le noyau utilisera l'interruption d'horloge du processeur ou toute autre source d'horloge périodique appropriée comme référence temporelle du temporisateur. Les interruptions d'horloge se produisent périodiquement, HZ fois par seconde. La fonction de traitement du timer correspondant à cette interruption est généralement timer_interrupt. Dans le traitement de cette fonction, elle sera éventuellement ajustée en do_timer et update_process_timers. Parmi eux, do_timer sera responsable des tâches à l'échelle du système et globales : mise à jour des jiffies et traitement des statistiques de processus ; et cette dernière fonction effectuera des statistiques de processus pour former TIMER_SOFTIRQ pour fournir une connaissance du temps au planificateur.

Lorsque la minuterie expire, la minuterie sera supprimée du tableau d'activation avant que la fonction de traitement de la minuterie ne soit appelée. Par conséquent, si vous souhaitez réexécuter après un certain temps après cette exécution, vous devez à nouveau ajouter le périphérique de minuterie. . Dans le système SMP, la fonction de minuterie sera exécutée par la CPU qui l'a enregistrée.

L'implémentation du timer du noyau doit répondre aux exigences et hypothèses suivantes :

La gestion du timer doit être la plus simple possible.

La conception doit avoir une bonne évolutivité lorsque le minuteur d'activité est considérablement réduit

La plupart des minuteries expirent en quelques secondes ou au plus quelques minutes, et les minuteries avec de longs délais sont assez rares.

Une minuterie doit fonctionner sur le même processeur que celui où elle a été enregistrée.

L'implémentation du timer du noyau à faible débit est très intelligente. Il est basé sur une structure de données par CPU. Le tableau de base de timer_list contient des pointeurs pointant vers cette structure. Si base est NULL, ce timer n'a pas été appelé pour s'exécuter ; sinon, ce pointeur indique quelle structure de données (c'est-à-dire quel processeur) l'exécute.

Chaque fois que le code du noyau enregistre un timer (via add_timer ou mod_timer), l'opération est finalement effectuée par internal_add_timer (dans kernel/timer.c), qui ajoute le nouveau timer à la "table en cascade" associée au CPU actuel "dans le timer. tableau unidirectionnel.

Comment fonctionnent les tables en cascade :

Si la minuterie expire dans les 0 à 255 jiffies suivantes, elle est ajoutée à l'un des 256 tableaux spécialement prévus pour les minuteries à court terme, en utilisant expires (c'est-à-dire que le tableau auquel il est ajouté est déterminé par les bits du délai d'expiration). 8 bits inférieurs du déterminé) déterminez à quel tableau ajouter

S'il expire plus tard (mais avant 16384 jiffies), il est ajouté à l'un des 64 tableaux. Ces 64 tableaux sont liés aux 8-13 bits d'expiration. Les bits déterminent quel tableau est utilisé. .

Des techniques similaires sont appliquées aux bits expirés 14-19, 20-25 et 26-31.

Si le minuteur expire à une date ultérieure

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn