PDA

View Full Version : Programmazione concorrente


mic_1
22-04-2017, 18:39
Scusa l'intrusione ma non sono proprio a chi chiedere.

Sto preparando l'esame di Sistemi Operativi e non riesco a comprendere come applicare la teoria negli esercizi.

Ho delle soluzioni di compiti scritti in C, altri in python, quindi ho modo di testarli ma non capisco se basta studiare il codice e applicare il metodo di sincronizzazione del codice stesso o inserire i metodi spiegati a lezione come ad esempio l'algoritmo di peterson per il problema di deadlock, quello per la mutua esclusione, etc...

Inoltre, i filosofi a cena, l'algoritmo del banchiere, e altri sviluppati sia con i semafori che con i monitor, sono degli esempi di gestione processi e quindi esempi di possibili compiti o come utilizzarli nella pratica?

Inoltre per esercitarmi mi consigliate il C o il python più semplice da scrivere?

Come potete notare ho le idee un po confuse sul da farsi!
Grazie

pabloski
23-04-2017, 15:38
Ma il docente cosa dice? Python o C, dovrebbe essere lui a dire cosa vuole e come. In genere, trattandosi di sistemi operativi, molti vogliono un'interfaccia diretta con i meccanismi implementati da Unix e Posix, quindi fanno usare il C e relative librerie Unix.

Per quanto riguarda il passaggio dalla teoria alla pratica, anche qui dipende. Per esempio, devi fare un esercizio in cui usi i semafori per risolvere un problema di sincronizzazione, o implementare un semaforo? Sono due cose molto diverse. In genere fanno fare solo il primo tipo di esercizi.

I filosofi a cena sono un tipico esempio di problema di sincronizzazione da implementare tramite semafori o tramite monitor. Quello che si deve fare e' semplicemente simulare la cattura/rilascio delle due forchette, facendo vedere come si puo' fare senza che si creino race conditions e starvation. Come fatto qui ad esempio https://docs.oracle.com/cd/E19205-01/820-0619/gepji/index.html

Inutile dire che non serve a niente leggersi il codice e basta, bisogna capire cosa fa e come lo fa. Cioe' e' fondamentale imparare a ragionare in maniera concorrente, che e' l'obiettivo che si vuole ottenere.

mic_1
24-04-2017, 16:16
Ti dico subito che il mio "problema" non riguarda il progetto ma lo scritto.
Nel progetto il prof richiede il C ma nello scritto viene usato uno pseudocodice con svolgimento su carta. Per questo motivo mi era stato consigliato di esercitarmi in python, linguaggio semplice e ad oggetti che mi permette di esercitarmi e comprendere meglio gli esercizi di compito, perchè non so verificarne la correttezza altrimenti.

Inoltre, in questa parte d'esame legata alla concorrenza, ci sono così tante informazioni che mi confondono. Per questo chiedo un consulto a chi ne sa di più...

Qualche anno fa preparai un semplicissimo esercizio in java dove usai i monitor, nella gestione di una pizzeria inserii il piatto come monitor di sincronizzazione con l'utilizzo di synchronized, con l'uso di eccezioni, etc..

Premetto che usai java solo in quella occasione e non ricordo molto, python invece pare essere richiesto dal prof stesso anche nella prova pratica...

Sul gruppo vengono postate soluzioni in C e python...

In sostanza...devo svolgere lo scritto di concorrenza su carta e ho bisogno di esercitarmi... Va bene se uso il python? so essere un linguaggio ad oggetti...

Cosa mi consigliate di fare per capire la materia e affrontare lo scritto senza perdere altro tempo???? Per questo esame ne ho perso veramente tanto!!!!!!

Grazie a tutti!!!

tomminno
24-04-2017, 16:26
Ma come facciamo noi a consigliarti su come preparati ad un esame? Dovresti essere te quello che è andato a lezione a seguire il corso e capire come il professore lo ha impostato. Se a lezione ha fatto vedere Python allora forse chiederà Python, se ha mostrato C forse richiederà quest'ultimo, oppure li ha fatti entrambi e lascia libertà di scelta nella soluzione.
Generalmente il testo di esame dovrebbe richiede una implementazione in uno specifico linguaggio. Cosa richiedono i testi degli esercizi d'esame che hai trovato?

pabloski
24-04-2017, 18:43
In sostanza...devo svolgere lo scritto di concorrenza su carta e ho bisogno di esercitarmi... Va bene se uso il python? so essere un linguaggio ad oggetti...


Ni e per due motivi:

1. non e' chiaro se lo scritto e' una prova teorica o se bisogna implementare qualcosa di funzionante. Siccome parli di pseudo-codice, suppongo sia la prima. Nel qual caso la cosa da fare e' capire la logica della programmazione concorrente, magari scrivendo programmi concorrenti ( in C visto che mi pare sia quello che usate per il progetto ). A quel punto non dovrebbe essere un problema realizzare una soluzione in pseudo-codice, visto che si tratta di un codice molto astratto.

