Forum Programmation.c commande nice

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
17
jan.
2018

Bonjour à tous,
J'ai un programme nommé prog qui compte le nombre de boucles qui fait en 10 secondes. Si je fais:
./prog
le terminal me retourne 7 000 000, mon programme a fait 7 millions de boucles en 10 secondes.

je fais sur mon terminal:
taskset -pc 0 $$// tous les programmes que je lancerai sur ce terminal n'utiliseront que le coeur 0 et le thread 0
sudo nice -n -5 ./prog& ./prog // je lance 2 programmes, mais le premier est prioritaire.
Le terminal me retourne :
5 000 000 //nombre de boucle qu'a fait le premier programme en 10 secondes
2 000 000 //nombre de boucle qu'a fait le second programme en 10 secondes

Je m'attend donc a ce que le premier programme se lance en priorité et ne laisse exécuté le second programme que lorsque que le premier programme se termine car linux est préemptif. je devrais avoir donc sur mon terminal :
7 000 000
7 000 000
Or il semblerait que Linux a laissé un peu de temps de processeur au second programme alors qu'il n'est pas prioritaire. Est ce normal, car quand je gere les priorités en C avec sched_RR et sched_priority, j'ai bien le premier programme qui se lance en premier puis une fois terminé alors c'est le second qui se lance.

Merci d'avance pour votre aide

  • # oups

    Posté par  . Évalué à 1.

    "car quand je gere les priorités en C avec sched_RR et sched_priority, j'ai bien le premier programme qui se lance en premier puis une fois terminé alors c'est le second qui se lance."

    je viens de vérifier et c'est faux ! il lance d'abord un programme puis le second, meme si c'est un sched_RR et qu'ils ont la meme priorité, il exécuté d'abord le premiere programme puis ensuite le second, et je ne sais pas du tout pourquoi

    • [^] # Re: oups

      Posté par  . Évalué à 4.

      Le sched RR (Round Robin) il donne du temps alternativement à tous les process ayant la même priorité. Ceux de priorité inférieur ne seront pas exécuté.
      C’est Sched FIFO, qui attendra que la tâche soit terminé pour exécuter la suivante.

      • [^] # Re: oups

        Posté par  . Évalué à 1.

        oui je suis d'accord avec toi, mais la commande nice -n ne devrait donc pas lancer en meme temps mon second programme car ils sont de priorités différentes or c'est ce qu'il se passe

        • [^] # Re: oups

          Posté par  . Évalué à 8.

          Tu as deux modes de gestions multi tâches.
          Le mode Temps Réél, et le mode temps partagé. Par défaut, on lance les processus en mode temps partagé. Je vais expliquer à la pelleteuse (très grosse louche) le principe de fonctionnement et comment nice modifie ça.
          Quand on lance un programme en temps partagé, le noyau lui alloue un quota de temps. Partons du postulat que le quota par défaut est 100ms. Deux programmes « Ready » vont donc partagé le processeur chacun ayant 100ms de quota à tour de rôle. nice va modifier se quota : nice -m 20 va donner un quota de 120ms pour le programme correspondant. Mais n’empêchera pas l’autre programme d’utiliser son quota qui est toujours de 100ms. Néanmoins, sans nice chacun va s’exécuter pendant 5s. Si on a un quota 120/100, on va avoir un résultat de 4,xs contre 5,y (1-0,x == 0,y).

          Les processus en mode TR (temps réel) ne rendent jamais la main ! (enfin, sauf s’ils se mettent en attente avec select par exemple). En fonction des priorités, ça peut rendre un ordinateur de bureau inutilisable (interface graphique bloquée…)

          L’ordonnanceur choisi la tâche TR ayant la priorité la plus élevée, et l’exécute. Quand elle a fini, ou qu’elle se met en attente d’un événement extérieur, l’ordonnanceur donne la main à la nouvelle tâche prête ayant la priorité TR la plus élevée. S’il n’y a plus de tâche TR, les tâches en mode partagée sont exécutées.

          La concurrence entre les tâches TR, s’effectue suivant deux modes. FIFO ou RR. Prenons deux tâches TR de même priorité :

          • en mode FIFO, la première qui a la main, s’exécutera jusqu’à ce qu’elle est terminée, puis l’autre tâche sera exécuté. Si la première redevient prête, elle attendra que la seconde est finie.
          • en mode RR, les deux tâches vont travailler en temps partagé, mais seulement entre elles, puisque les autres tâches sont moins prioritaires.

          J’espère avoir été clair.

          • [^] # Re: oups

            Posté par  . Évalué à 1.

            Tu as été parfaitement clair !!!
            merci beaucoup !

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.