Subversion Repositories shark

Rev

Blame | Last modification | View Log | RSS feed

#LyX 1.3 created this file. For more info see http://www.lyx.org/
\lyxformat 221
\textclass article
\language english
\inputencoding auto
\fontscheme default
\graphics default
\paperfontsize default
\papersize Default
\paperpackage a4
\use_geometry 0
\use_amsmath 0
\use_natbib 0
\use_numerical_citations 0
\paperorientation portrait
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\defskip medskip
\quotes_language english
\quotes_times 2
\papercolumns 1
\papersides 1
\paperpagestyle default

\layout Title

ATTENTI AL LUPO !!!
\layout Description

Progetto per il corso di Sistemi Operativi Real Time a.a.
 2003-2004
\layout Description

Gruppo 1: Laura Azzolini, Alessandro Foglini, Alessandro Pellegrini
\layout Paragraph

INTRODUZIONE
\layout Standard

Il progetto da noi sviluppato prevede l'implementazione di più task che
 lavorano in maniera concorrente in ambiente S.Ha.R.K..
\layout Standard

L'idea nasce dall'esempio fornito dal programma fly, che crea ad ogni pressione
 di un tasto delle 
\begin_inset Quotes eld
\end_inset 

mosche
\begin_inset Quotes erd
\end_inset 

 che fluttuano casualmente all'interno di una scatola bidimensionale, senza
 però interagire fra loro.
 Il nostro progetto era orientato a dare un certo comportamento a tali mosche,
 in particolare potevamo scegliere o di creare un mondo virtuale del tutto
 automatico o permettere all'utente di interagire direttamente con i processi
 in esecuzione in maniera tale da modificare il loro comportamento.
 Secondo noi non era trascurabile l'interazione con l'utente, in particolare,
 in questa maniera ci sembrava di poter meglio comprendere l'ambiente Real
 Time.
 Da quì nasce l'idea di avere un task che funge da inseguitore di oggetti
 che si muovono casualmente (come le mosche) e di un ulteriore task comandato
 dall'utente che influenzi il movimento dell'inseguitore.
 Ecco come hanno preso vita il 
\begin_inset Quotes eld
\end_inset 

Lupo
\begin_inset Quotes erd
\end_inset 

, la 
\begin_inset Quotes eld
\end_inset 

Pecora
\begin_inset Quotes erd
\end_inset 

 ed il 
\begin_inset Quotes eld
\end_inset 

Cacciatore
\begin_inset Quotes erd
\end_inset 

.
\layout Paragraph

ARCHITETTURA
\layout Standard

La parte Real Time dell'architettura, prevede la condivisione di più strutture
 dati per il controllo della posizione dei task in esecuzione, oltre alla
 condivisione della grafica.
 In particolare usiamo dei semafori per governare l'accesso alle strutture
 condivise.
 I dati condivisi sono stati realizzati con vettori di stutture, così che
 ogni pecora , ogni lupo ed il cacciatore possiedono posizioni cartesiane,
 un flag che segna se é stato ucciso o no ed un semaforo privato.
 Abbiamo limitato l'utilizzo della mutua esclusione solo alla singola struttura
 del vettore stesso, così da non bloccare le altre strutture nelle fasi
 di lettura/scrittura.
 Con l'utilizzo di tali vettori è stato possibile gestire la lettura/scrittura
 dei dati propri di ogni task e l'accesso alle strutture dati.
\layout Subparagraph

Pecora
\layout Standard

La pecora è un task che nasce premendo il tasto 
\begin_inset Quotes eld
\end_inset 

p
\begin_inset Quotes erd
\end_inset 

 da tastiera e si muove nello schermo in maniera casuale rimanendo però
 all'interno di un perimetro prestabilito.
\layout Standard

Alla creazione, ad ogni task pecora viene assegnata la prima posizione libera
 nel vettore di strutture, alla quale accede in mutua esclusione con gli
 altri task pecora presenti e con i task lupo.
 E' possibile creare pecore fino a che il vettore non si riempie (max quattro
 pecore).
 Nella struttura che gli è stata assegnata, il task aggiorna le proprie
 coordinate ad ogni spostamento.
 L'interazione con gli altri task viene realizzata tramite il flag di vita
 o morte; in particolare quando un lupo ha raggiunto la pecora, attiva il
 flag e la pecora, notando l'attivazione muore.
 
\layout Subparagraph

Lupo
\layout Standard

Il lupo è un task che nasce premendo il tasto 
\begin_inset Quotes eld
\end_inset 

