Pagina 1 di 1

Inviato: 24 giugno 2010, 13:54
da wakitowaki
ciao a tutti.Ho un problema; non riesco a capire cosa faccia questo codice concorrente...

Codice: Seleziona tutto

#define TRUE 1
#define FALSE 0
#define N 2

int turn;
int interested[N];


void e_region (int process)
{
   int other;
   other=1-process;
   interested[process]=TRUE;
   turn=process;
   while((turn==process) && (interested[other]==TRUE))
   /* attesa */;
}


void l_region (int process)
{
   interested[process]=FALSE;
}
a me risulta che in tutti e due i processi aggiornano interested[process] che dovrebbe avere (se ho capito bene) solo 2 posizioni...in pratica e_region impone interested[process]=1 mentere l_region impone interested[process]=0...

ora mi chiedo (e spero che qualcuno più esperto possa aiutarmi..):

1)così scritti i due processi possono essere eseguiti in contemporanea o si crea una situazione d'attesa indefinita???

2)come tradurre questi processi in shell script??quali sono le variabili comuni (TRUE FALSE N ?!?!?)???quanti script devo creare per poter condividere le suddette variabili??come li linko uno all'altro (basta includere la riga
. script1 all'interno di script2.sh dopo #!/bin/sh ?!?!?)???


grazie in anticipo a tutti quelli che vorranno rispondermi

Inviato: 24 giugno 2010, 15:58
da Howl
wakitowaki ha scritto:1)così scritti i due processi possono essere eseguiti in contemporanea o si crea una situazione d'attesa indefinita???
Cosa intendi per così scritti? Perché di processi io non ne vedo, vedo solo il codice dell'algoritmo di Peterson, ma manca tutto il resto: quell'algoritmo deve essere utilizzato da due processi concorrenti, ma qui i processi concorrenti non esistono.
2)come tradurre questi processi in shell script??quali sono le variabili comuni (TRUE FALSE N ?!?!?)???quanti script devo creare per poter condividere le suddette variabili??come li linko uno all'altro (basta includere la riga
. script1 all'interno di script2.sh dopo #!/bin/sh ?!?!?)???
Credo tu non abbia capito la definizione di processo, tanto meno la differenza tra processo e programma.
E credo anche ti convenga ripassare un po' i costrutti di base del C. TRUE, FALSE e N NON sono variabili.
Ad ogni modo, le variabili che i due processi devono condividere sono l'array interested e turn.

Inviato: 24 giugno 2010, 17:44
da aleph
il codice che hai postato è solo dello pseudo-codice c-like, è estremamente incompleto (bisogna aggiungerci un sacco di roba per trasformarlo in un programma c compilabile . . ) . . se spieghi bene 1: a cosa ti serve e 2: cosa deve fare il codice forse qualche aiuto possiamo dartelo, però ad occhio prima devi studiarti bene la teoria di base (e in c processi concorrenti e memoria condivisa non sono semplicissimi . . . )

Inviato: 24 giugno 2010, 19:49
da wakitowaki
d'accordo vi spiego bene...sto preparando un esame di sistemi operativi...tuttavia le mie conoscenze di C si fondano sul corso di informatica 1 (per il quale ho dovuto realizzare un programma in c molto banale).Incredibile ma vero...nella facoltà di ingegneria informatica, per la laurea breve, non è previsto nemmeno un corso di programmazione.Comunque...in questo esame c'è una parte sulla programmazione concorrente linux che io sto cercando di studiare, lo pseudo-codice che vi ho postato è parte di un esercizio che adesso vi invio per intero

Si consideri il seguente codice concorrente:

Codice: Seleziona tutto

#define TRUE 1
#define FALSE 0
#define N 2

int turn;
int interested[N];


void e_region (int process)
{
int other;
other=1-process;
interested[process]=TRUE;
turn=process;
while((turn==process) && (interested[other]==TRUE))
/* attesa */;
}


void l_region (int process)
{
interested[process]=FALSE;
}
1)Quale problema risolve? Quanti sono i processi coinvolti?
2)Scrivere due script di BASH che risolvano esattamente lo stesso problema risolto dalle funzioni
e_region ed l_region come scritte all'esercizio 2, usando dei files per condividere le variabili.
3) Cosa si dovrebbe fare per implementare gli stessi script in modo che usino della memoria condivisa
POSIX (ovvero shm_mem)?


Questo è quello che mi viene richiesto....ora (su vostro consiglio :D ) sto andando a riguardare un pò di nozioni base di C (ormai impolverato..) e per bene le definizioni di processo, programma ecc...
Spero di essere stato più chiaro e mi scuso per il confuso post iniziale.Grazie comunque delle immediate risposte

EDIT by baghera
Includi il codice nel tag code per favore, grazie.


un ultima cosa...mi sarebbe molto utile se qualcuno mi indicasse un manuale di programmazione C in ambiente UNIX; possibilmente semplice, che parta dai concetti basilari ( magari scaricabile :D ).
Grazie

