2012-05-12 12 views
6

Sto sperimentando con SCHED_FIFO e vedo alcuni comportamenti imprevisti. Il server che sto usando ha 12 core con hyper-threading disabilitato. Tutti gli interrupt configurabili sono stati impostati per essere eseguiti sulla CPU 0.Uso pratico delle priorità di pianificazione in tempo reale di Linux (SCHED_FIFO e SCHED_RR)?

Il mio programma inizia a creare un thread per attività a priorità inferiore utilizzando la libreria pthreads senza modificare il criterio di pianificazione con affinità CPU impostato su core 0. Il thread padre imposta quindi la CPU affinità con il core 3 e il proprio criterio di pianificazione su SCHED_FIFO utilizzando sched_setscheduler() con pid zero e priorità 1 e quindi si avvia un ciclo non bloccante.

Il programma funziona correttamente. Tuttavia, se provo ad accedere al server per una seconda volta mentre il programma è in esecuzione, il terminale non risponde finché non interrompo il mio programma. È come se lo scheduler stia cercando di eseguire altri processi sullo stesso core del processo in tempo reale.

  1. Cosa mi manca?
  2. Lo scheduler tenta ancora di eseguire altri processi su un core che esegue un processo in tempo reale? Se è così, c'è un modo per impedirlo?
  3. L'impostazione del criterio di pianificazione con sched_setscheduler() nel padre modifica il comportamento del figlio creato in precedenza?

Grazie in anticipo.

risposta

5

sched_setscheduler imposta lo scheduler del processo , non il thread. Vedere:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/sched_setscheduler.html

Se si desidera impostare lo scheduler per un thread, è necessario utilizzare le pthread_attr_setschedpolicy e pthread_attr_setschedparam funzioni sull'oggetto attributo per il nuovo thread prima di crearlo.

io non sono sicuro di come conforme Linux è il onorare questi requisiti, ma si dovrebbe almeno iniziare facendo in modo che il codice è corretto per la specifica, quindi regolare in base alle esigenze ...

+0

Grazie per il rispondere. Hai ragione, la documentazione dice che sched_setscheduler() imposta la politica di pianificazione per il processo e non il thread. Tuttavia, ho eseguito alcuni test utilizzando ps dopo aver letto questa risposta e le politiche sono impostate correttamente per i thread. Questo mi ha spinto a eseguire ulteriori test. Uno dei problemi più evidenti è che l'accesso richiede molto tempo quando il programma è in esecuzione. Sembra decisamente che la sessione di bash per il nuovo login sia inizialmente impostata sulla CPU che esegue il processo in tempo reale. – digby280

Problemi correlati