Calcul Paralel Realizarea Unei Aplicații de Tip Chat In Java

Cuprins

1. Cuvânt înainte ……………………………………………………………………………..5

2. Introducere …………………………………………………………………………………..5

2.1. Ce este calculul paralel ?…………………………………………………….5

2.2. Ce este calculatorul paralel ?……………………………………………….5

2.3. Ce este un sistem distribuit ?………………………………………………..5

2.4. Scopul………………………………………………………………6

2.5. Scurt Istoric…..…………………………………………………….6

2.5.1. Contextul aparitiei calculului paralel………………………..6

2.5.2. Primele concepte paralele……………………………………..7

2.5.3. Motivația si factorii favorabili……………………………….8

3. Sistemul Multiprocesor………………………………………………..8

4. Clusterul de calculatoare………………………………………………………….

5. Programarea paralelă……………………………………………………………

6. Comunicarea si sincronizarea………………………………………………..

6.1. Comunicarea…………………………………………………………………

6.2. Sincronizarea…………………………………………………………………..

7. Timpul de calculul …………………………………………………………………..

8. Sisteme de calcul paralel. Clasificare…………………………………………

9. Analogie cu viata cotidiană…………………………………………..

9.1. Lucrul în echipă și dezvoltarea speciei umane……………………….

9.2. Analogia cu creierul uman………………………………………………….

10. Limbajul Java……………………………………………………………………….

11. Firele de execuție Java (Java Threads)……………………………………..

12. NetBeans IDE…………………………………………………………

13. Aplicație de tip Chat…………………………………………………

13.1. Limbajul și mediul de programare folosit……………………

13.2. Proiectarea aplicației…………………………………………..

13.3. Utilizarea aplicației…………………………………………….

13.4. Realizarea aplicației……………………………………………

Cuvânt înainte

“It would appear that we have reached the limits

of what it is possible to achieve with computer technology,

although one should be careful with such statements,

as they tend to sound pretty silly in 5 years.”

(John von Neumann, 1949)

În domeniul IT se constată o dezvoltare fără precedent. Acest domeniu de activitate este într-o continuă schimbare și mai ales într-o continuă evoluție.

Încă de pe timpul matematicianului de origine ungară John von Neumann  (n. 28 decembrie 1903 – d. 8 februarie, 1957) oamenii au realizat faptul că știința este domeniul care evoluează foarte rapid si că asigurarea echipamentelor tehnologice necesare reprezintă punctul vital de care depinde progresul în acest domeniu de activitate.

Această lucrare evidețiază importanța progresului domeniului IT, atât din punct de

vedere hardware cât și din punct de vedere software, fapt ce a dus atât spre evoluția domeniului la nivel teoretic cât și la ușurarea sarcinilor din viața de zi cu zi.

Partea practică a lucrării este reprezentată de crearea unei aplicații de tip Chat. Această aplicație este realizată prin folosirea firelor de execuție în limbajul de programare JAVA (JAVA Threads).

Aplicația abordează una dintre activitățile fundamentale: comunicarea.

2.Introducere

2.1. Ce este calculul paralel ?

Calculul paralel reprezintă metoda de execuție simultană a unor instrucțiuni, similare sau și diferite, pe două sau mai multe procesoare, cu scopul unei rezolvări mai rapide a unei probleme.

Principiul pe care se bazează calculul paralel este acela că orice problemă, indiferent cât de complexă, poate fi subdivizată sau împărțită in mai multe probleme mai simple, de o natură identică sau similară ce pot fi rezolvate simultan. Astfel rezultatul final, cel al problemei inițiale, de dinaintea descompunerii, este realizat prin compunerea rezultatelor tuturor rezultatelor problemelor parțiale.

2.2. Ce este calculatorul paralel ?

Calculatorul paralel reprezintă o colecție de procesoare, în principiu de același tip, interconectate printr-o magistrală de date ce permit coordonarea activităților acestora și în acelasi timp comunicarea si schimbul de date.

Procesoarele ce formează un astfel de calculator paralel se află la distanțe mici unele de altele deoarece se presupune că astfel pot colabora eficient pentru rezolvarea unei anumite probleme.

2.3. Ce este un sistem distribuit ?

Dacă pentru realizarea calculatorului paralel este nevoie de procesoare de acelasi tip, un sistem distribuit utilizează de obicei de o multime de procesoare de tip diferit.

Aceste procesoare sunt distribuite pe o aria geografica mare, sistemul distribuit fiind conceput cu scopul utilizarii de resurse disponibile, si bazându-se pe colectarea si transmiterea de informatii printr-o retea.

2.4. Scopul

Procesarea paralela este folosită pentru a scurta timpul de rezolvare a unei probleme..

Prin utilizarea concurenta a mai multor procesoare procesul de execuție al unei instrucțiuni sau a unor seturi de instrucțiuni este considerabil mai rapid.

Principalul scop al aplicării modelului paralel in domeniul informaticii este acela de a îmbunătăți performantele sistemului de calcul. Acest lucru se realizează prin distribuirea sarcinilor de execuție către două sau mai multe procesoare.

Creșterea performanțelor este vizibilă mai ales in rezolvarea unor probleme extrem de complexe.

2.5. Scurt Istoric

2.5.1. Contextul aparitiei calculului paralel

Calculul paralele a apărut ca o reacție la dezvoltarea altor domenii ale științei care au început să depindă intr-o foarte mare masură de domeniul informatic.

Din punct de vedere istoric, la inceput, calculatoarele au fost cunoscute pe baza modelului secvențial. Acest model secvențial presupune rezolvarea unei anumite probleme printr-un algoritm care descrie ordinea in care se vor executa instrucțiunile până a ajunge la rezultatul final.

Structura sistemului de calcul elaborată de John von Neumann este stabilită astfel încat operațiile logice sau aritmetice să fie executate in unitatea centrală, in blocul aritmetico-logic. Astfel, programul care are ca scop soluționarea problemei va interpreta modul de rezolvare a problemei, ca o succesiune de instructiuni care urmeaza un anumit algoritm. Acest program este memorat de catre calculator, iar instrucțiunile sunt aduse pe rând in unitatea de comandă, de aici realizându-se treptat transformarea datelor de intrare într-un rezultat final.

Incepând cu perioada anilor ‘60-’70 oamenii au încercat să crească performanțele calculatorului, în principal viteza de calcul, care reprezenta punctul vital în demersul evoluției tehnologice, prin diferite metode.

Astfel de metode se referă la partajarea timpului în cadrul sistemului de calcul, prin accesul direct la memorie sau prin introducerea unor cereri de intrerupere din partea dispozitivelor de intrare sau de ieșire.

2.5.2. Primele concepte paralele

Au apărut mai apoi așa numitele sisteme specializate de prelucrare numerică a imaginilor, care au încercat să compenseze viteza insuficientă de procesare de la acel timp printr-o procesare paralelă. Astfel se alocă pentru fiacare pixel dintr-o linie a unei imagini câte o unitate de calcul. Asupra fiecarui pixel se pot aplica simultan aceleași transformări, astfel încat se puteau folosi procesoare identice care nici nu trebuiau să comunice între ele.

Acest model de calcul se numește “Single Instruction Multiple Data”.

Odată cu acest model au apărut primele configurații de procesare, calcul paralel și totodată primii algoritmi de calcul paralel.

Odată cu elaborarea conceptului de paralelism au apărut și primele dificultăți în realizarea acestor tipuri de sisteme paralele. Una dintre piedicile de la acea vreame a reprezentat-o interdependența dintre arhitectura disponibilă și programul de calcul.