Inviato: 25 giugno 2010, 0:01
da aleph
wakitowaki ha scritto:mi sarebbe molto utile se qualcuno mi indicasse un manuale di programmazione C in ambiente UNIX; possibilmente semplice, che parta dai concetti basilari ( magari scaricabile :D ).
io mi sono trovato bene con google+man (dovresti avere già installati i man per tutte le funzioni e librerie principali, sono molto ben fatti, precisi e approfonditi . . )
wakitowaki ha scritto:1)Quale problema risolve? Quanti sono i processi coinvolti?
2)Scrivere due script di BASH che risolvano esattamente lo stesso problema risolto dalle funzioni
e_region ed l_region come scritte all'esercizio 2, usando dei files per condividere le variabili.
3) Cosa si dovrebbe fare per implementare gli stessi script in modo che usino della memoria condivisa
POSIX (ovvero shm_mem)
la prima risposta dovresti/dovrai averla studiata . . l'ultima dovrai studiare il funzionamento della shm (come detto, google+man dicono tutto, se hai pazienza di cercare e leggere) . . per la seconda non serve che implementi uno script completo, basta che traduci le funzioni, usando dei file come variabili condivise . . ti faccio un esempio

Codice: Seleziona tutto

#define TRUE 1
#define FALSE 0
#define N 2

int turn;
int interested[N];


void e_region (int process)
{
int other;
other=1-process;
interested[process]=TRUE;
portebbe diventare

Codice: Seleziona tutto

TRUE=1
FALSE=0
N=2

touch turn
eval touch interested{1..$N}


function e_region (){
 process="$1"
 other=$[1-process];
 echo $TRUE > interested${process}
il resto lo lasci a te ;)
wakitowaki ha scritto:Incredibile ma vero...nella facoltà di ingegneria informatica, per la laurea breve, non è previsto nemmeno un corso di programmazione.
neanche a informatica ce ne sono . . si presuppone che tu impari a programmare da solo :P (e invece di insegnarti un linguaggio su 1k che ci sono, ti insegnano gli algoritmi generici che servono per tutti ;) )

Inviato: 25 giugno 2010, 9:56
da Howl
wakitowaki ha scritto:tuttavia le mie conoscenze di C si fondano sul corso di informatica 1 (per il quale ho dovuto realizzare un programma in c molto banale).
Scusa, ma come fai a studiare un qualsiasi s.o. se non conosci un minimo di C? Qualsiasi s.o. utilizza a volontà aritmetica dei puntatori, puntatori a funzione, dichiarazioni di macro ecc. ecc.; leggerne il codice se non conosci queste cose diventa impossibile. A meno che "parliate" di s.o. come fanno i filosofi quando parlano di Goedel. (OT: ma è ancora in voga quest'assurdità di iniziare a programmare con il C?! da me, Statale di Milano, fortunatamente ciò non avviene).
wakitowaki ha scritto:un ultima cosa...mi sarebbe molto utile se qualcuno mi indicasse un manuale di programmazione C in ambiente UNIX; possibilmente semplice, che parta dai concetti basilari ( magari scaricabile :D ).
Guarda, io ti consiglio, prima di leggerti un manuale di C specifico sulla programmazione di sistema, di partire con le basi del linguaggio che a quanto pare non conosci. Ti consiglio vivamente "Il linguaggio C" di K&R, i creatori del linguaggio. È un librettino molto breve, saranno meno di 300 pagine, ma d'altronde il C è un linguaggio molto contenuto, molto KISS in stile "filosofia di UNIX" (ironicamente è poi IL linguaggio che permette la scrittura di programmi che sono tutt'altro che KISS, ma il linguaggio in sé lo è).
Magari puoi sopravvivere a quest'esame anche senza leggerlo, ma conoscere il C è un requisito fondamentale per un programmatore e la migliore introduzione che io abbia mai letto sul C è sicuramente questo libro (il capitolo migliore è quello sui puntatori, chiaro e semplice; gli esempi poi non sono i soliti cagosi, ma per es. mostra come costruire un rudimentale allocatore di memoria in maniera pulita e chiara).
aleph ha scritto:neanche a informatica ce ne sono . . si presuppone che tu impari a programmare da solo tongue (e invece di insegnarti un linguaggio su 1k che ci sono, ti insegnano gli algoritmi generici che servono per tutti wink )
in teoria si presuppone che t'insegnino anche le basi della programmazione, che sono comuni a tutti i linguaggi. Però il C è il C, non dovrebbero lasciare lo studio dell'aritmetica dei puntatori alla buona volontà dello studente.

Inviato: 25 giugno 2010, 16:57
da wakitowaki
momento forse mi sono espresso male....le conoscenze base del c le ho:puntatori dichiarazioni di variabili allocazione della memoria dichiarazione di array ecc....nel senso sò che #define TRUE 1 è una macro...sò scrivere un codice, magari non complesso, ma riesco a utilizzare i costrutti base quali cicli for while costrutto case funzioni ecc...non sono molto pratico e so di avere lacune ma la teoria che ho studiato la conosco (anche se dal mio post non sembra).Il fatto è che questa parte di programmazione concorrente richiede sicuramente conoscenze più avanzate da apprendere dedicando tempo solo a questo (leggere manuali e fare pratica porta vie molte ore!).Ora avessi io del tempo da dedicare alla programmazione lo farei volentieri, ma ho anche tanti altri esami da fare quindi, dover studiare un linguaggio in maniera approfondita per un esame sarebbe un conto, ma doverlo fare in maniera completamente autonoma per riuscire a svolgere correttamente un solo esercizio (su 5-6) di un compito è tutt'altra storia non credi??
Per questo sto cercando di interpretare al meglio le tipolgie di esercizi che ho a disposizione dai compiti passati almeno per farmi un idea e trovare un modo (più o meno intelligente) per risolverli.So benissimo (ed è quello che voglio) che finita la laurea dovrò studiare ancora per imparare bene a programmare...tutto qui

in ogni caso grazie per i consigli e le indicazioni