Comment dormir pendant quelques microsecondes
Considérons le code suivant:
#include <stdio.h>
#include <time.h>
#include <math.h>
//Compile with gcc -lrt -lm -o test_clock test_clock.c
#define CLOCK CLOCK_MONOTONIC
int main(int argc, char** argv) {
double temp, elapsed;
int j;
struct timespec requestStart, requestEnd, req;
//Pseudo-sleep
clock_gettime(CLOCK, &requestStart);
temp = 0;
for(j=0; j < 40; j++)
temp += sin(j);
clock_gettime(CLOCK, &requestEnd);
elapsed = ( requestEnd.tv_sec - requestStart.tv_sec ) / 1e-6
+ ( requestEnd.tv_nsec - requestStart.tv_nsec ) / 1e3;
printf("Elapsed: %lf us\n", elapsed);
//Nanosleep
clock_gettime(CLOCK, &requestStart);
req.tv_nsec = 5000;
req.tv_sec = 0;
clock_nanosleep(CLOCK, 0, &req, NULL);
clock_gettime(CLOCK, &requestEnd);
elapsed = ( requestEnd.tv_sec - requestStart.tv_sec ) / 1e-6
+ ( requestEnd.tv_nsec - requestStart.tv_nsec ) / 1e3;
printf("Elapsed: %lf us\n", elapsed);
}
Sur mon 2.6.32 système, le résultat est
Elapsed: 5.308000 us
Elapsed: 69.142000 us
Je suis d'accord que c'est plus probablement parce nanosleep() demande au noyau de reporter le processus. Comment puis-je éviter cela? Je veux conserver la propriété de la CPU et de la juste ralenti autour d'une certaine quantité de temps.
Vous avez à la fois linux et le temps réel comme des balises. Pourquoi? Ils sont la craie et le fromage.
Ce n'est pas comme il y a un fou des gens qui travaillent sur linux-rt ou quelque chose comme ça... oh wait.
Jack de tous les métiers.....
Je suis intrigué: Quel est exactement le contexte? Quels sont que vous avez besoin de ce genre de précision?
des commentaires en temps réel le contrôle des plasmas confinés magnétiquement.
Ce n'est pas comme il y a un fou des gens qui travaillent sur linux-rt ou quelque chose comme ça... oh wait.
Jack de tous les métiers.....
Je suis intrigué: Quel est exactement le contexte? Quels sont que vous avez besoin de ce genre de précision?
des commentaires en temps réel le contrôle des plasmas confinés magnétiquement.
OriginalL'auteur Nikratio | 2011-02-13
Vous devez vous connecter pour publier un commentaire.
Si vous voulez que votre application soit en mesure de "sommeil" aussi précisément que possible, d'abord mettre votre application en temps réel des conditions de
Ont un coup d'oeil à http://www.drdobbs.com/184402031
Et cette autre question: nanosleep utilisation élevée de l'uc?
SCHED_DEADLINE
est à venir! lwn.net/Articles/356576 lwn.net/Articles/396634 Espérons-le, l'amélioration de la RT facilité d'utilisation sur Linux. (Si vous n'êtes pas prudent avecSCHED_FIFO
/SCHED_RR
, vous pouvez facilement verrouiller l'ensemble de la machine.)OriginalL'auteur Yann Droneaud
L'OS planificateur ne va pas faire quelque chose comme "oh, prendre ce fil désactiver le processeur pour exactement 86 cycles d'horloge avant de le mettre sur".
Vous donner le processeur, vous avez donné le processeur. L'OS va vous mettre sur quand elle se sent comme elle. Les Chances sont que vous aurez à attendre jusqu'à ce que ce soit d'autre est en cours d'exécution donne le processeur avant de vous peut se faufiler à l'arrière.
Eh bien, vous aurez reporté immédiatement avec
sched_setscheduler(SCHED_FIFO)
(ouSCHED_RR
ouSCHED_DEADLINE
, lorsque disponible). Mais ce sont des cas très particuliers.Je ne veux pas prendre le fil du processeur, j'ai juste envie de ne rien faire pour une quantité précise de temps. Il n'y a pas moyen de le réaliser?
Si vous avez besoin d'exécuter précisément à un certain temps, vous essentiellement besoin d'un système d'exploitation temps réel. Sinon, vous n'avez aucune garantie que vous ne serez pas échangé du processeur à un moment donné. Pourquoi avez-vous besoin pour exécuter précisément à cette époque?
Il était très certainement un multi-tâches système. Vous devriez peut-être lire un compte rendu de la mission Apollo 11 atterrissage, où un composant logiciel (le radar d'atterrissage) a été incapable de tenir en place et à respecter ses délais, mais que le système est capable de garder tous les autres composants en temps réel avec les exigences de bon fonctionnement.
OriginalL'auteur Anon.
Eh bien, vous aurez à apprendre à vivre avec elle depuis la page de man:
the actual time slept may be longer, due to system latencies and possible limitations in the timer resolution of the hardware
🙂Maintenant à la réponse à votre question, je crois que c'est parce que votre première boucle est en cours d'exécution de processus. En d'autres termes, il n'y a pas des changements de contexte impliqués puisque vous utilisez le PROCESSEUR à plat et que vous ferez tout ce travail au sein de votre 100ms quanta donnée à vous par le planificateur.
Cependant, il ya une bonne chance que
nanosleep
passera-vous puisque vous êtes explicitement demandé à être mis en sommeil. Il ne sera pas si inefficace que de simplement mettre votre processus un peuwhile
boucle jusqu'à ce que la durée est plus 🙂Cela signifie que vous êtes soumis à tous les aléas de l'ordonnanceur y compris le fait qu'un autre processus peut tout à fait utiliser ses quanta, donc votre processus peut être à partir de là pendant 100ms au moins. Sur un très-suffisamment chargé du système, il pourrait être absent pendant un certain temps.
OriginalL'auteur paxdiablo
//il est beaucoup mieux que le usleep.
OriginalL'auteur bogao3037
vous pouvez utiliser
usleep
méthode de dormir dans la microseconde unités.OriginalL'auteur Saurabh
L'efficacité d'un système d'exploitation qui a permis à des tâches à être allumées et avec une précision de quelques cycles d'horloge ferait très peu de chose.
Il existe des Systèmes d'exploitation qui font cela, mais sur régulier de matériel vous payer beaucoup de frais généraux pour l'hyperviseur
OriginalL'auteur Martin Beckett
C'est une tenue de répondre - je ne sais pas pertinentes linux internes, espérons-le, un expert peut intervenir et clair.
Une possibilité est que 69us est tout simplement la brute frais généraux de descheduling et puis un rééchelonnement de la thread. Même si le sommeil est court, le noyau peut faire beaucoup de travail pour effectuer un changement de contexte (ou la moitié d'un changement de contexte, si il n'y a rien à programmer), puis d'annuler presque immédiatement. Je ne sais pas combien de temps cela "devrait" prendre sur linux sur un PC typique.
Si cela ne suffit pas à l'expliquer, un planificateur général a une notion de "timeslice", qui est la durée d'un thread planifié sera laissé à courir avant que le planificateur pense à propos de la commutation, à moins qu'il soit deschedules lui-même ou d'autre chose de plus haute priorité devient de préférence d'heure. Le noyau sera faible niveau des minuteries de cuisson interrompt à la fin d'une tranche de temps (en plus des interruptions que le feu pour certains autres événements tels que les I/O qui pourrait débloquer un thread). Lorsqu'un timeslice se termine, le planificateur peut décider de poursuivre avec le même fil, ou de passer à un autre.
Il semble donc que si, quand vous dormez, soit (a) le planificateur n'est pas réellement le réglage d'une minuterie qui feront de votre thread de préférence d'heure à l'heure demandée, c'est juste en attente pour un timeslice, et donc le CPU va inactif plus longtemps que nécessaire; ou (b) il est d'avoir un thread de préférence d'heure à l'heure demandée, mais lorsque que vous avez donné de l'exécution par le sommeil, un autre thread de priorité égale suis arrivé, et le planificateur n'a aucune raison de préférer vous dessus jusqu'à ce qu'il est "à votre tour" de nouveau, selon les règles de l'ordonnanceur utilise habituellement pour décider de ce fil à l'horaire.
69us est assez court pour être un artefact de timeslicing.
Vous semblez avoir une connaissance rudimentaire de la solution - vous pouvez retarder pour de très courtes périodes, en étant assis dans une boucle de vérification de l'heure, comme un spinlock. Comme tout le monde le dit, même si, dans un non-temps réel du système, plus ou moins, par définition, vous ne pouvez pas exiger de l'ordonnanceur fonctionne votre fil à tout moment. Même dans un système en temps réel, si vous êtes en compétition avec les threads de même priorité que vous pouvez perdre, et si vous êtes en compétition avec des fils à priorité plus élevée que vous sera perdre.
OriginalL'auteur