Însă cu toate problemele apărute, paralelismul a constituit un modalitate majoră de creștere a performantelor sistemelor de calcul. Astfel a fost posibilă dezvoltarea sistemelor moderne de calcul.

Începând cu anii ’90 s-a reușit un progres în dezvoltarea microprocesoarelor prin creștearea vitezei lor interne. Acest lucru a crescut într-o anumită măsură interesul față de modelul paralel dezvoltat anterior. Portabilitatea devenise un punct de referintă, astfel oameiii au început sa caute soluții pentru crearea unor sisteme de operare care să folosească într-un mod cat mai eficient resursele hardware.

Pe de altă parte, au fost dezvoltate si noi versiuni de supercalculatoare, cele mai promovate fiind: serverul multiprocesor si “clusterul” de calculatoare care prin cuminicare reușeau sa rezolve părți dintr-o problem dificilă.

2.5.3. Motivația si factorii favorabili

La fel ca orice idee sau concept nou apărut într-un anumit domeniu, calculul paralel a suportat o serie de testari, cu scopul gasirii unor motive evidente care să duca la aplicarea acestui sistem la scară largă.

Principalele 3 motive care au favorizat utilizarea procesorului paralel au fost:

atingerea performanțelor cerute cu privire la timpul de execuție a programelor

reprezenta o mai bună arhitectură disponibilă la acel moment

dificultatea problemelor ce trebuiau rezolvate impunea culcul paralel

Aceste motive, au apărut mai apoi și introducerea procesării paralele pe scară largă. Principalii factori ce au favorizat acest pas au fost:

avansul dezvoltării circuitelor integrate în așa măsură încât pe un singur cip pot fi integrate milioane de tranzistoare

limitele fizice atinse de circuitele integrate, care au facut imposibile alte îmbunătățiri

3. Sistemul Multiprocesor

Fig.1 sistem multiprocesor (SMP)

Rolul unui procesor este acela de a încorpora funcțiile unitătii centrale de prelucrare a informației ale unui calculator sau sistem funcțional. Procesorul, în forma sa fizică, este un circuit electronic integrat sau cip electronic, având rolul de a controla activitățile sistemului in care este integrat si prelucrează datele furnizate. Este elementul principal al sistemului de calcul.

SMP sau Sistemul multiprocesor (fig.1) reprezintă rezolvare pentru situațiile în care este necesar un timp rapid de raspuns cât și un mare necesar de putere de calcul.

Funcția de bază a conceptului SMP o reprezintă comunicarea care se realizează prin mesaje, cât și sincronizarea execuției programului.

Sistemul multiprocesor poate avea două structuri de bază. Acestea fiind:

structura multiprocesor cu module funcționale distribuite

structura multiprocesor cu module funcționale concentrate.

4.Clusterul de calculatoare

Fig.2 Cluster de calculatoare

Un cluster sau un grup de calculatoare (Fig.2) constă intr-un set de calculatoare conectate, care cooperează, astfel încât, în multe privințe, ele pot fi privite ca un singur sistem.

Spre deosebire de rețeaua de calculatoare, clusterul de calculatoare are fiecare nod setat pentru a efectua câte o sarcină, controlată și programată de software.tivația si factorii favorabili

La fel ca orice idee sau concept nou apărut într-un anumit domeniu, calculul paralel a suportat o serie de testari, cu scopul gasirii unor motive evidente care să duca la aplicarea acestui sistem la scară largă.

Principalele 3 motive care au favorizat utilizarea procesorului paralel au fost:

atingerea performanțelor cerute cu privire la timpul de execuție a programelor

reprezenta o mai bună arhitectură disponibilă la acel moment

dificultatea problemelor ce trebuiau rezolvate impunea culcul paralel

Aceste motive, au apărut mai apoi și introducerea procesării paralele pe scară largă. Principalii factori ce au favorizat acest pas au fost:

avansul dezvoltării circuitelor integrate în așa măsură încât pe un singur cip pot fi integrate milioane de tranzistoare

limitele fizice atinse de circuitele integrate, care au facut imposibile alte îmbunătățiri

3. Sistemul Multiprocesor

Fig.1 sistem multiprocesor (SMP)

Rolul unui procesor este acela de a încorpora funcțiile unitătii centrale de prelucrare a informației ale unui calculator sau sistem funcțional. Procesorul, în forma sa fizică, este un circuit electronic integrat sau cip electronic, având rolul de a controla activitățile sistemului in care este integrat si prelucrează datele furnizate. Este elementul principal al sistemului de calcul.

SMP sau Sistemul multiprocesor (fig.1) reprezintă rezolvare pentru situațiile în care este necesar un timp rapid de raspuns cât și un mare necesar de putere de calcul.

Funcția de bază a conceptului SMP o reprezintă comunicarea care se realizează prin mesaje, cât și sincronizarea execuției programului.

Sistemul multiprocesor poate avea două structuri de bază. Acestea fiind:

structura multiprocesor cu module funcționale distribuite

structura multiprocesor cu module funcționale concentrate.

4.Clusterul de calculatoare

Fig.2 Cluster de calculatoare

Un cluster sau un grup de calculatoare (Fig.2) constă intr-un set de calculatoare conectate, care cooperează, astfel încât, în multe privințe, ele pot fi privite ca un singur sistem.

Spre deosebire de rețeaua de calculatoare, clusterul de calculatoare are fiecare nod setat pentru a efectua câte o sarcină, controlată și programată de software. Componentele unui cluster de calculatoare sunt de obicei conectate prin intermediul rețelelor locale (LAN), fiecare nod este un calculator folosit ca server care rulează propriul său exemplu de un sistem de operare.

Clusterele de calculatoare sunt de obicei utilizate pentru a îmbunătăți performanța și disponibilitatea pe care o poate oferi un singur calculator. Totodata, acest concept reprezintă o soluție mult mai rentabilă decât calculatoarele unice de mare viteză, care prin comparație sunt foarte costisitoare.

5. Programarea paralelă

Programarea paralelă reprezintă metoda de programare a două calculatoare sau a unei colecții de calculatoare în vederea executării in mod eficient a unei singure aplicații.

Eficiența modului de execuție în paralel o reprezită atigerea unei viteze mari de execuție. Viteza de execuție va fi invers proporțională cu numarul de procesoare.

Prin programarea paralela se caută căi de divizare a aplicației în procese ce pot fi executate în mod concurent pe mai multe procesoare.

Fața de un algoritm secvential care urmează un anumit set de instrucțiuni pentru rezolvarea unei probleme, un algoritm paralel conține doi sau mai mulți algoritmi secvențiali care pot fi executați în mod concurent. Așadar, procesul va reprezenta o colectie de instrucțiuni secvențiale care utilizează date de intrare, locale sau globale, și este executat în paralel cu alte unități de program.

Procesul reprezintă execuția unui set de intrucțiuni în mod secvențial. Deci un proces reprezintă activitatea rezultată în urma execuției unui program de către procesor.

Divizarea în procese a unei aplicatii presupune:

– specificarea problemei;

– identificarea unităților fundamentale și interacțiunile dintre acestea;

– transpunerea unităților în procese cu interacțiunile specificate prin primitive de comunicare.

Programul concurent

Un program este concurent dacă descrie mai multe procese care urmează a fi executate în mod concurent pe un sistem de calcul. Mai multe procese se execută în mod concurent atunci cand executarea lor se suprapune în timp.

Două procese sunt concurente dacă prima instrucțiune a unui proces este lansată înainte de încheierea ultimei instrucțiuni a celuilalt proces.

