Anthony Jaguenaud a écrit 1970 commentaires

  • # setitimer

    Posté par  . En réponse au message probleme pour faire un timer précis de l'ordre de la milliseconde. Évalué à 6.

    Salut,
    Je me suis tenté une implémentation avec setitimer…

    #define _POSIX_C_SOURCE 199309L
    
    #include <stdio.h>
    //    #include <sys/timerfd.h>
        #include <errno.h>
        #include <string.h>
        #include <stdlib.h>
    //  #include <unistd.h>
        #include <sys/mman.h>
    
    //#include <time.h>
    #include <unistd.h>
    #include <threads.h>
    #include <signal.h>
    #include <sys/time.h>
    
    
        #define COUNT 10001
        #define PERIODE 1000000 //1ms (in ns)
    
    mtx_t myLock;
    void (*old_handler)(int); // sighandler_t don't work !!! :-(
    
    void alarm_callback(int sig)
    {
      // Unlock du mutex pour continuer la boucle.
      (void) mtx_unlock(&myLock);
         if ((old_handler = signal(SIGALRM, alarm_callback)) == SIG_ERR)
        {
          fprintf(stderr,"Error setting SIGALARM in alarm_callback\n");
          return ;
        }
    
    
    }
    
        int main(int argc, char const *argv[])
        {
          if (mtx_init(&myLock, mtx_plain ) ==  thrd_error)
        {
          fprintf(stderr,"Error creating mutex\n");
          return -1;
        }
    
          // Lock one time to init locked. First loop must unlock
          if (mtx_lock(&myLock) == thrd_error)
        {
          fprintf(stderr,"Error locking mutex first time\n");
          return -1;
        }
    
          if ((old_handler = signal(SIGALRM, alarm_callback)) == SIG_ERR)
        {
          fprintf(stderr,"Error setting SIGALARM\n");
          return -1;
        }
    
    
    
           struct itimerval setTimer, oldTimer;
    
           setTimer.it_interval.tv_sec = 0;
           // Warning, c’est des us.
           setTimer.it_interval.tv_usec = PERIODE / 1000;
           // First period start in 1s
           setTimer.it_value.tv_sec = 1;
           setTimer.it_value.tv_usec = 0;
           //       Timer values are defined by the following structures:
           //
           //           struct itimerval {
           //               struct timeval it_interval; /* Interval for periodic timer */
           //               struct timeval it_value;    /* Time until next expiration */
           //           };
           //
           //           struct timeval {
           //               time_t      tv_sec;         /* seconds */
           //               suseconds_t tv_usec;        /* microseconds */
           //           };
    
    
           if (setitimer(ITIMER_REAL,&setTimer, &oldTimer) == -1)
         {
           fprintf(stderr,"Setitimer initialization failed\n");
           return -1;
         }
            struct timespec now, previous;
            long somme = 0;
            long peak = PERIODE, base = PERIODE;
            long tabTimer[COUNT];
            __uint64_t ret;
    
    
            if (clock_gettime(CLOCK_MONOTONIC,&previous ) < 0 )
            {
                printf("error clock_gettime : %s\n", strerror(errno));
                return -1;
            }
    
            for (size_t i = 0; i < COUNT; i++)
          {
          // Wait for sync
            if (mtx_lock(&myLock) == thrd_error)
              {
            fprintf(stderr,"Error lock in loop number %d\n",i);
            return -1;
              }
          clock_gettime(CLOCK_MONOTONIC,&now );
                tabTimer[i] = (now.tv_sec - previous.tv_sec) * 1000000000 + now.tv_nsec - previous.tv_nsec;
                previous = now;
    
            }
    
        const long high_10 = PERIODE + PERIODE / 10;
        const long low_10 = PERIODE - PERIODE / 10;
        int higher = 0;
        int lower = 0;
        int normal = 0;
            //we write results
            for (size_t i = 1; i < COUNT; i++)
            {
          //      printf("[%2d] = %ld\n",i,tabTimer[i]);
                somme += tabTimer[i];
                if( tabTimer[i] > peak)
                {
                    peak = tabTimer[i];
                }
                if( tabTimer[i] < base)
                {
                    base = tabTimer[i];
                }
            if (tabTimer[i] > high_10)
              {
            higher++;
              }
            else if (tabTimer[i] < low_10)
              {
            lower++;
              }
            else
              {
            normal++;
              }
            }
    
        int total = lower + higher + normal;
            printf("average en ns = %ld, peak = %ld(+%2.2f%%), base = %ld(-%2.2f%%)\n", somme/(COUNT - 1), peak, (((float)peak/PERIODE) - 1) * 100, base, (1. - ((float)base)/PERIODE)*100);
        printf(" Total : %d,\n"
               "\t- lower : %6d (%2.2f%%)\n"
               "\t- normal: %6d (%2.2f%%)\n"
               "\t- higher: %6d (%2.2f%%)\n",
               total,
               lower, 100. * ((float) lower)/total,
               normal, 100.* ((float)normal)/total,
               higher, 100.* ((float)higher)/total);
    
            return 0;
        }

    Pour le sigalarm, il faut le recabler à chaque fois.
    Voici quelques stats, j’y ai ajouté le nombre de fois ou on a un écart de plus de 10%. De plus, si on déborde sur un cycle, la différence entre les deux sera forcément très inférieur sur le cycle suivant. D’où la relative symétrie (+ou- 1) entre les higher et les lower.

    $ ./a.out 
    average en ns = 999998, peak = 1057467(+5.75%), base = 944193(-5.58%)
     Total : 10000,
            - lower :      0 (0.00%)
            - normal:  10000 (100.00%)
            - higher:      0 (0.00%)
    $ ./a.out 
    average en ns = 1000098, peak = 2083044(+108.30%), base = 603560(-39.64%)
     Total : 10000,
            - lower :      1 (0.01%)
            - normal:   9997 (99.97%)
            - higher:      2 (0.02%)
    $ ./a.out 
    average en ns = 999998, peak = 1206658(+20.67%), base = 796835(-20.32%)
     Total : 10000,
            - lower :      2 (0.02%)
            - normal:   9997 (99.97%)
            - higher:      1 (0.01%)
    $ ./a.out 
    average en ns = 999997, peak = 1107952(+10.80%), base = 894580(-10.54%)
     Total : 10000,
            - lower :      1 (0.01%)
            - normal:   9998 (99.98%)
            - higher:      1 (0.01%)
    $ su 
    Mot de passe : 
    ####################
    # En Temps Réel
    ####################
    .../Linuxfr/TR# chrt 50 ./a.out 
    average en ns = 999997, peak = 1009857(+0.99%), base = 978338(-2.17%)
     Total : 10000,
            - lower :      0 (0.00%)
            - normal:  10000 (100.00%)
            - higher:      0 (0.00%)
    .../Linuxfr/TR# chrt 50 ./a.out 
    average en ns = 999997, peak = 1011019(+1.10%), base = 979650(-2.03%)
     Total : 10000,
            - lower :      0 (0.00%)
            - normal:  10000 (100.00%)
            - higher:      0 (0.00%)
    .../Linuxfr/TR# chrt 50 ./a.out 
    average en ns = 999997, peak = 1009547(+0.95%), base = 976955(-2.30%)
     Total : 10000,
            - lower :      0 (0.00%)
            - normal:  10000 (100.00%)
            - higher:      0 (0.00%)
    .../Linuxfr/TR# chrt 50 ./a.out 
    average en ns = 999997, peak = 1015868(+1.59%), base = 979951(-2.00%)
     Total : 10000,
            - lower :      0 (0.00%)
            - normal:  10000 (100.00%)
            - higher:      0 (0.00%)
    .../SSD/C++/Linuxfr/TR#

    Un essai supplémentaire sur 2 minutes (2 × 60 × 1000 = 120 000ms)

    $ ./a.out 
    average en ns = 999999, peak = 1425844(+42.58%), base = 585376(-41.46%)
     Total : 120000,
            - lower :     22 (0.02%)
            - normal: 119955 (99.96%)
            - higher:     23 (0.02%)
    $ su 
    Mot de passe : 
    .../Linuxfr/TR# chrt 50 ./a.out 
    average en ns = 999999, peak = 1030337(+3.03%), base = 968720(-3.13%)
     Total : 120000,
            - lower :      0 (0.00%)
            - normal: 120000 (100.00%)
            - higher:      0 (0.00%)
    # Ajout d'une affinité CPU
    .../Linuxfr/TR# taskset 1 chrt 50 ./a.out 
    average en ns = 999999, peak = 1272574(+27.26%), base = 727705(-27.23%)
     Total : 120000,
            - lower :     10 (0.01%)
            - normal: 119981 (99.98%)
            - higher:      9 (0.01%)
    .../C++/Linuxfr/TR#

    En forçant l’affinité sur un CPU, on augmente l’erreur… ça ma surpris. Il faudrait voir si on peut interdire un CPU à tout le monde sauf un processus ;-)
    Après, j'avais choisi le CPU 0, peut-être que en prenant le 3…

    Linuxfr/TR# taskset 4 chrt 50 ./a.out 
    average en ns = 999999, peak = 1018414(+1.84%), base = 971595(-2.84%)
     Total : 120000,
            - lower :      0 (0.00%)
            - normal: 120000 (100.00%)
            - higher:      0 (0.00%)
    .../Linuxfr/TR#

    C’est mieux… est-ce le hazard, ou les IT sont cablé sur le premier CPU sous Linux ?

    Voilà pour mes tests du soir.

    Bonne nuit

  • [^] # Re: Paramètre de timerfd_create

    Posté par  . En réponse au message probleme pour faire un timer précis de l'ordre de la milliseconde. Évalué à 2.

    Le get_clocktime aussi a le paramètre CLOCK_REALTIME.

    Sinon, tu peux utiliser la fonction setitimer. Par contre, c'est un peu plus complexe, il faut intercepter le signal SIGALARM, dans la fonction callback, tu libères un sémaphore (mutex). Et dans ton code, tu bloques le sémaphores.

    Autre chose, le temps réel, ça veut dire arrivé à temps… donc si malgré les erreurs tu arrives à finir ton algo avant la deadline, pourquoi chercher à réagir plus vite ? Néanmoins j’avoue que l’écart type d’erreur laisse songeur. ;-)

  • # Paramètre de timerfd_create

    Posté par  . En réponse au message probleme pour faire un timer précis de l'ordre de la milliseconde. Évalué à 4.

    Re,
    Dans le man timerfd_create,
    il y a ce passage :

           CLOCK_REALTIME
                  A settable system-wide real-time clock.
    
           CLOCK_MONOTONIC
                  A nonsettable monotonically increasing clock that measures time from some unspecified point in the past that does not change after system startup.
    
    

    As-tu essayé avec REALTIME ?

  • # Set affinity ?

    Posté par  . En réponse au message probleme pour faire un timer précis de l'ordre de la milliseconde. Évalué à 3.

    Hello,
    Tu n’indiques pas comment tu lances ton programme.
    En mode temps réel sur un noyau standard, la seule chose plus prioritaire, c’est le noyau.

    Une solution pourrait-être de forcer ton processus sur un cœur, et d’interdire ce cœur au noyau.

    Sinon, le réveil un peu plus tôt puis boucle active peut-être viable, et vraiment précis.

  • # BitWarden

    Posté par  . En réponse à la dépêche Passbolt, le gestionnaire de mots de passe pour équipe, lance ses applications mobiles. Évalué à 7.

    Hello,
    J’ai installé sur un yunohost.org l’application bitwarden.

    L’application mobile se comporte aussi très bien avec la biométrie pour se déverrouiller. Je peux également, partager des mots de passe avec ma famille (les autres membres de mon instance).

    Quelles sont les différences/avantages/inconvénients entre les deux ?

  • [^] # Re: Habilitation

    Posté par  . En réponse au message [Offre d'emploi][Résolue] Développeur Linux C++ temps-réel pour observatoire astronomique.. Évalué à 2.

    Hello,
    Pour la définition du temps réel autant je suis d’accord que ça ne veut pas dire instantané, mais pour moi, ma façon de l’exprimer : « c’est répondre à une contrainte de temps et savoir détecter si une contrainte n’est pas respectée. »
    Que la contrainte de temps soit de 1ms ou de 1h ne change pas grand chose. C’est pour ça, que je privilégie les algos à temps constant quand je fais du TR, car s’ils passent en tests, ils passeront tout le temps.
    Si une contrainte n’est pas respectée, la conséquence sera en fonction de la criticité… pour l’écran d’un avion de ligne, l’écran se verra mettre en erreur (un gros F) à la place de l’affichage en cas de détection de panne hardware.
    Dans certains cas, on peut gérer un dépassement, mais souvent, ce n’est pas envisageable.

  • # Erreur ?

    Posté par  . En réponse au message probleme de compréhension sur les rvalue et std::move. Évalué à 2. Dernière modification le 14 janvier 2022 à 15:55.

    Salut, je vais sans doute écrire des bêtises…
    dans la dernière partie tu utilises V[1] alors qu’il n’y a que l’élément 0.

    Si a la place de ….data() tu utilises ….c_str() ? Ça change quelque chose ? (normalement non.)

    Après, le move est fait pour éviter des grosses copies, ici on peut copier avec juste une copie de 64bits. Avec une très longue chaîne, c’est pareil ?

    Le push_back doit également allouer la mémoire, si tu fait un vector.resize(8) avant le push_back, est-ce que ça se comporte pareil ?

    Pas d’idée supplémentaire.

  • [^] # Re: Pourquoi j'ai voté pour la série de John Harrison....

    Posté par  . En réponse au sondage Mon adaptation de Dune préférée. Évalué à 5.

    Le style des livres évolue avec l’auteur aussi. Le messie n’est pas le plus intéressant. L’empereur Dieu de Dune est passionnant, mais c’est surtout une analyse politique et sociétale. Après, ça devient un peu cul, sans doute le vieillissement de Franck.

    J’ai aussi aimé ce que le fils à fait : La trilogie du jihad butlerien 10 000 ans avant Dune, la trilogie juste avant, qui explique les trois maisons en conflit dans Dune, ce que j’ai moins aimé, c’est la fin de la saga… même si on retrouve des liens avec le jihad butlerien, les personnages sont un peu lourds.

  • [^] # Re: Yureh était mieux dans le film de Lynch

    Posté par  . En réponse au sondage Mon adaptation de Dune préférée. Évalué à 3.

    Oui, son conditionnement n’est pas visible dans le film de Villeneuve. De même que le manta est transparent.

    J’ai voté Lynch, car même s’il ne respecte pas bien le livre, c’est ce film qui m’a fait lire l’ensemble de l’œuvre. Je suis néanmoins impatient de voir la suite.

  • [^] # Re: pages man en couleur

    Posté par  . En réponse au message utilisation du "man". Évalué à 2. Dernière modification le 12 janvier 2022 à 11:18.

    Je ne m’étais jamais posé la question…
    Merci de m’avoir créé un besoin, et de l’avoir comblé instantanément.

  • [^] # Re: arte aussi…

    Posté par  . En réponse au journal Vidéo de qualitay sur l'histoire du mouvement anti-vaxx. Évalué à 2.

    Le problème des bivalves, c’est qu’ils sont ahémisphère… ;-)

  • [^] # Re: Norbert est partout

    Posté par  . En réponse au lien Le télétravail en 1985 . Évalué à 4.

    À la fin : « Les charmes de la vie de bureau… » avec le mec qui fume. Heureusement que certaines choses ont évoluées.

  • [^] # Re: pas grave

    Posté par  . En réponse au journal Le bug de l'an 2000 a 22 ans !. Évalué à 4.

    Du coup, tu as provoqué le bug de l’an 2010 ;-)

  • [^] # Re: Intéressant

    Posté par  . En réponse au journal Letlang, encore un nouveau langage de programmation. Évalué à 4.

    Une question sur l’aspect équation…

    let x-3 = 0 // => x = 3 la valeur x vaut-elle 3 ou c’est une contrainte ?
    
    x:=2   // Erreur ?
    x:=3   // Ok

    Quand on ajoute une contrainte, est-elle testé à la compilation ? L’équation est-elle résolu ou utilisée lors de l’affectation pour vérifier les contraintes ?

    Un code comme ci-dessous va-t-il détecter l’erreur à la compilation ou à l’exécution ?

    let x > 0
    let y < 0
    
    y := -2
    x := y    // Erreur

    Voilà pour mes interrogations actuelles ;-)

  • # Intéressant

    Posté par  . En réponse au journal Letlang, encore un nouveau langage de programmation. Évalué à 7. Dernière modification le 06 janvier 2022 à 09:25.

    Salut, je trouve certaines idées intéressante, mais il y a un point que je voudrais comprendre :

    Cependant, à la différence de la plupart des langages de programmation, une valeur n'a pas un unique type. Au contraire, je m'inspire ici des mathématiques :

    42 est un entier mais aussi un réel
    (1; 2) est un vecteur 2D mais aussi une matrice 2x1

    En quoi est-ce différent du système de haskell, dont les classes de type permet de résoudre élégamment se problème ?

  • [^] # Re: Linux n'est pas uniforme

    Posté par  . En réponse au journal Coût de piratage des serveurs Linux. Évalué à 4.

    Une mise à jour des failles du noyau nécessite un reboot, à moins que le remplacement à chaud d’un noyau soit possible et que je sois passé à côté. Mais sinon, ça m’étonnerait qu’il n’y ait pas eu de mise à jour de sécurité du noyau pendant dix ans. Je sais que les modules peuvent se charger à chaud ;-)

  • [^] # Re: reférecne sur la batterie

    Posté par  . En réponse au message Recherche batterie pour portable LDLC. Évalué à 2.

    Merci, je regarderai sur l’ordinateur.

    Si quelqu’un connait des sites fiables pour acheter ce type de pièces, je suis preneur.

    À+

  • [^] # Re: Praticiens

    Posté par  . En réponse au journal À quoi bon le libre. Évalué à 10.

    J’en ai trois, dont un qui est déçu de ne pas pouvoir se faire vacciné… surtout après 2 fermetures de classes successives en trois semaines, on se sent en état de siège… pour ma part en bon mouton, j’ai fait ma troisième dose ;-)

    Papap à raison, maintenant je n’ai plus besoin de mon téléphone pour capter la 5G, c’est plutôt cool, ça fera un déchet en moins ;-p

  • [^] # Re: Praticiens

    Posté par  . En réponse au journal À quoi bon le libre. Évalué à 6.

    Déjà l'homéopathie a peu de lien avec les urgences, les gens qui vont aux urgences pour des choses bénignes n'y vont pas parce qu'ils n'ont pas eu d'homéopathie par leur généraliste : …

    J’ai compris différemment son propos. Je le reformulerai comme il vaut mieux prendre un tube d’oméopathie (équivalent à un ou deux gros sucres), qu’un surdosage d’un « vrai » médicament, par exemple 10g de paracétamol… où tu vas finir aux urgences avec un foie malade à vie si tu ni reste pas dans les 15 jours.

  • [^] # Re: Un trou qui ne demande qu'à être rempli ?

    Posté par  . En réponse au journal Fin du support Linux par Antidote. Évalué à 3.

    Utile pour le travail et donc sur un PC Windows.

    Joli troll. Perso, je n'ai jamais travaillé sous Windows.

    Il faut lire ma phrase dans le sens de la frustration. Il faut parfois choisir, un boulot bien, correctement payé, une équipe internationale sympa, mais le PC sous Windows (vive WSL).

  • # Mince

    Posté par  . En réponse au lien Quelqu'un fait tourner des centaines de relais TOR dans le but de désanonymiser des utilisateurs. Évalué à 8.

    Quelqu’un Tor le système…

  • [^] # Re: Un trou qui ne demande qu'à être rempli ?

    Posté par  . En réponse au journal Fin du support Linux par Antidote. Évalué à 2.

    Salut,
    J’ai acheté la version 11 pour avoir Français + Anglais. Utile pour le travail et donc sur un PC Windows. Quand j’ai cherché la version Linux, j’ai eu la même déception. Je refuse d’être soumis à un abonnement, que je trouve excessif. Je garde la 10 sur Linux. Mais je n’ai plus accès à ma clé de licence (version 10) dans mon espace personnel puisque j’ai acheté la 11.

  • [^] # Re: Ô que je te comprend

    Posté par  . En réponse au journal Merci Linuxfr, aujourd'hui je fais mes valises. Évalué à 4.

    Depuis quand la presse fait-elle la science et la vérité ?

    Le presse informe. La justice, l’ordre des médecins trancheront. Mais a sent quand même le sapin pour lui.

    …documenté sa façon d'amplifier la moindre nouvelle qui peut faire vendre,…

    France info ne vend rien. C’est à mes yeux un des médias les plus fiables. Si je me trompe, merci de m’expliquer mon erreur et de me pointer un média fiable et neutre.

  • [^] # Re: Bon courage !

    Posté par  . En réponse au journal Merci Linuxfr, aujourd'hui je fais mes valises. Évalué à 4.

    Une vidéo sur le sujet des masques. Désolé, c’est sur la plateforme de google.

  • [^] # Re: Déception

    Posté par  . En réponse au journal Comptes de 1999 qui êtes vous?. Évalué à 4.

    Déception également, je ne suis que 2002, alors que je le lisais surement de manière épisodique en 1999. L’année où j’ai commencé à travailler… Courage, encore autant de temps, et je pourrais prendre des vacances ;-)