Su un sistema embedded (kernel Linux 2.6.28 su processore ARM usando glibc 2.6.1) Sto eseguendo un'applicazione composta da più thread. Vorrei uno di quei thread per ottenere più tempo CPU rispetto agli altri.Nice-Level per pthreads?
Una delle possibilità per la definizione delle priorità sembra essere quello di utilizzare pthread
\ _setschedparam
con SCHED
\ _RR
(o SCHED
\ _FIFO
), tuttavia questo dà il filo abbastanza troppa CPU (a meno che non dorme, si mangia via tutte le CPU dalla sua collega thread che utilizzano ancora SCHED_OTHER
).
Un'altra opzione sarebbe l'impostazione del livello piacevole del thread. Tuttavia mentre questo sarebbe esattamente quello che stavo cercando (il thread ottiene un po 'più CPU ma non può far morire di fame gli altri thread), non riesco a farlo funzionare correttamente. Secondo le pagine man, "i thread non condividono un buon valore comune", che interpreto in quanto posso impostare singoli valori validi su thread diversi nello stesso processo.
Ecco il mio codice:
pid_t tid;
tid = syscall(SYS_gettid);
int ret = setpriority(PRIO_PROCESS, tid, priority);
Tuttavia sembra che tid è lo stesso tra tutte le discussioni. Inoltre, l'impostazione dei singoli livelli di qualità per il thread restituirà comunque l'ultimo livello piacevole impostato in tutti i thread quando si chiama getpriority
. Dalle prestazioni questo è coerente (ad esempio, esegui il thread A e il thread B con lo stesso compito, quindi imposta A su -19 e B su 19 ed entrambi termineranno all'incirca nello stesso tempo).
Tuttavia, quando si esegue il thread A, quindi impostandolo su -19 e quindi eseguendo B e impostandolo su +19, B funzionerà alla massima potenza (in modo che termini prima di A).
Quindi sembra che un thread userà il livello di qualità impostato nel momento in cui viene eseguito senza alcun modo di modificarlo in seguito.
Ho cercato su google come un matto per ulteriori informazioni o qualsiasi tipo di conferma, ma tutto quello che ho trovato finora è piuttosto vago. Qualcuno qui ha qualche descrizione disponibile su come i livelli di thread sono gestiti su Linux (2.6.28, glibc 2.6.1)? E come potrei cambiare il bel livello di un thread già in esecuzione?
So che questo è un po 'tardi per la festa ma sembra che tu stia cercando di fare qualcosa che sto cercando di fare, e considerando che sono arrivato qui tramite una ricerca su google, altri potrebbero farlo anche tu. Volevo sapere come hai creato i tuoi fili? Secondo pthreads, dicono che tutti i thread devono condividere la stessa priorità se realizzati con thread NTPL. –