Un program paralel poate fi executat pe procesoare grupate într-o unitate, de tip mutiprocesor sau calculator paralel, sau pe procesoare separate în mașini autonome inteconectate într-o rețea.

Limbajul

Pentru realizarea programării paralele este nevoie de un limbaj de calcul și de un limbaj de coordonare.

Cheia care permite utilizatorului să unifice într-un singur program mai multe activități separate, o reprezintă limbajul de coordonare. Coordonarea permite paralelismul deorece aceasta asigură atât sincronizarea procesoarelor cât și comuicarea între acestea.

Tipuri de paralelism

Paralelismul este de două tipuri: paralelism logic si paralelism fizic.

1. Paralelismul logic apare atunci când un singur procesor este atribuit alternativ mai multor procese. Deoarece se execută în mod alternativ acțiuni corespunzătoare diferitelor procese, acestea se vor desfășura in mod concurent. Astfel se vor citi instrucțiunile unui proces înainte de a se fi terminat execuția în totalitate a instrucțiunilor corespunzătoare celorlalte procese. Aceste procese sunt multiprogramate pe un sistem monoprocesor.

2. Paralelismul fizic reprezintă modul în care fiecărui proces îi este atribuit în exclusivitate câte un procesor separat. În cazul acesta se desfășoară instrucțiuni corespunzătoare mai multor procese într-un anumit moment.

În funcție de sistemul paralel utilizat, sistemul de calcul pe care se executa programul respectiv va purta urmatoarele demuri:

a) În cazul în care procesoarele sunt legate la o memorie comună cu ajutorul căreia se poate realiza schimbul de informație între ele, sistemul se va numi sistem multiprocesor. În acest caz procesele sunt multiprocesate.

b) În cazul în care se utilizează un sistem distribuit, format din unul sau mai multe procesoare cu memorii proprii și care comunica între ele prin canale de comunicație, sistemul va fi numit rețea.

6. Comunicarea si sincronizarea

Programele care sunt executate cu ajutorul unui sistem de calcul paralel cu multiprogramare sunt procese paralele independente.

De cele mai multe ori însă, natura problemei ce urmează a fi rezolvată impune interacțiunea între procesele unui program concurent din următoarele motive:

– Utilizarea în mod comun de către procese a resurselor puse la dispoziție, de exemplu: memoria comună, echipamente periferice sau zone tampon.

– Cooperarea proceselor în vederea schimbului de informații necesare realizării procesului: unul dintre cazurile intâlnite este atunci cand un proces folosește anumite date rezultate din activitatea altui proces.

Interacțiunea dintre procese este realizată prin două moduri: prin „comunicare” sau prin „sincronizare”.

6.1. Comunicarea

Interacțiunea proceselor prin comunicare reprezintă modalitatea prin care două sau mai multe procese disticte schimbă informatii.

6.2. Sincronizarea

Sincronizarea reprezintă modul de interacțiune dintre două sau mai multe procese distincte astfel încât procesele să aștepte informațiile de care au nevoie și care nu sunt produse încă prin finalizarea altor procese.

Primitivele de sincronizare reprezintă operații pe care nucleul sistemului de programare le pune la dispoziția programatorului în vederea rezolvării problemelor de sincronizare.

Sunt cunoscute trei forme de sincronizare ce pot fi acceptate. Acestea sunt:

a) Excluderea mutuală:

Prin această metodă se evită utilizarea simultană de către mai multe procese a unei resurse critice. O resursă critică este acea resursă care poate fi utilizată de catre un singur proces la un moment dat.

b) Sincronizarea pe condiție:

Această metodă are ca scop amânarea execuției unui proces până în momentul în care o anumită condiție devine adevărată.

c) Arbitrarea:

Arbitrarea reprezintă evitarea accesului simultan a mai multor procesoare la aceeași zonă de memorie. În cazul acesta se va realiza realiza o secvențializare a accesului. Aceasta secvențializare se va realiza impunând așteptarea până când procesul care a obținut acces iși încheie activitatea asupra zonei de memorie.

Sincronizarea în sistemele paralele cu memorie comună

Procesele dintr-un sistem paralel cu memorie comună vor avea acces la variabile comune cu scopul de a le putea citi și scrie. În cazul sistemelor paralele cu memorie comună, sincronizarea este necesară pentru prevenirea rescrierii neintenționate a unei date de către unul dintre procese înainte ca alt proces să finalizeze citirea informației.

În cazul programului paralel asincron, procesele continuă corespunzător informației pe care variabilele globale o conțin la momentul respectiv, neașteptând astfel introducerea datelor. În sistemul MIMD (multiple data, multiple instructions) fiecare procesor în partea va putea opera sub controlul unui ceas separat. În momentul în care este necesară accesarea unei date de către un procesor, utilizatorului îi revine responsabilitatea că valoarea datei este cea corectă.

. Semafoarele

Semaforul reprezintă o variabilă întreagă care poate lua doar valori pozitive.

În mecanismele de sincronizare semafoarele sunt elemente des intâlnite.

Semaforul este un tip de dată ce folosește doar două operații: incrementarea și decrementarea.

Asupra unui semafor sunt admise operații de următorul tip:

1. P1(s): procesul așteaptă până când s > 0, apoi decrementează s cu 1;

2. P2(s): incrementează s cu 1

Operația P1 are rolul de a bloca, in anumite condiții, efectuarea unui proces, iar operația P2 are rolul de a relansa un proces anterior ce a fost blocat. Semaforului îi este asociat un șir de așteptare. Modul de realizare al acestui demers este următorul: procesul care a fost blocat prin operația P1 se introduce în șirul de așteptare unde asteaptă până la relansarea lui prin operația P2. În cazul în care mai multe procese vor intenționa să execute simultan operațiile P1 sau P2 asupra aceluiași semafor, ele vor fi satisfăcute pe rând, într-o ordine arbitrară.

Aceste tipuri de operații sunt indivizibile.

Excluderea mutuală se realizează prin includerea secțiunilor critice de program între operații P1 și P2, care sunt exercitate asupra aceluiași semafor (s), acesta fiind inițializat cu valoarea 1.

Primul proces care execută P1(s) intră în secțiunea critică, astfel semaforul obține valoarea zero. Din ascest moment orice tentativă a altui proces de executare a unei secțiuni critice va duce la punerea în așteptare prin primitiva P1. După ce primul proces a executat operația P2 se va admite unui nou proces accesul la resursa critică. Secțiunile critice corespunzătoare aceleiași resurse se exclud între ele, dar nu există nici un motiv pentru interzicerea accesului concomitent din mai multe procese la resurse critice diferite. În acest caz se va realiza o excludere mutuală selectivă.

Monitorul

Monitorul joacă un rol de supervizor de la care va trebui cerută permisiunea sau ajutorul înaintea oricărui tip de comunicare dintre două procese. Diferența dintre semafoare și monitoare este aceea ca semafoarele sunt primitive de sincronizare care pot fi caracterizate ca fiind de nivel scăzut, și greu de utilizat, pe când monitoarele vor oferi o sincronizare de nivel înalt.

Monitorul este un tip de dată abstract care este alcătuit dintr-un set permanent de variabile, ce vor reprezinta resursa critică, un set de proceduri, ce reprezintă operații asupra variabilelor și o secvență de instrucțiuni sau „corp”.

Modul în care operează un monitor se poate descrie astfel:

