2 votes

Comment fonctionne une minuterie de l'unité centrale si la valeur de comptage est supérieure à ce qu'elle peut contenir ?

Si je ne me trompe pas, le C sleep est l'un des endroits où une minuterie de l'unité centrale est utilisée. Linux met en place une minuterie et retire le processus de la liste des processus en cours. scheduler . Comptes de la minuterie down et une fois qu'il a atteint 0 il interrompt l'unité centrale et le système d'exploitation réintègre le processus dans le planificateur. Ai-je raison ?

Si c'est le cas, que se passe-t-il si la valeur de la minuterie est supérieure au nombre de bits que le matériel du compteur peut gérer ? Disons que le compteur a une valeur maximale de 23 et j'ai besoin d'un 24 valeur du bit (c'est-à-dire que je dois sleep pendant longtemps).

Editer :

Par ailleurs, que se passe-t-il si nous avons plusieurs mises en veille en même temps, plus que le CPU n'a de compteurs pour cela ?

1voto

None Points 241

la fonction sommeil est l'un des domaines dans lesquels une minuterie de l'unité centrale est utilisée

Non. Le noyau Linux met en œuvre une fonction de planificateur . Lorsque vous appelez nanosleep() (la bibliothèque GNU C sous Linux utilise nanosleep() pour mettre en œuvre sleep() ), vous faites un nanosleep syscall ; cela fait que le noyau ne planifie pas cette tâche (généralement un thread dans un processus de l'espace utilisateur) avant que la durée souhaitée ne soit écoulée, ou un signal est délivré à un gestionnaire de signaux de l'espace utilisateur installé sans le drapeau SA_RESTART en utilisant cette tâche (dans ce cas, l'appel système retourne avec le drapeau -EINTR ).

Sur un microcontrôleur, par exemple un Arduino ou similaire, vous puede mettre en œuvre le sommeil à l'aide d'une minuterie, cependant.

Supposons que vous disposiez d'un dispositif de minuterie qui peut compter de n'importe où jusqu'à TIMER_MAX à zéro, c'est-à-dire dormir pour tout nombre d'unités de temps compris entre 1 et TIMER_MAX . Si vous souhaitez dormir plus longtemps, vous pouvez le faire en TIMER_MAX intervalles :

/* Timer-based sleep function; returns the number of units slept,
   at most 'units'.  Can only sleep between 1 and TIMER_MAX, inclusive. */
static unsigned short  timer_sleep(unsigned short units);

void sleep(unsigned long duration)
{
    /* "long" sleep(s) */
    while (duration >= TIMER_MAX)
        duration -= timer_sleep(TIMER_MAX);

    /* "short" sleep(s) */
    while (duration > 0)
        duration -= timer_sleep(duration);
}

Vous pouvez remplacer cette dernière boucle while par un simple timer_sleep(duration) si timer_sleep(u) renvoie toujours u . Ecrit comme ci-dessus, en utilisant deux boucles while, le sommeil fonctionnera tant que timer_sleep(u) retours u ou moins.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X