|
|
|
|
Strumenti |
22-04-2017, 19:39 | #1 |
Junior Member
Iscritto dal: Mar 2017
Messaggi: 19
|
Programmazione concorrente
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 |
23-04-2017, 16:38 | #2 |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
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...pji/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. |
24-04-2017, 17:16 | #3 |
Junior Member
Iscritto dal: Mar 2017
Messaggi: 19
|
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!!! |
24-04-2017, 17:26 | #4 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3305
|
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? |
24-04-2017, 19:43 | #5 | ||
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
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. Quote:
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. |
||
26-04-2017, 11:32 | #6 |
Junior Member
Iscritto dal: Mar 2017
Messaggi: 19
|
"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! |
26-04-2017, 12:19 | #7 |
Senior Member
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5726
|
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 )
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.
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti. |
26-04-2017, 13:30 | #8 | |||
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
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. Quote:
Quote:
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 |
|||
26-04-2017, 19:57 | #9 |
Senior Member
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5726
|
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.
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti. Ultima modifica di zanardi84 : 26-04-2017 alle 19:59. |
11-05-2017, 11:04 | #10 |
Junior Member
Iscritto dal: Mar 2017
Messaggi: 19
|
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 |
11-05-2017, 11:10 | #11 |
Junior Member
Iscritto dal: May 2017
Messaggi: 8
|
python tutta la vita
|
11-05-2017, 11:31 | #12 | ||
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
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. Quote:
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. |
||
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:58.