Setul de proceduri este apelat la lansarea programului. Acesta va produce valori inițiale pentru variabilele-monitor. Monitorul va fi accesat doar cu ajutorul procedurilor sale. Accesul la procedurile monitorului este permis numai procesoarelor inițial selectate. Funcția monitorului este îndeplinită în condițiile în care codul de inițializare este executat înaintea oricărui conflict asupra datelor și numai una dintre procedurile monitorului poate fi executată la un moment dat. Monitorul va crea o lista de așteptare a proceselor care cer accesul la anumite variabile comune. În acest mod primul sosit la coadă este primul servit.

În cazul monitoarelor, excluderea mutuală poate fi realizată prin faptul că poate fi executată doar o singură procedură a monitorului la un anumit moment. Sincronizarea pe condiție este realizată de către programator cu ajutorul unor variabile de tip condiție și două operații: „signal” și „wait”.

În momentul în care procesul care a apelat o procedură de monitor va găsi condiția falsă, atunci va executa operația de tip „wait”, care presupune punerea în așteptare a procesului într-un șir asociat condiției și în același timp va realiza eliberarea monitorului. Dacă un alt proces care execută o procedură apartinand aceluiași monitor găsește condiția cu valoarea adevărată, acesta va executa o operație „signal”, care presupune continuarea procesului în cazul în care șirul de așteptare este vid, în caz contrar este pus în așteptare special pentru procesele care au pierdut controlul monitorului prin „signal” . Se execută apoi un alt proces care a fost extras din șirul de așteptare al condiției.

Sincronizarea prin transmiterea de mesaje

În sistemul paralel cu transmitere de mesaje, atât comunicarea cât și sincronizarea vor fi integrate într-un singur mecanism.

Acțiunea de expediere a unui mesaj este una asincronă:

Emițătorul mesajului este procesul care trimite mesajul și care continuă execuția fără să aștepte recepționarea mesajului de către receptor. Livrarea mesajului este o responsabilitate care revine sistemului de operare. Comportarea asincronă este simulată prin introducerea unor procese-tampon. Aceste procese-tampon au rolul de a accepta mesajul venit de la sursă și de a-l trimite spre destinație.

De regulă, în sisteme de acest tip recepționarea mesajelor este sincronă. Acest lucru presupune că procesul receptor este blocat până când mesajul care trebuie receptionat va fi disponibil.

Sincronizarea este realizată prin programarea corectă a instrucțiunilor de transmitere și de recepționare a mesajelor.

Unele sisteme conțin o expediere sincronă, în acest fel procesul emitent este blocat până când procesul receptor este pregătit să primească mesajul. Astfel, procesul ce ajunge la un punct de interacțiune este blocat până când procesul cu care urmează să comunice ajunge și el in punctul de interacțiune. Dupa ce mesajul a fost expediat ambele procese vor continua execuția.

Diferența dintre mesajele sincrone si cele asincrone este aceea ca mesajele sicrone necesită acordul comun al ambelor părți pentru a comunica, în timp ce mesajele asincrone pot permite ca mesajul să fie transmis și să rămână în sistem până la recepționarea sa.

Condiții de transmitere a mesajelor

Pentru realizarea transmiterii unui mesaj se impun trei condiții:

Prima condiție presupune specificarea mesajului emis, respectiv recepționat. Acest lucru presupune o expresie, a cărei valoare reprezintă informația de transmis, la emitere, respectiv o listă a identificatorilor variabilelor care au permisiunea de a obține valori extrase din conținutul mesajului după recepționarea acestuia.

Cea de a doua conditie este specificarea destinației, respectiv specificarea sursei. Acest lucru se poate realize în trei moduri diferite:

1) In primul caz specificare se poate realiza prin numirea directă a partenerului de comunicație. Acest proces este specific în modelul pipeline. Particularitate o reprezintă faptul că procesul receptor cunoaște identitatea procesului de la care obține, respectiv căruia îi transmite mesajul. Acest model mai poate fii numit si model conductor (fig 3).

Receive

fig.3 Modelul conductor

2) Numirea globală.

Aceasta se realizează prin intermediul unui port de comunicare care joacă rolul unei interfețe. Numele portului joacă rolul unei cutii poștale în care se depun și din care se extrag mesaje. Particularitatea numirii globale constă în faptul că aceasta poate permite comunicarea fără a fi realizată specificarea identității proceselor comunicante. Acest model mai este numit si modelul producator-consumator (fig.4).

fig. 4 Modelul producator-consumator

3) Numirea selectivă

Această metoda se realizează prin intermediul unui port de comunicare care este atașat doar anumitor procese. Modul de funcționare este următorul: procesul care deține portul nu specifică identitatea proceselor cu care comunică, în schimb acestea din urmă sunt obligate să cunoască identitatea procesului care deține portul. Acest model mai este numit si modelul client-server (fig. 5).

fig. 5 Modelul client-server

7. Timpul de calculul

Timpul de calcul paralel reprezintă perioadă care s-a scurs de la inițierea primului proces paralel pana la momentul în care toate procesele paralele sunt finalizate.

În sistemul cu memorie comună, exprimarea timpului de calcul paralel al unui algoritm sincron se poate face ca o sumă de mai multe valori. Aceste valori sunt descrise ca fiind:

1. În primul rând se ia în calcul timpul de procesare de bază. Timpul de procesare de bază reprezintă suma tuturor perioadelor de timp care sunt necesare pentru fiecare etapă. Deci va reprezenta perioada între două puncte de interacțiune.

2. Al doilea element luat in calcul este timpul de blocare. Acesta reprezintă perioada de timp în care procesul care vrea să interactioneze cu datele comune, intra într-un program sincron, sau intrarea într-o secțiune critic. Mai exact, timpul de blocare reprezintă timpul in care procesul asteaptă interactiunea cu detele de intrare commune.

3. Al treilea element ce se ia în considerare este timpul de sincronizare a comunicărilor. Aceste este necesar anumitor operații asupra unor variabile comune.

Performanța calculatoarelor paralele nu depinde în mod decisiv de puterea procesoarelor, ci din numărul lor.

8. Sisteme de calcul paralel. Clasificare.

De-a lungul timpului oamenii de știinta din domeniul IT au studiat și construit diferite arhitecturi, pornind de la mașini de calcul cu procesoare foarte rapide și interconectate până la mașini de calcul cu mai multe procesoare lente.

În domeniul sistemelor de calcul paralel s-a reușit o cuantificare a diferențelor dintre modele paralele disponibile până la momentul actual. Aceasta presupune urmatoarele specificații:

1) numărul de procesoare ale sistemului de calcul și puterea fiecarui procesor în parte

2) gradul de complexitate al rețelei de conectare și flexibilitatea sistemului.

Acest lucru presupune disponibilitatea sistemului în rezolvarea unei clase mari de probleme.

3) controlul sistemului.

Acest lucru reprezinta faptul ca procesoarele sunt conduse de un procesor sau fiecare procesor are propriul său controller.

5) organizarea memoriei.

.

Clasificarea Flynn

Clasificarea Flynn este cea mai des utilizată. Conform acesteia calculatoarele paralele pot fi împărțită in:

– SISD: sistem cu un singur set de instrucțiuni și un singur set de date

– SIMD: sistem cu un singur set de instrucțiuni și mai multe seturi de date

– MISD: sistem cu mai multe seturi de instrucțiuni și un singur set de date

– MIMD: cu mai multe seturi de instrucțiuni și mai multe seturi de date.

Sistemul SISD

Sistemul SISD procesează un singur set de instrucțiuni și un singur set de date. Acesta reprezintă o mașină serială clasică, care execută o singură instrucțiune la un moment dat.

