Comment sont attribuées les time-slices?

Bonjour à tous,

Je voudrais comprendre les grands principes de la façon dont le système attribue les tranches de temps, dans le but d’en tirer le meilleur parti.

Par exemple :
En supposant qu’on ait 16 tâches monothread, similaires et indépendantes à réaliser, très coûteuses en temps CPU mais pas gourmandes en autres ressources système (peu de besoin en mémoire ou en I/O, etc…), qu’est-ce qui aura terminé son travail le plus vite entre :

  • 1 process à 16 threads ;
  • 16 process à 1 thread ;
  • 4 process à 4 threads.
    ???

Contexte : 1) hormis ces 16 tâches, le système a déjà plein d’autres encours (pour fixer les idées, disons qu’il a N autres process qui travaillent : autres applications, daemons, …)
2) le nombre de cores est petit devant 16
3) on ne joue pas avec le nice

Je me dis que : si le système attribue d’abord une tranche de temps à chaque process, puis s’il répartit ensuite chacune de ces tranches entre les threads du process, alors 16 process devraient finir leur travail plus vite que 16 threads dans un même process… puisque mes tâches auront 16/(N+16) chances de tourner à un instant donné, alors qu’un seul process à 16 threads en aurait 1/(N+1)…

Est-ce que ça se passe comme ça ?

Quels sont les grands principes de cette allocation de temps ?

Merci d’avance pour vos éclaircissements :slight_smile:

Pehachem

Salut,

j’avais étudié très rapidement trois des différents ordonnanceurs Entrée / Sortie du noyau, CFQ (Completely Fair Queue), Deadtime et noop. Il me semble que la plupart des 3 vide les files d’attente avec une méthode roud-robin selon le principe FIFO, mais il ne faut pas m’en demander plus :sweat_smile:

Apparemment c’est encore un autre ordonnanceur qui est utilisé sur mon disque:

Sputnik93@debian-probook:~$ cat /sys/block/sda/queue/scheduler 
[mq-deadline] none