Sto cercando di capire come la CPU viene distribuita tra diversi processi con diverso no di thread. Ho due programmi Program1 e Program2.In che modo l'allocazione della CPU viene eseguita in Linux? Livello del filo o livello di processo?
Programma1 ha 5 thread mentre Programma2 ha solo thread principale.
SCENARIO -1:
terminal-1 : ./Program1
terminal-2 : ./Program2
Quando corro Program1 in un unico terminale e Program2 in un altro terminale, l'allocazione della CPU viene fatto 50% per Program1 e 50% per Program2. Ogni thread di Program1 sta ottenendo il 10% (cumulativamente 50% per Program1)
Questo mostra, indipendentemente dal numero di thread di un processo, ogni processo avrà uguale share di CPU. Questo mostra l'allocazione della CPU viene eseguita a livello di processo.
pstree mostra
├─bash───P1───5*[{P1}]
├─bash───P2───{P2}
SCENARIO -2:
terminal-1 : ./Program1 & ./Program2
Quando corro sia Program1 e Program2 terminale SAME, l'allocazione della CPU è fatto uguale per tutte Program1 e fili di Program2. Significa che ogni thread di Program1 sta ottenendo quasi il 17% (cumulativamente Program1 sta ottenendo l'83%) e Program2 sta ottenendo anche il 17%. Questo mostra che l'allocazione della CPU viene eseguita a livello di Thread.
pstree mostra
├─bash─┬─P1───5*[{P1}]
│ └─P2
Sto usando Ubuntu 12.04.4 LTS, kernel - config-3.11.0-15-generico. Ho anche usato Ubuntu 14.04.4, kernel-3.16.x e ottenuto risultati simili.
Qualcuno può spiegare come lo scheduler CPU di LINUX KERNEL che distingue SCENARIO-1 e SCENARIO-2?
Penso che lo scheduler della CPU distingua sia SCENARIO da qualche parte prima di allocare la CPU. Per capire come lo scheduler della CPU stia distinguendo SCENARIO-1 e SCENARIO-2, ho scaricato il codice sorgente del kernel di Linux.
Tuttavia, non ho trovato nel codice sorgente in cui si distingue SCENARIO-1 e SCENARIO-2. Sarà fantastico se qualcuno mi indicherà il codice sorgente o la funzione in cui lo scheduler della CPU sta distinguendo SCENARIO-1 e SCENARIO-2.
Grazie in anticipo.
NOTA: Anche se Ubuntu è basata su Debian, a sorpresa, in Debian 8 (kernel-3.16.0-4-686-pae) in allocazione della CPU sia di scenario è fatto a livello di thread significa ogni thread di Program1 sta diventando quasi il 17% (cumulativamente, Program1 sta ottenendo l'83%) e anche Program2 ottiene il 17%.
Ecco il codice: Program1 (con 5 fili)
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
// Let us create a global variable to change it in threads
int g = 0;
// The function to be executed by all threads
void *myThreadFun(void *vargp)
{
// Store the value argument passed to this thread
int myid = (int)vargp;
// Let us create a static variable to observe its changes
static int s = 0;
// Change static and global variables
++s; ++g;
// Print the argument, static and global variables
printf("Thread ID: %d, Static: %d, Global: %d\n", myid, ++s, ++g);
while(1); // Representing CPU Bound Work
}
int main()
{
int i;
pthread_t tid[5];
// Let us create three threads
for (i = 0; i < 5; i++)
pthread_create(&tid[i], NULL, myThreadFun, (void *)i);
for (i = 0; i < 5; i++)
pthread_join(tid[i],NULL);
return 0;
}
Program2 (solo thread principale)
#include <stdio.h>
#include <stdlib.h>
int main()
{
while(1);// Representing CPU Bound Work
}
Per disattivare tutti ottimizzazione da gcc, ho usato opzione O0 mentre compilando entrambi i programmi.
gcc -O0 program1.c -o p1 -lpthread
gcc -O0 program2.c -o p2
UPDATE: Secondo spiegazione ninjalj, nello scenario-1, allocazione della CPU viene fatto a gruppi di controllo di livello e come sto usando due terminali diversi (significa due sessione diversa), quindi 2 diversi gruppi di controllo e ciascun gruppo di controllo riceve il 50% di allocazione della CPU. Ciò è dovuto al motivo, l'autogruppo è abilitato per impostazione predefinita.
Poiché Program2 ha SOLO un thread e Program1 ha più thread, voglio eseguire entrambi il programma in un terminale separato (sessione diversa) e ottenere più allocazione CPU per Programma1 (come in Scenario-2, Program1 sta ottenendo l'83% Assegnazione della CPU rispetto al 17% del Programma2). È possibile in qualche modo che l'allocazione della CPU di Scenario1 sia la stessa di Scenario 2 in Ubuntu?
Inoltre mi sorprende anche se Ubuntu è basato su Debian, tuttavia Debian e Ubuntu si comportano diversamente. In caso di Debian, Program1 sta ottenendo più CPU in entrambi gli scenari.
"* Questo mostra, indipendentemente dal numero di thread di un processo, ogni processo avrà uguale share di CPU. mostra l'allocazione della CPU viene eseguita a livello di processo. * "Sciocchezze. Non mostra niente del genere. –
Sono abbastanza sicuro che gli algoritmi di pianificazione siano documentati da qualche parte. Almeno il codice sorgente è disponibile. – Olaf
@DavidSchwartz, i risultati sperimentali mostrano che nello Scenario-1, ogni processo riceve uguale share di CPU. Non capisco perché dici "Non mostra nulla di simile"? Puoi elaborare ? – bholanath