În figura 6 este prezentat modul de fuctionare al unui sistem SISD.

Fig.6 Modul de funcționare al modelului SISD

Sistemul SIMD

Sistem SIMD procesează un singur set de instrucțiuni și mai multe seturi de date. Acesta este compus dintr-o unitate de control și dintr-un anumit număr de procesoare identice.

Conceptul presupune că unitatea de control va transmite aceeași instrucțiune la fiecare procesor în parte. Instrucțiunile urmând a fi executate în același timp.

Fiecare procesor care compune acest sistem are o memorie privată. Fiecare procesor operează pe 32 sau 64 biți.

SIMD sunt folosite mai ales pentru rezolvarea acelor problemelor care pot fi descompuse în subprobleme și care presupun un efort de calcul similar.

În figura 7 este prezentat modul de lucru al acestui sistem.

Fig.7 Modelul SIMD

Sistemele de calcul paralele la momentul actual fac parte din categoria SIMD sau MIMD.

Sistemul MISD

Sistemele MISD sunt reprezentate prin procesoarele pipeline care efectuează operații asupra unui set mic de date. Un procesor pipeline operează o singură dată în diferite faze ale unități funcționale. În acest mod paralelismul este realizat prin executia simultană a diferitelor etape, asupra unui șir de date secvențiale. Figura 8 reprezintă modul de operare al unui sistem MISD.

Fig.8 Sitemul MISD

Sistemul MIMD

În sistemul MIMD, fiecare procesor executa operații pe date diferite de cele ale altor procesoare. Fiecare procesor în parte funcționează independent de celelalte procesoare utilizând în acest mod propriul contor de program și setul propriu de instrucțiuni. Comunicarea dintre două procesoare trebuie specificată în mod explicit.

Figura 9 reprezintă schema sistemului MIMD.

Fig.9 Modelul MIMD

9. ANALOGIE CU VIAȚA COTIDIANĂ

9.1. Lucrul în echipă și dezvoltarea speciei umane

Modul în care este realizată dezvoltarea calculatoarelor se aseamănă cu modelul de dezvoltare umană.

Specia umană, dezvoltarea și progresul acesteia se realizează pe două planuri: primul plan este reprezentat de performanța fiecărui individ în parte, pe cand cel de al doilea plan este reprezentat de evoluția relațiilor sociale dintre indivizi. Astfel primul plan se referă la performanțele din punct de vedere fizic și intelectual ale individului, iar planul al doilea se referă la “concurența socială”.

Lucrul oamenilor în echipă este esențial în vederea rezolvării unor probleme mari și dificile. Acest mod de lucru presupune urmatoarea regulă: cu cât grupa conține mai mulți membri, cu atât se vor atinge performanțe mai mari. Rezultatele sunt mult mai eficiente și totodată timpul de lucru scade considerabil. Acestea conduc spre recunoașterea beneficiilor lucrului în echipă, prin “concurența socială”, și în același timp acceptarea acestui mod de lucru ca fiind unul productiv și în același timp eficient.

9.2. Analogia cu creierul uman

Un studiu asupra mecanismului de activitate al minții umane a rezultat faptul că creierul omului este organizat, respectând regulile unui sistem paralel de calcul, dintr-un număr foarte mare de elemente ce sunt interconectate, comunicând astfel între ele trimițând în mod reciproc și organizat un număr de semnale, excitatori și inhibitori.

Oamenii de știintă care s-au ocupat de acest studiu au caracterizat acest mod de organizare ca fiind unul de tip PDP. PDP reprezintă procesarea distribuita paralelă.

Astfel, aceștia au argumentat faptul că inteligența umană s-ar baza pe interacțiunea unui mare număr de unităti simple de procesare, după acest model fiind realizat și conceptul sistemelor de calcul paralel.

Un sistem de procesare distribuita conține urmatoarele elemente:

– un anumit număr de unități de procesare interconectate

– indicele care arată stare a activității sistemului la un anumit moment

– tipul de conexiune între unitățile de procesare

– condiția sau regula de transmitere a directivei de activitate;

– regula de activare;

– tehnica de învățare prin intermediul căreia structura este modificată prin

experiență.

9.3. Paralelismul in organizarea unei companii

Companiile sunt un exemplu foarte bun prin care se poate pune în evidență existența modelului paralel în viața cotidiana. Compania este de asemeni și un mod foarte bun de a evidenția eficiența aplicării sistemului paralel în vederea progresului activității umane exercitate în grup.

Se presupune asadar o companie care are în componența sa un șef și o mie de angajați. În companie activitatea cea mai intensă estq exercitată de catre șef, care lucrează zi și noapte, pe când ceilalti o mie de angajați ai companiei lucrează doar în momentul în care șeful acestora trece pe la biroul lor.

S-au încercat așadar rezolvarea acestei probleme pentru a crește eficiența și evident productiviatea companiei:

În primă fază s-a încercat rezolvarea problemei prin angajarea mai multor persoane. Acest lucru este similar în domeniul sistemelor de calcul cu adaugarea de mai multă memorie. S-a constatat că activitatea este imbunatatită, dar eficiența descrește, deoarece aveau loc mai multe cheltuieli.

În a doua fază s-a recurs la angajarea unui nou șef. În sistemele de calcul analogia ar putea fii creată prin achizitionarea unui procesor mai puternic. Acest lucru a avut același efect ca și in cazul descris anterior.

Soluția cea mai eficientă s-a dovedit a fi urmatoarea: șeful celor o mie de angajați va fi suplinit de mai mulți directori, sau procesoare prin analogia cu sistemul de calcul, aceștia au rolul de a comunica informațiile de la angajați, de a le prelucra, de a decide unde sa fie transmise rezultatele și de a transmite aceste rezultate. Aceste activitați fiind împărțite între directori care lucrează în mod paralel.

Se angajează șefi de achipă, care joacă același rol cu memoria cache prin analogia la paralelismul sistemelor de calcul.

Observație

Partea practică a acestei lucrări de licență a fost realizată folosind un limbaj ce permite tehnici de programare paralelă.

Programarea aplicației a fost realizată folosind fire de execuție (thread-uri Java) care pot fi procesate în mod simultan. Astfel, în continuare va urma prezentarea și descrierea limbajului de programare Java, a tehnicilor și metodelor permise de acest limbaj, iar mai apoi prezentarea mediului de programare NetBeans IDE.

10. Limbajul Java

Ce reprezinta Java?

Java reprezintă o tehnologie lansată de compania Sun Microsystems în anul 1995.

Această tehnologie a avut un impact remarcabil asupra dezvoltatorilor de software, deoarece se caracterizează prin anumite calităti namaintâlnite până la momentul raspectiv, cum ar fi simplitatea, robustețea si mai ales portabilitatea.

Denumirea initiala a tehnologiei Java a fost Oak.

Tehnologia Java presupune un limbaj de programare de nivel înalt cu ajutorul caruia sunt construite platforme de implementare a aplicatiilor cu specific în toate domeniile industriei de software.

Scopul a fost crearea unui limbaj asemănător cu limbajul C++, dar mai simplu de ultilizat și totodată mai portabil și mai flexibil, pentru aparatele electrocasnice de larg consum.

Caracteristicile limbajului Java

Principalele două caracteristici prin care se diferentiază aceste limbaj de programare sunt simplitate si portabilitatea:

– Simplitatea constă in faptul ca s-a renunțat la o parte dintre operatori, la pointeri și la moștenirea multiplă, elemente caracteristice limbajului C++. În plus a fost implementat un colector automat de reziduuri. Acesta are ca rol eliberarea memoriei fără intervenția programatorului.

