Newsgroup: it.comp.os.linux.development
Titolo: Priorità dei processi

 man renice
Si, conosco il comando renice, ma non riesco a capire come funziona il
tutto.
Infatti, con il comando renice (come dice la man page), posso aumentare
o diminuire (se root) di 20 la priorità del processo.
Poiché io utilizzo la funzione sched_setscheduler per modificare il tipo
di schedulazione (ROUND ROBIN) e fisso una priorità di 90 (nella man
page di sched_setscheduler si parla di un massimo di 99) qual è il legame
con la
priorità di renice?
Mi viene il dubbio che renice modifichi una priorità diversa da quella che
si può invece definire con sched_setscheduler.
Quindi ripeto la mia domanda: se la priorità di un programma da me fatto
viene
modificata con il codice seguente
---
struct sched_param p;
p.sched_priority=90;
sched_setscheduler(0,SCHED_RR,&p);
---
come posso far ottenere ad un altro processo (tcpdump, quindi non scritto da
me)
servendomi dei comandi Linux, la STESSA priorità del programma che ho fatto
io?
Spero, ora, di essere stato chiaro e di non aver detto corbellerie come la
solito :)

 servendomi dei comandi Linux, la STESSA priorità del programma che ho fatto io?
Stai mischiando priorita` statiche (la 90 data con SCHED_RR) e dinamiche
(quella di tcpdump lanciato da una shell). In questo modo se il tuo
programma e` l'unico a girare con SCHED_RR, tutti gli altri schedulati
con SCHED_OTHER potrebbero non avere alcuna chance di essere eseguiti
(man sched_setscheduler). Se vuoi che tcpdump e il tuo programma
condividano piu` equamente il tempo di CPU, devi scrivere un wrapper per
tcpdump e farlo schedulare alla stessa priorita` _statica_ del tuo
programma.
Ciao
 David
-- 
<d.santinoli presso mi. flashnet. it>

 fatto io?
1 - la priorita' e' un conto
2 - il nice un altro
la priorita' sarebbe meglio lasciarla al task switcher, per evitare 
problemi di boosting nei thread che occupano risorse condivise (ad 
esempio l'accesso alla rete :)
*diminuendo* i nice dei 2 prog allo stesso valore (-1 va bene per 
entrambi) ottieni + o - la stessa priorita' di esecuzione (boosting a 
parte).
spero di essere stato chiaro.

 parte).
Non mi basta diminuire la priorità dinamica (i nice) poiché mi serve
un'applicazione real-time (almeno soft real-time), quindi DEVO utilizzare
SCHED_RR.

 programma.
Grande, come fare? O meglio, non voglio che mi scriviate il codice (se si
tratta di fare un programma) ma dove posso trovare informazioni per questo
wrapper?

 questo wrapper?
usi una exec**, o una system()

 utilizzare SCHED_RR.
ok, fatti il wrapper usando exec** o system().

 ok, fatti il wrapper usando exec** o system().
Potrei fare un'altra cosa? Dal mio programma faccio un mlockall() per
bloccare lo swap, uno sched_setscheduler per fissare a SCHED_RR il
processo e subito dopo un altro sched_setscheduler specificando il
PID di tcpdump, che ho caricato come processo in background precedentemente.
In questo modo potrei avere due processi con la STESSA priorità, giusto?
Bene, ho provato ma ho notato che la mia applicazione ha comunque il
sopravvento, tcpdump perde moltissimi pacchetti!!!!
Cosa che non succede se entrambi hanno priorità normale senza
SCHED_RR.

 wrapper?
Hai tre possibilita`:
1. Compili questo:
 #include <sched.h>
 #include <stdlib.h>
 #include <errno.h>
 #include <stdio.h>
 main(int argc, char *argv[]) {
  struct sched_param sch;
  sch.sched_priority=80; /* o quel che vuoi */
  if(argc!=2) exit(1);
  if(sched_setscheduler(atoi(argv[1]),SCHED_RR,&sch))
perror("sched_setscheduler");
 }
e lo esegui, da root, dando come argomento il PID del processo tcpdump
di cui settare la priorita`.
2. Ti procuri il codice di tcpdump e ci sbatti uno sched_setscheduler()
all'inizio.
3. Scrivi un programma simile a quello sopra, che modifica la propria
priorita` prima di lanciare tcpdump (con execl() o simili).


 di cui settare la priorita`.
E' quello che ho fatto (post precedente) ma sembra che il mio applicativo
sia sempre "più importante" di tcpdump, infatti tcpdump per un sacco di
pacchetti, cosa che non accade se tolgo (ad entrambi) lo SCHED_RR.