2. Python non e' un surrogato dello pseudo-codice e non e' nemmeno equivalente. Come scrivevo nel punto 1, lo pseudo-codice e' un modo per mettere giu' i concetti che hai acquisito teoricamente in una forma vagamente simile a quella di un linguaggio di programmazione.


Cosa mi consigliate di fare per capire la materia e affrontare lo scritto senza perdere altro tempo???? Per questo esame ne ho perso veramente tanto!!!!!!


Comprendo, ma come disse tempo fa un ingegnere Intel: "solo pochi geni comprendono davvero i meccanismi della concorrenza". Il problema e' che se ti approcci al problema con la tipica mentalita' da studente ( sgobbo, leggo, memorizzo e racconto la filastrocca all'esame ) non arriverai lontano.

La concorrenza va compresa, nel senso di riuscire ad immaginarsi N processi/thread che operano contemporaneamente e quali problemi possono nascere nel momento in cui vanno ad interagire ( operare sulle medesime risorse hardware e sulle stesse variabili ).

E capirai che questo esula da qualsiasi linguaggio di programmazione si vada poi a scegliere. Tuttavia e' fondamentale capire i meccanismi, altrimenti si e' condannati a scopiazzare da varie fonti. E ovviamente e' facile commettere errori, difficile adeguare le soluzioni preesistenti al problema che si sta affrontando.

Per cui concentrati sui meccanismi, carta e penna alla mano, esprimili nello pseudo-linguaggio che piu' ti risulta facile. Il resto viene dopo e la strada sara' in discesa.

mic_1
26-04-2017, 10:32
"carta e penna alla mano, esprimili nello pseudo-linguaggio"

Proprio questo mi rimane difficile da fare perchè non ho modo di verificare se ciò che scrivo è corretto...e faccio errori assurdi...

Forse mi converrà esercitarmi prima con un linguaggio di programmazione replicando/studiando esercizi già svolti per comprenderne la sincronizzazione e come tale sincro (che sia semafori, monitor, message passing e test&set) è stata implementata... altrimenti non ne esco fuori.

Il progetto credo di evitarlo per non perdere tempo. Il prof riazzera tutto finchè tutte le prove non sono state superate entro l'anno. Meglio mi concentri prima sullo scritto fondamentale per il superamento dell'esame (prova pratica capita e superata sempre in C quindi non sarà un problema ripeterlo ma il progetto lo trovo troppo impegnativo al momento. Un passo alla volta sebbene non voglia perderci troppo tempo).

Una cosa vorrei chiederti, giusto per fare chiarezza: I produttori/consumatori, i filosofi a cena, etc sono solo degli esempi di come i processi/thread possono interagire tra loro senza che vadano in deadlock o stavation, giusto? quindi nei compiti potrei trovarmi delle situazioni analoghe mi sembra di capire...sbaglio?

Grazie!

zanardi84
26-04-2017, 11:19
Secondo me tu hai bisogno di imparare ad usare le reti di petri che sono uno strumento grafico direi ideale per comprendere i processi concorrenti (da quelli informatici di scrittura dei valori delle variabili alla preparazione della pasta col sugo :D )

Guarda questi video del professor Ghezzi del polimi

https://youtu.be/yk629qqxaUQ

una volta imparato ad usarle (sono 2 o 3 regolette) puoi modellare qualsiasi processo tu abbia voglia e lo potrai simulare con carta e penna.

A quel punto, compreso come funziona il tuo sistema, lo puoi "tradurre" in codice o pseudocodice usando la grammatica del linguaggio.

pabloski
26-04-2017, 12:30
"carta e penna alla mano, esprimili nello pseudo-linguaggio"

Proprio questo mi rimane difficile da fare perchè non ho modo di verificare se ciò che scrivo è corretto...e faccio errori assurdi...

Il problema e' che l'implementazione in un linguaggio qualsiasi, introduce ulteriori dettagli che rischiano di confonderti ancora di piu'. In questo senso il consiglio di usare le reti di Petri e' da seguire.

Inoltre, dal punto di vista pratico, l'implementazione di riferimento dei meccanismi di concorrenza e' quella Posix, per cui e' escluso l'uso di linguaggi come Python. Quest'ultimo implementa ovviamente thread, semafori, lock, ecc... ma non nel modo canonico e standard su cui si basano i libri. Per cui ti resterebbe solo il C.



Forse mi converrà esercitarmi prima con un linguaggio di programmazione replicando/studiando esercizi già svolti per comprenderne la sincronizzazione e come tale sincro (che sia semafori, monitor, message passing e test&set) è stata implementata... altrimenti non ne esco fuori.

Si, se serve a farti capire la meccanica dei processi concorrenti.



Una cosa vorrei chiederti, giusto per fare chiarezza: I produttori/consumatori, i filosofi a cena, etc sono solo degli esempi di come i processi/thread possono interagire tra loro senza che vadano in deadlock o stavation, giusto? quindi nei compiti potrei trovarmi delle situazioni analoghe mi sembra di capire...sbaglio?
Grazie!

Sono esempi che colgono i problemi tipici che possono capitare. Alla fin fine negli esercizi ti ritrovi problemi che sono riconducibili in un modo o nell'altro ( e questo e' il dilemma, perche' spesso non e' un mapping 1:1 ) a uno o piu' di quegli esempi tipici.

