2016-02-24 12 views
7

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.

+3

"* 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. –

+1

Sono abbastanza sicuro che gli algoritmi di pianificazione siano documentati da qualche parte. Almeno il codice sorgente è disponibile. – Olaf

+1

@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

risposta

5

Il kernel linux fa non distinguere tra processi e thread nella pianificazione.

I thread sono processi che capita di condividere la maggior parte della loro memoria . Oltre a ciò, sono trattati allo stesso modo dallo scheduler.

È possibile avere 50 processi e 30 thread. Questo è 80 "cose" e il kernel li pianificherà senza riguardo al fatto che si tratti di processi o thread

+0

grazie per il commento. I risultati sperimentali mostrano che quando un processo ha più thread ha più CPU (Scenario-2), mentre nello Scenario-1, l'allocazione della CPU non dipende dal numero di thread che un processo ha, significa che ogni processo otterrà la stessa quota di CPU e la condivisione della CPU sarà ulteriormente suddivisa equamente tra i thread di quel processo. – bholanath

+0

Perché non pubblichi il tuo codice di misura e il banco di prova. Se si guarda '/ proc//...' per questo, un processo multithread riporterà il cumulativo per i suoi thread. Per vedere il per-thread, guarda a/proc// task//... '. –

+0

Ho controllato usando in alto -H e i risultati mostrano tutti i thread. – bholanath