2012-02-09 10 views
13

Attualmente sto studiando lo scheduler di Linux. Per quanto riguarda l'affinità core della CPU, vorrei sapere quanto segue:In che modo ogni processo è bloccato a un core specifico per pianificazione (Linux)

1) In che modo ciascun processo (thread) è bloccato su un core?

c'è una chiamata di sistema sched_setaffinity per modificare l'affinità nucleo su cui viene eseguito un processo. Ma internamente, quando viene generato un processo (o un thread), in che modo lo scheduler Linux predefinito assegna il processo (thread) a un core specifico? Ho modificato la chiamata di sistema sched_setaffinity per scaricare informazioni sull'attività trasferita da un nucleo all'altro.

printk(KERN_INFO "%d %d %ld %lu %s\n", current->pid, current->tgid, 
             current->state, current->cpus_allowed, 
             current->comm); 

Sembra che non v'è alcuna discarica delle suddette informazioni in /var/log/messages. Quindi lo scheduler predefinito attacca ogni processo in un modo diverso, ma non riesco a capire come.

2) È possibile ottenere l'ID nucleo tramite PID o altre informazioni?

Questo è ciò che voglio implementare all'interno del kernel di Linux. In task_struct, c'è un membro chiamato cpus_allowed. Ma questa è una maschera per impostare l'affinità, non l'ID principale. Voglio recuperare un dato che identifica il nucleo su cui è in esecuzione il processo specificato.

Grazie,

risposta

0

CPU nucleo affinità è operativo specifico. Il sistema operativo sa come farlo, non è necessario. Potresti incorrere in tutti i tipi di problemi se hai specificato quale core eseguire, alcuni dei quali potrebbero rallentare il processo.

Nel kernel Linux, la struttura dati associata ai task task_struct contiene cpu_allowed campo maschera di bit. Questo contiene n bit uno per ciascuno dei n processori nella macchina. Una macchina con quattro core fisici avrebbe quattro bit. Se quelle core della CPU fossero abilitate per hyperthread, avrebbero una maschera di bit a otto bit. Se un dato bit è impostato per un dato processo, quel processo può essere eseguito sul core associato. Pertanto, se un processo è autorizzato a girare su qualsiasi core e gli è consentito migrare attraverso i processori secondo necessità, la maschera di bit sarà interamente 1s. Questo è infatti lo stato predefinito per i processi sotto Linux. Ad esempio,

PID 2441: PRIO 0, POLICY N: SCHED_NORMAL, NICE 0, AFFINITY 0x3 

processo 2441 ha affinità CPU di 0x3, che significa che può utilizzato in Core0 e Core1.

Le applicazioni possono anche specificare/impostare l'affinità utilizzando l'API Kernel sched_set_affinity() modificando la maschera di bit.

+0

Grazie per la risposta. Ma questo è diverso da quello che voglio. Mi chiedevo se la mia descrizione fosse fuorviante ... Prima di tutto, non uso la chiamata di sistema 'sched_setaffinity' (non sched_set_affinity ma sched_setaffinity) perché non creo un'applicazione in esecuzione nello spazio utente. – akry

+0

In secondo luogo, il campo 'cpus_allowed' (non cpu_allowed) non è una informazione sufficiente per identificare il core della CPU su cui è in esecuzione il processo. cpus_allowed è impostato come 1 di default in modo che il processo possa spostare tutti i core disponibili. Se c'è un campo/metodo che dice la posizione in cui il processo è in esecuzione, questo è quello che voglio veramente sapere. – akry

+0

Comunque, grazie per aver risposto alla mia domanda. – akry

4

Ogni CPU ha un proprio runqueue, per quanto ne so possiamo scoprire corrente CPU di un processo, cercando per il quale runqueue a cui appartiene. Dato task_struct *p, possiamo ottenere il suo runqueue da struct rq = task_rq(p), e struct rq ha un campo chiamato cpu, credo che questa dovrebbe essere la risposta.

Non ho provato questo, in pratica, basta leggere un codice on-line, e non sono abbastanza sicuro che funzionerà o meno. Vorrei che potesse aiutarti.

+0

Grazie per la risposta. Ti farò sapere dopo aver provato questo metodo. – akry

+1

Si noti che questo è filante: l'attività potrebbe essere migrata da un runqueue a un altro al di sotto di voi. – caf

2

campo 39 nella /proc/pid/stat dice al corrente core/CPU del processo.

es .:

#cat /proc/6128/stat 
6128 (perl) S 3390 6128 3390 34821 6128 4202496 2317 268 0 0 1621 59 0 0 16 0 1 0 6860821 10387456 1946 18446744073709551615 1 1 0 0 0 0 0 128 0 18446744073709551615 0 0 17 8 0 0 0 

Process 6128 è in esecuzione sul nucleo 8.

2

È possibile determinare l'ID della CPU su cui è in esecuzione un thread utilizzando il suo task_struct:

#include <linux/sched.h> 

task_struct *p; 
int cpu_id = task_cpu(p); 
Problemi correlati