2010-08-27 4 views
4

Je veux avoir un processus en temps réel sur mon ordinateur. :)Est-il possible de "bloquer" une machine Linux avec un processus SCHED_FIFO?

J'ai joué un peu avec ça. J'ai créé un processus qui est essentiellement un while (1) (ne bloque jamais ni cède le processeur) et utilisé schedtool pour l'exécuter avec la politique SCHED_FIFO (également essayé chrt). Cependant, le processus laissait également d'autres processus s'exécuter. Puis quelqu'un m'a parlé de sched_rt_runtime_us et sched_rt_period_us. J'ai donc réglé le temps d'exécution sur -1 pour que le processus en temps réel prenne en charge le processeur (et j'ai également essayé de rendre les deux valeurs identiques), mais cela n'a pas fonctionné non plus.

Je suis sur Linux 2.6.27-16-serveur, dans une machine virtuelle avec un seul processeur. Qu'est-ce que je fais mal?

Merci,

EDIT: Je ne veux pas une bombe à fourche. Je veux juste qu'un processus s'exécute pour toujours, sans laisser courir d'autres processus.

+1

Si vous voulez dire «se bloquer» comme dans «ralentir et s'écraser», essayez une bombe à fourche. Si je vous comprends bien (et que vous n'êtes pas lié à une implémentation du noyau), une bombe à fourche fera exactement ce dont vous avez besoin. – new123456

+0

Je suis d'accord avec^une bombe à fourche le fera beaucoup plus efficacement. –

+0

Non, je ne le veux pas. Je veux juste qu'un processus s'exécute pour toujours, sans laisser courir d'autres processus. –

Répondre

5

Il y a une autre protection que je ne connaissais pas. Si vous n'avez qu'un seul processeur et que vous voulez un processus SCHED_FIFO comme celui-ci (qui ne bloque jamais ni ne cède le processeur volontairement) pour le monopoliser, en plus de lui donner une haute priorité (pas vraiment nécessaire dans la plupart des cas, mais pas mal), vous devez:

  1. Set sched_rt_runtime_us à -1 ou à la valeur sched_rt_period_us
  2. Si vous avez la planification de groupe configuré, définissez /cgroup/cpu.rt_runtime_us à -1 (en cas vous montez le système de fichiers cgroup sur /cgroup)

Apparemment, j'avais une planification de groupe configurée et ne contournait pas cette dernière protection. Si vous avez des processeurs N, et que vous voulez que vos processus N monopolisent le processeur, vous faites juste la même chose mais vous lancez tous depuis votre shell (le shell ne doit pas rester bloqué tant que vous n'avez pas lancé le dernier aura des processeurs pour fonctionner). Si vous voulez être vraiment sûr que chaque processus ira à un processeur différent, définissez son affinité CPU en conséquence.

Merci à tous pour les réponses.

3

Je ne suis pas sûr de schedtool, mais si vous modifiez avec succès le planificateur en utilisant sched_setscheduler à SCHED_FIFO, puis exécutez une tâche qui ne bloque pas, alors un coeur sera entièrement alloué à la tâche. Si c'est le seul noyau, aucune tâche SCHED_OTHER ne sera exécutée (c'est-à-dire n'importe quoi sauf quelques threads du noyau).

Je l'ai essayé moi-même.

Donc je suppose que votre tâche "non bloquante" bloquait, ou votre programme schedtool n'a pas réussi à changer le planificateur (ou l'a changé pour la mauvaise tâche).

+0

En particulier, avez-vous exécuté 'chrt' en tant que root? – caf

+1

@caf: Oui, j'étais. Comme je viens de le dire dans ma réponse, le problème n'était pas le processus lui-même ni 'schedtool' ou' chrt'. Il y avait une autre protection dont je n'étais pas au courant. Merci. –

1

Aussi vous pouvez vous faire traiter un SCHED_FIFO avec la plus haute priorité de 1. Donc le processus s'exécutera pour toujours et il ne sera pas préempté.

+0

Vous devez également avoir une boucle d'attente très occupée pour que personne d'autre n'ait la chance de courir – chandank

Questions connexes