|
Appunti informatica |
|
Visite: 1277 | Gradito: | [ Picolo appunti ] |
Leggi anche appunti:Contenuto del floppy diskContenuto del floppy disk Il floppy disk allegato costituisce una raccolta di C come cesareC come Cesare Il Cesare in questione è proprio Caio Giulio Cesare, il noto imperatore romano Gli operatoriGli operatori Come tutti i linguaggi di programmazione, il C dispone di un insieme |
Problemi di cooperazione nel modello a scambio di messaggi
VIII) Scrivere una applicazione concorrente che implementi uno schedulatore di processi che gestisce tre livelli di priorità usando le code di messaggi.
Descrizione: Il programma seguente mostra come è possibile implementare uno schedulatore di processi usando le code di messaggi. Un processo utente che voglia essere schedulato deve inviare allo schedulatore un messaggio di tipo Ready_To_Be_Scheduled, indicando in esso la propria priorità e il proprio PID, dopodiché si pone in attesa, da parte dello schedulatore, di un messaggio di tipo Ready_To_Schedule_You che gli comunichi che è stato scelto: a questo punto il processo eseguirà il suo carico di istruzioni e prima di terminare invierà allo scheduler un messaggio di tipo End_of_Execute, segnalando in tal modo di aver concluso il proprio lavoro. Più in generale, lo scheduler esegue ciclicamente il polling (receive non bloccante) di una coda dei messaggi (si è scelto per semplicità di usare una sola coda) alla ricerca di una richiesta di schedulazione, analizzando le richieste disponibili sulla base della priorità dichiarata dai singoli processi e scegliendo il prossimo processo da schedulare: letto il PID del messaggio prescelto, gli viene inviato un messaggio di attivazione. Fatto ciò, non gli resta che porsi in attesa della segnalazione di terminazione del processo schedulato, dopo la quale potrà riprendere a svolgere da capo la propria attività. Si noti che, nell'implementazione proposta, il processo padre è lo scheduler dei processi figli.
Programma VIII.C
#include <sys/types.h>
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>
#define DIM_MSG (sizeof(unsigned int)) //Cardinalità del Messaggio
#define Urgent 0 //Tipi del Messaggio
#define Normal 1
#define Idle 2
#define End_of_Execute 3
#define Ready_To_Schedule_You (long)100000
typedef struct Messaggio;
#define N_PROC 5 //Numero di processi da schedulare
void main()
//----- GENERAZIONE DEI FIGLI DA SCHEDULARE -----
for(i=0; i<N_PROC; i++) else if (!pid)
} //End For N_PROC
//----- SCHEDULAZIONE DEI FIGLI -----
for (i=0; i<N_PROC; i++) //Almeno un processo ha richiesto
//la schedulazione
printf('Mando in esecuzione il processo con PID %d e priorità %dn', msg.PID, priority);
msg.tipo = msg.PID + Ready_To_Schedule_You;
msgsnd(ID_Msg, (const void*)&msg, DIM_MSG, 0); //Avvia l'esecuzione del processo
//appena schedulato
msgrcv(ID_Msg, (const void*)&msg, DIM_MSG, End_of_Execute, 0); //Rimane in attesa che tale
//processo schedulato gli comunichi
//la sua terminazione
}
//----- SINCRONIZZAZIONE DEL PADRE CON I FIGLI (ormai Zombie) -----
for(i=0; i<N_PROC; i++) pid=wait(&status); //I figli sono già terminati tutti e
//sono attualmente Zombie
//----- RILASCIO CODA DI MESSAGGI -----
msgctl(ID_Msg, IPC_RMID, 0);
Appunti su: |
|