2012-02-21 22 views
18

Questa mattina ho letto su Linux scheduling in tempo reale. Come per il libro 'Programmazione del sistema Linux di Robert Love', ci sono due programmi principali lì. Uno è SCHED_FIFO, fifo e il secondo è SCHED_RR, il round robin. E ho capito come funziona un algoritmo di fifo e rr. Ma come abbiamo la chiamata di sistema,tempo reale pianificazione in Linux

sched_setscheduler (pid_t pid, int policy, const struct sched_parem *sp) 

possiamo impostare in modo esplicito la politica di pianificazione per il nostro processo. Quindi, in alcuni casi, due processi eseguiti da root, possono avere differenti criteri di pianificazione. Come un processo con SCHED_FIFO e un altro con SCHED_RR e con la stessa priorità. In tal caso, quale processo verrà selezionato per primo? il processo classificato FIFO o il processo classificato RR? Perché?

considerare questo caso. Ci sono tre processi A, B, C. Tutti stanno avendo la stessa priorità. A e B sono processi di classe RR e C è di classe FIFO. A e B sono eseguibili (quindi entrambi funzionano alternativamente in un intervallo di tempo). E attualmente A è in esecuzione. Ora C diventa eseguibile. In questo caso, se

1. A will preempt for C, or 
2. A will run until its timeslice goes zero and let C run. Or 
3. A will run until its timeslice goes zero and let B run. 
    a) here after B runs till its timeslice becomes zero and let C run or 
    b) after B runs till its timeslice becomes zero and let A run again (then C will starve untill A and B finishes) 
+5

Nota: dal momento che Linux 3.14 , esiste una politica aggiuntiva denominata SCHED_DEADLINE (http://en.wikipedia.org/wiki/SCHED_DEADLINE), che implementa l'algoritmo di pianificazione ELEest Deadline First (EDF). A ciascuna attività in questo criterio viene assegnata una scadenza e la prima - Il task di pianificazione viene eseguito. – Claudio

risposta

8

man sched_setscheduler spiega queste politiche di pianificazione in dettaglio.

In questo caso particolare, i due processi real-time hanno la stessa priorità nessuno di essi anticipare l'altro. Un processo SCHED_FIFO viene eseguito fino a quando non si blocca, il processo SCHED_RR viene eseguito fino a quando non si blocca da solo o quando scade il suo valore temporale.

1

mia comprensione delle due classi diverse è che uno SCHED_FIFO processo non è mai Preceduto da kernel. Anche se un altro processo di classe "SCHED_FIFO" vi aspetta il suo turno ...

Mentre le azioni di politica SCHED_RR le risorse CPU un po 'di più. Lo scheduler consentirà al processo SCHED_RR di funzionare per una quantità di tempo, quindi prevederlo solo per consentire di attivare un altro processo SCHED_RR. Questo è esattamente Round Robin.

SCHED_FIFO è "più forte", nel senso che se un processo SCHED_FIFO mai resa() per il kernel o invocare una chiamata di sistema su un dispositivo single core , poi tutti gli altri processi in tempo reale non può mai funzionare.

+1

"Lo scheduler consentirà al processo SCHED_RR di funzionare per un numero di volte, quindi pre-empt solo per lasciare girare un altro processo SCHED_RR." non è corretto. Può essere qualsiasi processo di pianificazione della classe (con il stessa priorità) dopo un processo 'SCHED_RR'. –

+2

Questo è inaccurato. i processi hanno priorità e un processo SCHED_FIFO a priorità inferiore dovrebbe essere preceduto da un processo a priorità più alta. – cha0site

13

In programmazione in tempo reale, FIFO e RR non hanno esattamente lo stesso significato che hanno in programmazione non in tempo reale. I processi sono sempre selezionati in un modo FIFO, tuttavia, il tempo quantum per SCHED_FIFO non è limitato a differenza del quantum tempo per SCHED_RR.

I processi SCHED_FIFO non anticipano i processi SCHED_RR con la stessa priorità.

sched_setscheduler (2) - pagina man Linux

...

"La politica di pianificazione di un processo determina dove verrà inserito nella lista dei processi con priorità statica uguali e come si muoverà all'interno di questa elenco. Tutta la pianificazione è preventiva: se un processo con una priorità statica più elevata è pronto per essere eseguito, il processo correntemente in esecuzione verrà preimpostato e ritornerà alla lista di attesa per il suo livello di priorità statico.Il criterio di pianificazione determina solo l'ordine all'interno dell'elenco processi eseguibili con uguale priorità statica. "

...

"Procedimento SCHED_FIFO viene eseguito fino a quando esso viene bloccato da una richiesta di I/O, è preempted da un processo a priorità più elevata, o chiama sched_yield (2)."

...

"Quando un processo SCHED_FIFO diventa eseguibile, verrà inserita alla fine della lista per la sua priorità"

...

" SCHED_RR:. Rotonda Pianificazione di Robin

SCHED_RR è un semplice miglioramento di SCHED_FIFO. Tutto quanto sopra descritto per SCHED_FIFO si applica anche a SCHED_RR, tranne per il fatto che ogni processo può essere eseguito solo per un tempo quantico massimo. Se un processo SCHED_RR è in esecuzione per un periodo di tempo uguale o superiore al tempo, verrà messo alla fine della lista per la sua priorità. Un processo SCHED_RR che è stato preceduto da un processo con priorità più alta e successivamente riprende l'esecuzione come processo in esecuzione completerà la parte non scaduta del suo quantum del round robin. "

+1

Quindi, vuoi dire, tutti i processi con la stessa priorità saranno messi nella stessa coda. Tra questi, il processo in classe FIFO verrà eseguito fino a quando non termina o blocca, ma il processo classificato RR viene eseguito solo per il suo timeslice. Ho ragione? – theB

+0

Sì, è così che ho capito la manpage. È lo stesso modo in cui altri sistemi realtime definiscono FIFO e RR (ad esempio, MQX RTOS di Freescale) – svenfx

+0

@theB Mi riferisco alla tua nuova risposta qui, perché in qualche modo non posso aggiungere un commento ad esso. Lei dice che la precedente discussione era sbagliata riguardo al libro di Robert Love "Linux System Programming". E hai ragione, come dice Robert: "Processi con priorità più alta (e processi SCHED_FIFO con priorità uguale o superiore) prevarranno sempre un processo SCHED_RR in esecuzione, indipendentemente dal fatto che abbia o meno uno dei suoi tempi ". (pagina 196). – svenfx

1

Secondo la pagina man, penso che 1 sia la risposta. A, B sono politica RR, C è politica FIFO Poiché RR è anche un miglioramento FIFO, tutti sono classe FIFO

Poiché tutti hanno la stessa priorità e la pagina man dice "Una chiamata a sched_setscheduler () o sched_setparam (2) inserirà il processo SCHED_FIFO (o SCHED_RR) identificato da pid all'inizio della lista se fosse eseguibile. Di conseguenza, può annullare il processo attualmente in esecuzione se ha la stessa priorità. (POSIX.1-2001 specifica che il processo dovrebbe andare alla fine della lista.)"

Una volta chiamando sched_setscheduler per impostare la politica di C come FIFO, C saranno prevenire A.