– Portabilitatea presupune situația în care compilatorul poate genera instrucțiuni ale unei mașini virtuale. Ceea ce înseamnă că execuția aplicațiilor va reprezenta interpretarea acestor instrucțiuni. Interpretorul și o parte din bibliotecile standard ale sistemului sunt singurele elemente portate.

O altă caracteristică importantă este faptul că Java necesită resurse scăzute. Astfel interpretorul și bibliotecile standard necesită aproximativ 300 kB.

Java este un limbaj orientat pe obiect. Aceasta înseamnă că se pot crea clase și instanțe ale lor, se pot încapsula informații și se pot moșteni variabilele și metodele de la o clasă la alta. Comportamentului clasei este definit de interfața.

Pe lângă simplitate și portabilitate, JAVA este un limbaj de programare robust, sigur, concurent si dinamic:

Faptul că este distribuit reprezintă posesia de biblioteci pentru lucrul în rețea, oferind servicii de tip TCP/IP, URL și încărcarea resurselor la distanță.

Robustețea acestui limbaj de programare o reprezintă legarea care se realizează la execuție, iar informațiile legate de compilare sunt disponibile până la execuție, indicii tablourilor fiind verificați permanent la execuție.

Siguranța acestui limbaj de programare o conferă patul că se verifică operațiile disponibile fiecărui obiect. Java are sistem de protecție a obiectelor prin declararea lor în clase de tipul private, protected sau public. Mediul de execuție se va configura astfel încât să fie posibilă protejerea de pe calculatorul gazdă al aplicației.

Concurența este acea caracteristică care permite definirea firelor de execuție și sincronizarea lor, independentă sau gestionată de sistemul de operare.

Dinamismul este conferit prin legarea claselor care se realizează la interpretare și regăsirea câmpurilor. Legarea se face prin calificarea numelui clasei cu numele câmpului. În acest mod, dacă se modifică superclasa, nu va fi necesară recompilarea subclaselor.

Prima aparitie

Limbajul Java a ajuns cunoscut în 1995.

Firma Netscape a achiziționat licența si la folosit în browser-ul său, denumit Navigator. Programele cu interfață grafică care au fost integrate într-un navigator web au revoluționat paginile web. Aceste programe se mai numesc și applet-uri Java.

Dupa lansarea versiunii Java 2, limbajul a fost extins și pentru a putea fi folosit în dezvoltarea generală de programe.

Firma Sun pune la dispozitie pachetul JDK in mod gratuit. Acest pachet conține un set de instrumente în linie de comandă folosite pentru scrierea, compilarea și testarea programelor Java. Totodată au apărut mediile vizuale pentru programare în limbajul Java: Borland JavaBuilder, Microsoft Visual Java, Xinox Software Jcreator Pro, etc.

11. Firele de execuție Java (Java Threads)

În acest capitol este prezentat conceptul de fir de execuție.

În limbajul de programare Java, firul de execuție este inițiat prin “extends Thread”.

Vor fi prezentate de asemeni și modalitatile de lucru cu fire de execuție în Java, dar și utilitatea folosirii acestora in programarea paralelă.

Ce este threadul sau firul de executie?

Threadul sau firul de execuție poate fi definit ca fiind cea mai mică unitate de procesare care poate fi programată la execuție de către un sistem de opereare.

Firul de execuție este folosit deseori în programare deoarece face posibilă eficientizarea execuției programelor. Astflel se vor executa porțiuni diferite de cod în paralel de-a lungul aceluiași proces.

Atunci când aceste porțiuni de cod nu sunt complet independente se poate întampla ca un thread să fie nevoit să aștepte terminarea execuției unor instrucțiuni din alt thread, pentru a putea executa propriile instrucțiuni. Această tehnica de asteptare a executiei intrucțiunilor unui thread pentru a începe executarea altui thread se numește sincronizarea threadurilor.

Sincronizarea threadurilor in JAVA

Limbajul Java oferă programatorilor urmatoarele facilități pentru realizarea sincronizării threadurilor:

– mecanismul synchronized

Prin adaugarea modificatorului „synchronized” la o metodă în timpul execuției, această metodă va putea fi executată, la doar de către un singur thread. Practic un singur thread
În momentul în care se apelează o metodă „synchronized” într-un thread, mașina virtuală JAVA va încerca mai întâi obținera blocajului (lock). Blocajul este un element specific, inclus în mașina virtuala Java, care joaca rolul unei variabile de tip boolean: atunci când ia valoarea „true”, obiectul va putea fi folosit, deci blocat, iar atunci cand ia valoarea „false” obiectul nu poate fi folosit deci va fi deblocat. Astfel, la obținerea blocajului, obiectul pe care este apelată metoda va putea fi folosit. În cazul în care obiectul este deja blocat, threadul va intra în așteptare până în momentul în care acesta va fi deblocat și accesat.

După blocarea obiectului și încheierea metodei synchronized, threadul va debloca obiectul.

În cazul în care metoda „synchronized” este apelată de două obiecte diferite, pe două thread-uri diferite, nu se va obtine sincronizarea celor două thread-uri deoarece blocajele impun execuția serială.

Acțiunea de blocare a unui obiect se face direct pe acel obiect și nu pe referințe la acesta. De aceea nu este indicată modificarea acestor obiecte după acțiunea de sincronizare.

– metoda: wait

Metoda wait()  este specifică clasei “Object”, care reprezintă radacina ierarhiei claselor din limbajul Java.

Metoda wait() are rolul de a elibera blocajul pe obiect. Prin eliberarea blocajului realizată de wait(), se va permite altor threaduri, care se află in sterea de așteaptare, începerea activității. Astfel se va evita deadlock-ul (blocarea reciprocă definitivă).

Deadlock reprezinta situatia in care doua threaduri asteapta la infinit unul după celalalt.

12. NetBeans IDE

Ce este NetBeans?

NetBeans este o platformă care ajuta la dezvoltarea de produse software scrise în limbajul Java. Platforma NetBeans permite dezvoltarea aplicațiilor dintr-un set de componente software numite module.

NetBeans IDE este destinat în principal pentru dezvoltarea Java, dar permite totodată si alte limbaje de programare, în special PHP , C / C ++ și HTML5 .

NetBeans este cross-platform și rulează pe Microsoft Windows, Mac OS X, Linux, Solaris și alte platforme ce conțin o mașină virtuală JAVA compatibilă .

Scurt istoric

NetBeans a apărut în anul 1996 sub numele Xelfi, ca proiect studențesc Java IDE sub îndrumarea Facultății de Matematică și Fizică de la Universitatea Charles din Praga.

În 1997 Roman Stanek a înființat o companie în jurul proiectului și a produs versiuni comerciale de NetBeans IDE până când proiectul a fost cumpărat de către compania Sun Microsystems în anul 1999. Compania Sun a clasat proiectul IDE NetBeans ca open-source în lune iunie a anului următor. De atunci, comunitatea NetBeans a continuat să crească. În 2010, Sun Mycrosystems si implicit NetBeans au fost achiziționate de către compania Oracle.

NetBeans Profiler

NetBeans Profiler este un instrument de monitorizare a aplicațiilor Java. Acesta are rolul de a ajuta programatorul să micșoreze consumul de memorie și de a optimiza viteza.

Interfața grafică (GUI)

Anterior cunoscut sub numele de Matisse, GUI (fig.10) este un instrument de proiectare care permite dezvoltatorilor să proiecteze designul unei aplicatii prin glisarea și poziționarea componentelor.