E ci sono anche sottigliezze che tipicamente nella teoria e' difficile notare. Immagina questo esempio:

hai un programma con N thread che operano su un array di 10*N elementi, con l'array diviso in N blocchi di 10 elementi e ogni thread opera su uno di questi blocchi

ragionando teoricamente potresti concludere che i thread operano sul medesimo array ( medesimo oggetto ) e che quindi possono crearsi contese tra di essi

in realta' non succede, perche' l'array in C e' un blocco di memoria contigua e gli N thread di sopra operano su sezioni separate ( blocchi di memoria diversi e per nulla sovrapposti ) dell'array

nella pratica non c'e' bisogno di implementare meccanismi di sincronizzazione in questo caso

il problema e' che bisogna sapere come C implementa gli array a basso livello, perche' il caso descritto puo' non presentare le stesse caratteristiche in altri linguaggi tipo Java, Python, ecc...

per cui c'e' pure un certo scollamento tra la teoria e la pratica

zanardi84
26-04-2017, 18:57
Cambieranno le situazioni, i domini in cui il software sarà inserito, ma per affrontare determinati problemi scoprirai che ci sono soluzioni ricorrenti.. cioè quellle che sono conosciute come pattern.

mic_1
11-05-2017, 10:04
Grazie per gli interventi. Quello che ho ben capito è che non occorre ricorrere ad un codice ad oggetti come il C++ ma che in realtà i linguaggio utilizzato in primis per la creazione di un sistema operativo è proprio il C, ma per non incappare in problemi più seri proverò a cercare dei programmini semplici, intanto per esercitarmi, in C o in python, che utilizzino metodi di sincronizzazione per poi affrontare problemi più importanti come quelli del compito e in seguito del progetto.

Cosa ne pensate? Grazie

MarikaW
11-05-2017, 10:10
python tutta la vita

pabloski
11-05-2017, 10:31
Grazie per gli interventi. Quello che ho ben capito è che non occorre ricorrere ad un codice ad oggetti come il C++ ma che in realtà i linguaggio utilizzato in primis per la creazione di un sistema operativo è proprio il C


Ma infatti la concorrenza non ha nulla a che vedere col linguaggio utilizzato. Per concorrenza si intende semplicemente la capacita', da parte del sistema di elaborazione, di eseguire alternativamente pezzi di vari processi, in modo che sembri che li stia eseguendo tutti contemporaneamente.

Questo meccanismo era quasi impossibile da implementare ai tempi del real mode x86, per cui intel penso' di aggiungere il meccanismo della protezione di memoria ( spazi d'indirizzamento virtuali ). In questo modo hai la garanzia che i processi non si pestino i piedi a vicenda, resta solo da implementare un meccanismo efficiente di cambio del contesto di esecuzione ( i registri generali, piu' l'instruction pointer e altri registri speciali devono essere caricati/scaricati con i dati del processo da mandare in esecuzione, che formano appunto il contesto del processo ). Per i thread vale una logica simile, ma non ci sono di mezzo gli spazi d'indirizzamento.

Per cui e' piu' che altro una faccenda hardware, che esula dal linguaggio.

I linguaggi hanno un impatto sulla qualita' del modello di programmazione, cioe' quanto organizzato e semplici e' il modello che mostrano al programmatore. Certo i sistemi opeativi si possono scrivere ( e in buona parte si scrivono ) in C, poi pero' cresce la complessita', cresce il numero di bug, ecc...

E' su queste questioni che il linguaggio comincia a contare.


intanto per esercitarmi, in C o in python, che utilizzino metodi di sincronizzazione per poi affrontare problemi più importanti come quelli del compito e in seguito del progetto.

Cosa ne pensate? Grazie

Aldila' del linguaggio, devi usare i meccanismi di sincronizzazione esposti dalla teoria. Tanto per dire, Python implementa un meccanismo che si chiama Event. Nei libri di teoria questa cosa non esiste. E Python non implementa invece il costruttore Monitor, che invece nella teoria esiste.

E ovviamente dipende tutto pure dal livello a cui stai operando, cioe' se vuoi semplicemente usare quei meccanismi o se li vuoi implementare. In teoria si studia sia come usarli, sia come implementarli.

Per questo in generale si preferisce usare il C su un sistema operativo Unix-like ( Linux ad esempio ) per le esercitazioni. Perche' Unix ricalca passo-passo quello che viene mostrato nella teoria.

Per esempio esistono sistemi operativi, librerie e linguaggi che implementano il modello CSP per la concorrenza. Un'implementazione di questo modello ( non proprio canonica, ma passabile ) la puoi vedere nel linguaggio Go https://gobyexample.com/channels

Ci crederesti se ti dicessi che in quel codice ci sono due entita' concorrenti in azione? Eppure di quella cosa li' non c'e' traccia nei libri di testo, almeno quelli scolastici.