l
\begin_inset Quotes erd
\end_inset 

 da tastiera e si muove nello schermo, all'interno del perimetro prestabilito,
 scappando dal task cacciatore o inseguendo il task pecora più vicino.
 Se non sono presenti né il cacciatore né le pecore, il lupo rimane nella
 sua tana.
\layout Standard

Alla creazione, ad ogni task lupo viene assegnata la prima posizione libera
 nel vettore di strutture, alla quale accede in mutua esclusione con gli
 altri task lupo presenti e con il task cacciatore.
 A seconda della posizione assunta nel vettore, il lupo si muoverà a velocità
 crescente.
 E' possibile creare lupi fino a che il vettore non si riempie (max tre
 lupi).
 Nella struttura che gli è stata assegnata, il task aggiorna le proprie
 coordinate ad ogni spostamento.
 L'interazione con gli altri task viene realizzata tramite il controllo
 delle posizioni e il relativo calcolo della distanza dal cacciatore e dalle
 pecore, leggendo nelle rispettive strutture dati.
 Abbiamo dato priorità alla fuga dal cacciatore se la distanza tra esso
 e il lupo è minore di un certo valore.
 Se questa condizione non si verifica, il lupo insegue la pecora più vicina.
 Quando il lupo raggiunge la pecora, attiva il relativo flag di vita/morte.
 Se il cacciatore raggiunge il lupo, gli attiva il flag di vita o morte
 e il lupo, notando l'attivazione, muore.
 
\layout Subparagraph

Cacciatore
\layout Standard

Il cacciatore è un unico task che nasce premendo il tasto 
\begin_inset Quotes eld
\end_inset 

c
\begin_inset Quotes erd
\end_inset 

 da tastiera e si muove nello schermo, all'interno del perimetro prestabilito,
 controllato dall'utente tramite il mouse.
 Lo scopo del cacciatore è quello di raggiungere i lupi ed ucciderli prima
 che questi ammazzino tutte le pecore.
\layout Standard

Quando il cacciatore raggiunge il lupo, attiva il relativo flag di vita/morte.
 
\layout Subparagraph

Main
\layout Standard

All'interno del main abbiamo inserito le inizializzazioni del mouse per
 il task cacciatore, del semaforo di mutua esclusione per l'accesso a video,
 delle strutture contenute nei vettori (semafori privati e posizione) e
 della grafica (creazione del perimetro per il movimento dei task e visualizzazi
one delle istruzioni).
 Abbiamo definito il modello di task da utilizzare e premendo i tasti corrispond
enti a pecora, lupo e cacciatore, abbiamo creato i vari task.
 Premendo invece il tasto 
\begin_inset Quotes eld
\end_inset 

Esc
\begin_inset Quotes erd
\end_inset 

 si esce dal programma.
 
\layout Subparagraph

Altre funzioni
\layout Itemize

Draw_obj: funzione chiamata dai singoli task per disegnare i lupi e le pecore
 accedendo a video in mutua esclusione .
\layout Itemize

my_mouse_handler: funzione richiamata dal task cacciatore per gestire lo
 spostamento del cursore del mouse a video e per l'aggiornamento della posizione
 del cacciatore.
\layout Itemize

bye_bye: funzione che termina il programma chiudendo la libreria grafica
 e quella del mouse.
 Stampa inoltre a video la scritta 
\begin_inset Quotes eld
\end_inset 

Bye bye!
\begin_inset Quotes erd
\end_inset 

.
 
\layout Paragraph

CONCLUSIONI
\layout Standard

Dopo aver verificato la corettezza ed il funzionamento del programma abbiamo
 provato a cambiare i parametri del periodo e del wcet di ogni task.
 In particolare abbiamo notato che diminuendo il wcet sotto il valore di
 30 us, quando tutti i task erano stati creati, il programma terminava con
 un errore di wcet-violation.
 Per avere un buon margine di sicurezza sulle possibili configurazioni,
 abbiamo scelto un valore di wcet pari a 100 us.
 Per quanto riguarda il periodo lo abbiamo impostato a 40000 us perchè diminuend
olo i task si muovevano troppo velocemente per avere un programma giocabile.
 Sotto i 1000 us anche la visibilità dei vari task era ridotta al minimo.
\layout Standard

E' possibile creare un numero di task (pecore + lupi + cacciatore) anche
 più alto di quello massimo impostato nel programma, a condizione che la
 somma di tutti i wcet sia minore del periodo specificato, con un certo
 margine.
\the_end