fig.10 Interfața grafică (GUI)

13. Aplicatie de tip Chat

Fig.10 Chat

Acest capitol este dedicat descrierii parții practice a acestei lucrări.

Aplicația (fig.10) pe care am realizat-o este una de tip chat. Este o aplicație abordează una dintre problemele importante din viața cotidiană, si anume posibilitatea de comunicare.

De ce un Chat?

Am ales acest concept de aplicație deorece reprezintă o bună metodă de a pune în evidentă importanța progresului domeniului IT, datorită căruia comunicarea dintre oameni a devenit ușor de realizat. Totodată am ales o aplicație de tip chat deoarece reprezintă o bună metodă de a pune în aplicare conceptul de calcul paralel și de programare paralelă. Acest econcepte sunt folosite în scrierea codului aplicației.

Ce este un Chat

Termenul de chat desemnează un dialog sau schimb de replici scrise și transmise în mod instantaneu între două sau mai multe persoane. Acest lucru se realizează prin intermediul unui canal electronic de transmitere a informației, de obicei Internetul.

Chatul poate fi realizat ori prin browser, ori cu ajutorul unor programe, aplicatii propriu-zise cum ar fi: Yahoo! Messenger, Skype, BBM, Telegram, etc.

O caracteristică a chat-ului este faptul că utilizatorii pot folosii prescurtări de cuvinte și expresii, în vederea realizării unei comuicări mai rapide.

Scurt istoric

Conceptul de mesagerie instantanee este destul de vechi.

Sistemele UNIX/Linux oferă acest tip de comunicare sub formă de text de foarte mult timp, prin comanda talk.Sistemele de operare Windows au un echivalent în acest sens, numit WinPopUp. Cele două sisteme se bazează pe perechea utilizator/mașină.

Protocolul Internet Relay Chat (IRC) furnizează începând cu anul 1988, modalități simple de discuție între mai mulți participanți. Protocolul Zephyr, creat de către instituția MIT în același an, reprezintă un ansamblu extrem de simplu de servicii de bază, utilizat în domeniul universitar american. Aceste două modalități de a conversa în rețea nu reprezintă însă pentru moment ceea ce numim mesagerie instantanee, întrucât nu se oferă nici gestiune de prezență și nici autentificare, sau doar una simplă. Mesageria instantanee modernă pentru public a fost oferită prima dată de către o compania israeliană Mirabilis prin introducerea sistemului ICQ în 1996. Una din principalele inovații a constituit-o gestionarea unei liste de așa-numite contacte personale. În 1998 Mirabilis a fost cumpărată de către grupul AOL Time Warner.

În 1998 este creat protocolul Jabber, care, ca și protocolul QQ, este o clonă chinezească a lui ICQ. Odată cu succesul lui ICQ, furnizorii de conținuturi web din Internet au dezvoltat și oferit gratuit publicului numeroase aplicații de comunicare (Yahoo! Messenger în 1998, MSN Messenger în 1999 și Gadu-Gadu în 2000). Avantajul pentru furnizori este crearea unei baze vaste de clienți, cărora li se pot apoi afișa (în general automat, fără permisiune) diverse reclame, servicii contra cost etc.

În 2002 numărul utilizatorilor de e-mail și cel al utilizatorilor de mesagerie instantanee erau comparabile. Numărul aprozimativ de utilizatori de mesagerie instantanee s-a estimat la 360 milioane.

13.1. Limbajul si mediul de programare folosit.

Această aplicație a fost realizată cu ajutorul limbajului de programare, orientat pe obiect, Java. Mediul de programare folosit pentru dezvoltarea propriu-zisa a acestei aplicații este NetBeans IDE.

Atat limbajul JAVA cât și mediul de programare NetBeans IDE au fost prezentate în capitolele anterioare.

13.2. Proiectarea aplicației

Fig. 11 Interfața grafică

. Designul aplicației a fost realizat cu ajutorul constructorului GUI integrat în platforma aplicației NetBeans IDE. Atât butoanele cât și spațiile ce conțin texte, și compun interfața chat-ului, au fost realizate prin metoda drag&drop (Fig. 11).

Interfața aplicației pune la dispoziție urmatoarele elemente care pot fi folosite de utilizatori:

1) Elemente de realizare a conexiunii între chat-uri (Fig. 12):

butonul Listen host adresa ip target

Fig. 12 Elemente de conexiune

Spațiul host este folosit pentru identificarea utilizatorului.

Spațiul în care se va introduce adresa ip este destinat utilizatorului în vederea introducerii unei adrese unice care să poată fi recunoscută la conectare.

Spatiul target este folosit pentru completarea cu adresa la care se conetează aplicația. Această adresă este reprezentată de adresa host a aplicației chat si este folosită de către utilizatorul cu care se dorește conectarea.

2) Spațiul destinat citirii schimbului de mesaje dintre utilizatori (Fig.13):

Fig.13 Istoricul conversației

3) Elementele care ajută la scrierea și trimiterea mesajelor (Fig.14):

spatiu de scriere butonul de trimitere

Fig.14 Spațiul mesajului curent

Spatiul de scriere este folosit pentru scrierea efectivă a mesajului pe care ultilizatorul doreste să-l transmită persoanei cu care discută.

Butonul de trimitere (Send) este folosit după completarea spațului destinat scrierii mesajului, cu rolul de trimitere a acestuia. Odată cu trimiterea mesajului acesta va fi publicat automat în spațiul de citire a mesajelor (Fig. 13).

13.3. Utilizarea aplicației

Pentru utilizarea acestei aplicații este necesară îndeplinirea următorilor pași:

Pasul 1: Conexiunea

Pentru a se putea realiza o conversație între doi utilizatori folosind chat-ul, este necasară realizarea conexiunii dintre aceștia.

Coexiunea se realizează folosind elementele de conexiune prezentate în capitolul anterior, astfel:

– Se alege portul de identificare a utilizatorului curent. Acest port este compus din 4 cifre, de exemplu 8877 (Fig. 15)

Fig.15 Portul host

– Se alege portul target (Fig.16). Acest port este de asemeni compus din 4 cifre și reprezintă portul host ales de utilizatorul cu care vrem să purtăm conversația.

Fig.16 Portul target

– Se alege adresa de conexiune (Fig. 17). Această adresa va fi scrisă în spațiul adresei IP.

Fig.17 Adresa de conexiune

– Se apasă butonul “Listen”(Fig.18) de către ambii utilizatori. Prin apăsarea butoului se va realiză conexiunea dintre chat-uri.

Fig.18 Butonul Listen

Pasul 2: Comunicarea

Pentru a scrie mesajul dorit, utilizatorul va folosi spațiul dedicat scrierii mesajului (Fig. 19). Acest spațiu este situat sub fereastra ce contine istoricul conversației.

Fig. 19 Spatiu dedicat compunerii mesajului

Pentru trimiterea mesajului dorit, utilizatorul va folosi butonul “Send” (Fig. 20).

Fig.20 Butonul Send

Pentru închiderea aplicației se va folosi butonul “Close” (Fig. 21).

Fig.21 Butonul Close

În continuare este prezentat un exemplu de utilizare a aplicație (Fig. 22).

Fig.22 Exemplu

Observații

1. Această aplicație poate fi utilizată doar de catre doi utilizatori care au realizat corect conexiunea.

2. În cazul în care un al treilea utilizator intentionează să se conecteze cu unul dintre utilizatorii aflati într-o discuție pe chat, această conectare nu va fi posibilă. La apăsarea Butonului “Listen” de către cel de al treilea utilizator, în încercarea conectări, compilatorul NetBeans va genra o serie de erori precum cele încercuite cu negru în Fig.23.

Fig.23 Erori de conexiune

3. Aplicația poate fi utilizată de către două perechi de utilizatori (Fig. 24) fără inteferențe, dacă se repectă pașii de conexiune, iar utilizatorii folosesc porturi diferite de conexiune.

Fig.24 Mai mulți utilizatori

13.4. Realizarea aplicației

Pentru realizarea aplicației am folosit mediul de programare NetBeans IDE versiunea 8.0.

Proiectul realizat conține o serie de fișiere incluse în pachetul codului sursă. Pachete și fișierele lor sunt prezentate mai jos în Fig. 25.

Fig.25 Fișiere

După cum se poate observa fișierele ce compun această aplicație se împart într-o serie de pachete. În continuare se va realiza descrierea pachetelor cât și a codului sursă atribuit fiecărui fișier în parte.

1. Pachetul “mychatapp”

Fig.26 Pachetul mychatapp

Acest pachet, mychatapp (Fig.26), conține un singur fișier java denumit “MyChatApp.java”. Codul java conținut de acest fișier este următorul:

package mychatapp;

import mychatapp.gui.MainScreen;

Prin această funcție se permite importarea elementelor din fisierul MaiScreen. java ce aparține pachetului “mychatapp.gui” (Fig.27).

Acest fișier conține și o clasă publică “public class MyChatApp” care conține la rândul ei o structură, funcție a cărui rezultat generat presupune ecranul principal al aplicației. Acesta se regasește în pachetul “mychatapp.gui” (Fig27).

public class MyChatApp {

public static void main(String[] args) {

MainScreen screen = new MainScreen();

screen.show();

}

}

2. Pachetul “mychatapp.gui”

Fig. 27 Pachetul mychatapp.gui

Acest pachet conține fișierul “MainScreen.java” prin care s-a creat interfața grafică a aplicației. “MainScreen.java” este un fișier de tip JFrame Form. Acest tip de fișier permite crearea design-ului aplicației prin punerea unei game largi de elemente la dispoziția programatorui. Aceste elemente pot fi: butoane (elemente care presupun realizarea unei acțiuni specificate), spații de tip text (sau textfield, care pot conține text pe o singură linie), text area (care poate conține text pe mai multe linii, cu posibilitatea ca acesta să nu fie modificat la rularea aplicației) si alte elemente de acest tip care ajută la realizarea propriu-zisă a unei aplicații.

Fișierul “MainScreen.java” conține următorul cod java”

package mychatapp.gui;

import mychatapp.networking.MessageListener;

import mychatapp.networking.MessageTransmitter;

import mychatapp.networking.WritableGUI;

Aceste funcții de tipul “import” ajută la realizarea conexiunii acestui fișier cu fișierele specifice pachetului “mychatapp.networking”(Fig.28). Aceste funcții crează astfel legatura dintre partea grafică a aplicației cu codul sursă de execuție specific fiecărui element în parte.

public class MainScreen extends javax.swing.JFrame implements WritableGUI {

public MainScreen() {

initComponents();

}

Codul de mai sus reprezintă legatura interfeței grafice la codul sursă a fiecărui element de design folosit. Acest cod al componentelor este generat automat de către mediul de programare NetBeans odată cu aplicarea componentelor pe forma normală.

MessageListener listener;

private void listenButtonActionPerformed(java.awt.event.ActionEvent evt) {

listener = new MessageListener(this,Integer.parseInt(receivePort.getText()));

listener.start();

}

Aceasta secțiune de cod este dedicată butonului “Listen” (Fig. 18) care face legătura dintre portul host și portul target. Acest cod are rolul de a “asculta” mesajul și de a face posibilă conectarea dintre doi utilizatori.

Acest cod realizează totodată și legătura acestui fișier cu fișierul “MessageListener,java” din pachetul “mychatapp.metworking”(Fig.28).

private void sendButtonActionPerformed(java.awt.event.ActionEvent evt) {

MessageTransmitter transmitter = new MessageTransmitter(message.getText(), ipTextField.getText(), Integer.parseInt(targetPort.getText()));

transmitter.start();

}

Această secțiune de cod este dedicată butonului “Send” (Fig.20). Acțiunea de trensmitere a mesajului către utilizatorul destinatar este posibilă prin conectare acestui cod al parții de design cu structura prezentată în fișierul “MessageTransmitter” din pachetul “mychatapp.networking” (Fig.28).

3. Pachetul “mychatapp.networking”

Fig.28 Pachetul mychatapp.netorking

Acest pachet al proiectului conține trei fișiere java: MessageListener.java, MessageTransmitter.java și WritableGUI.java.

În continuare voi prezenta fiecare fișier în parte descriind codul sursă și rolul structurilor componente. Fișierele din acest pachet au ca scop realizarea transmiterii de mesaje cât și realizarea conexiunii dintre aplicațiile chat ale utilizatorilor.

1) Fișierul MessageListener.java

Acest fișier are în componența sa o clasă de tip Thread ce are ca scop realizarea conexiunii între chat-uri.

Conform teoriei descrise în capitolele anterioare, punerea în practică a conceptului de programare paralelă este posibilă utilizand un limbaj ce permite programare paralelă, în cazul de fată Java, și care poate folosii fire de execuție ce se pot executa în paralel în mod simultan.

Firul de execuție al acestui fișier are următorul cod:

public class MessageListener extends Thread {

ServerSocket server;

int port = 8877;

WritableGUI gui;

public MessageListener(WritableGUI gui, int port){

this.port = port;

this.gui = gui;

try {

server = new ServerSocket(port);

} catch (IOException ex) {

Logger.getLogger(MessageListener.class.getName()).log(Level.SEVERE, null, ex);

}

}

Socket-ul java este o metodă prin care se poate programa realizarea de conxiuni. Folosind-o în acest fir de execuție, ea va citii portul host apoi va face lagatura cu portul target.

public MessageListener(){

try {

server = new ServerSocket(port);

} catch (IOException ex) {

Logger.getLogger(MessageListener.class.getName()).log(Level.SEVERE, null, ex);

}

}

@Override

public void run(){

Socket clientSocket;

try {

while((clientSocket = server.accept()) != null){

InputStream is = clientSocket.getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(is));

String line = br.readLine();

if (line != null){

gui.write(line);

}

}

} catch (IOException ex) {

Logger.getLogger(MessageListener.class.getName()).log(Level.SEVERE, null, ex);

}

}

}

2. Fișierul MessageTransmitter.java

Acest fișier conține un alt fir de execuție decalarat prin “extends Thread” care are rolul de a citii mesajul scris de utilizator și de al transmite de la un port la altul.

public class MessageTransmitter extends Thread {

String message, hostname;

int port;

În această sectiune au fost declarate variabilele utilizate.

public MessageTransmitter(String message, String hostname, int port){

this.message = message;

this.hostname = hostname;

this.port = port;

}

Prin aceasta functie au fost declarate variabilele ce folosesc porturile de conexiune.

@Override

public void run() {

try {

Socket s = new Socket(hostname, port);

s.getOutputStream().write(message.getBytes());

s.close();

} catch (IOException ex) {

Logger.getLogger(MessageTransmitter.class.getName()).log(Level.SEVERE, null, ex);

}

}

}

2. Fișierul WritableGUI.java

Acest fișier conține o funcție ca face legătura cu interfața grafică. Aceasta funcție, void write, permite folosirea de variabile de tip string.

public interface WritableGUI {

void write(String s);

}

Similar Posts