Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

VPG/Otto Knudsen1 VPR - Repetition Trådning Distribueret Programmering Sprogteori Grafer.

Lignende præsentationer


Præsentationer af emnet: "VPG/Otto Knudsen1 VPR - Repetition Trådning Distribueret Programmering Sprogteori Grafer."— Præsentationens transcript:

1 VPG/Otto Knudsen1 VPR - Repetition Trådning Distribueret Programmering Sprogteori Grafer

2 VPG/Otto Knudsen2 Tråde Tråd (lightweight process) Enkel sekventiel kontrolsekvens i et program Deler fælles data

3 VPG/Otto Knudsen3 Trådning Fordele Overvågningssystemer med flere uafhængige opgaver Muliggør brugerinteraktion via BGF Muliggør serverhåndtering af flere samtidige klienter Udnytter flerprocessor-systemer optimalt

4 VPG/Otto Knudsen4 Tråde Ulemper Trådene afvikles uafhængigt af hverandre Afviklingsrækkefølgen er vilkårlig Samspillet mellem tråde er ofte meget kompleks Problemer med safety og liveness

5 VPG/Otto Knudsen5 Instantiering af tråde Tråde kan skabes på 2 måder: Arve fra Thread -klassen Implemetere Runnable -interfacet

6 VPG/Otto Knudsen6 Tråde

7 VPG/Otto Knudsen7 Thread-klassen Skabe en tråd vha. Thread extends Thread-klassen Overskriv run-metoden Lav en instans af trådklassen Kald metoden start() på denne instans

8 VPG/Otto Knudsen8 Thread-klassen class Tråd extends Thread { public void run() { kode } }... new Tråd().start();

9 VPG/Otto Knudsen9 Runnable-interfacet Implements Runnable-interfacet implementér run-metoden Lav en instans af trådklassen Lav en ny Thread -instans med Runnable -objektet som argument Kald metoden start() på denne instans

10 VPG/Otto Knudsen10 Runnable-interfacet class Tråd implements Runnable { public void run() { kode } }... new Thread(new Tråd()).start();

11 VPG/Otto Knudsen11 Runnable-interfacet class Tråd implements Runnable { public void run() { kode } public void start() { new Thread(this).start(); }... new Tråd().start();

12 VPG/Otto Knudsen12 Trådes livscyklus

13 VPG/Otto Knudsen13 Trådsikre klasser Problem: Hvis en tråd afbrydes, medens den arbejder på et objekt, er der risiko for, at objektet efterlades i en inkonsistent tilstand. Dette kan give problemer, når en anden tråd forsøger at få tilgang til objektet

14 VPG/Otto Knudsen14 Trådsikre klasser Løsning: Løsningen er at forhindre mere end én tråd ad gangen i at få tilgang til de kritiske områder i koden Vha. synkronisering opnår en tråd eneret på et objekt (lås) Låsen frigives, når tråden forlader det kritiske område eller ved kald af metoden wait() på objektet. Kritiske områder på samme objekt deler samme lås!

15 VPG/Otto Knudsen15 Liveness problemer Starvation (udhungring): En tråd, som er i tilstanden ready, får aldrig lejlighed til at køre, fordi der findes andre tråde med højere prioritet Dormancy (dvale): En tråd, som er i tilstanden blocked on wait, vækkes aldrig med notify() Deadlock (hårdknude): To eller flere tråde kæmper om flere fælles ressourcer, og hver tråd efterspørger på samme tid disse ressourcer Premature Termination (for tidlig død): En tråd termineres for tidligt og hindrer derved andre tråde i at blive vækket. (Evig dvale)

16 VPG/Otto Knudsen16 volatile vs. synchronized Anvend volatile på en attribut, hvis denne kan tilgås af flere tråde; med mindre at alle trådene tilgår attributten gennem synkroniserede metoder (kodeblokke) Hvis flere tråde samtidigt kan tilgå en attribut, og mindst én af disse kan ændre i attributtens værdi, så er det generelt en god idé at anvende synchronized til at styre tilgangen Hvis kun én tråd kan tilgå attributten, så er brugen af synchronized overflødig og sløver programafviklingen

17 VPG/Otto Knudsen17 Brug af synchronized Nødvendig, hvis man vil lave "trådsikre klasser" Ej omkostningsfrit: Kræver CPU-kraft  langsommere programafvikling "Hellere for mange synkroniserede blokke end for få!" MEN - pas på deadlocks

18 VPG/Otto Knudsen18 Monitor En monitor indkapsler fælles ressourcer som private attributter og sikrer trådene enetilgang vha. synchronized metoder til de kritiske områder Formål: Overvågning af trådes adgang til fælles ressourcer Objekt, hvor de fælles ressourcer er samlet (attributter) Der er udelelig adgang til monitorens metoder (mutex) Én monitor-metode pr. kritisk sektion

19 VPG/Otto Knudsen19 Missed notification Problem notify sendes før wait Konsekvens notify mistes og wait -tråden bliver ved med at vente Løsning Sørg for kun at gå i wait, hvis notify endnu ikke er sendt. Sæt evt. en boolsk variabel, når notify sendes, og gå kun i wait, hvis denne variabel er sat Konklusion Sørg for at samle én begivenhed i ét synkroniseret monitorkald

20 VPG/Otto Knudsen20 Early notification Problem notify sendes før betingelserne for wait er opfyldt Konsekvens wait -tråden vækkes før tid Løsning Check (igen) betingelserne for wait, når wait -tråden vækkes Konklusion Anvend altid while (i stedet for if ) i forbindelse med check af wait -betingelser

21 VPG/Otto Knudsen21 Early notification 1. Bufferen er tom! 2. C1-tråden er i wait-tilstand 3. P-tråden generer et nyt element og kalder monitorens synkroniserede put-metode 4. C1-tråden underrettes via notify, og tråden går i ready-tilstand 5. P-tråden forlader monitorens put-metode og slipper objekt-låsen på monitoren 6. Bufferen indeholder nu ét element! 7. Trådskifte! 8. C2-tråden trækker et element fra bufferen ved at kalde monitorens get-metode 9. C2-tråden forlader monitorens get-metode og slipper objekt- låsen på monitoren 10. Der er ingen elementer i bufferen! 11. Trådskifte! 12. C1 fortsætter nu fra wait i monitorens get-metode i forsøget på at trække endnu et element fra bufferen … Dette er ikke muligt!

22 VPG/Otto Knudsen22 Guarded Suspension public synchronized void put(String data) throws InterruptedException { while (buffer.isFull()) // while i stedet for if this.wait(); if (buffer.isEmpty()) this.notify(); buffer.add(data); } public synchronized String get() throws InterruptedException { while (buffer.isEmpty()) // while i stedet for if this.wait(); if (buffer.isFull()) this.notify(); String data = (String)buffer.remove(); return data; }

23 VPG/Otto Knudsen23 Observer Pattern

24 VPG/Otto Knudsen24 Distribueret Programmering Sockets RMI CORBA (ej pensum) JDBC (ej pensum)

25 VPG/Otto Knudsen25 Sockets Sockets er logiske endepunkter i en forbindelse mellem server og klient På applikationsniveauet betragtes Sockets som ”pålidelige”, dvs. data som sendes fra den ene ende af forbindelsen modtages i den anden ende i samme rækkefølge, som de er sendt, og uden tab Sockets optræder parvis – klienten har en Socket til serveren og omvendt En Socket er tilknyttet både en InputStream OutputStream Klientens OutputStream er forbundet til serverens InputStream og omvendt

26 VPG/Otto Knudsen26 Sockets - Arkitektur

27 VPG/Otto Knudsen27 Sockets - Serversiden 1. Skab en ServerSocket på portnr 2000 (fx) try { ServerSocket s = new ServerSocket(2000); } catch (IOException e) {} 2. Vent på forespørgsel fra klient while (true) { Socket socket = s.accept(); } 3. Skab InputStream og OutputStream ud fra Socket BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 4. Send og modtag via InputStream og OutputStream in.read(); out.println(); 5. Luk strømme og Sockets

28 VPG/Otto Knudsen28 Sockets - Klientsiden 1. Skab en Socket til serveren vha. hostname og portnr try { Socket s = new Socket(”localhost”, 2000); } catch(IOException e) {} 2. Skab InputStream og OutputStream ud fra Socket BufferedReader in = new BufferedReader( new InputStreamReader(s.getInputStream())); PrintWriter out = new PrintWriter(s.getOutputStream(), true); 3. Send og modtag via InputStream og OutputStream in.read(); out.println(); 4. Luk strømme og Socket

29 VPG/Otto Knudsen29 Sockets - Strømme

30 VPG/Otto Knudsen30 Flere samtidige klienter Server class Server { public static void main(String[] args) { try { ServerSocket s = new ServerSocket(2000); while (true) { // Vent på anmodning fra klient... Socket socket = s.accept(); // Instantiér klienttråd - og start den... new ClientHandler(socket).start(); } } catch (IOException e) {} }

31 VPG/Otto Knudsen31 Flere samtidige klienter ClientHandler class ClientHandler extends Thread { private Socket incoming; public ClientHandler(Socket incoming) { this.incoming = incoming; } public void run() { try { // Instantiér ind- og ud-strøm while (true) { // Kommunikér } } catch (IOException e) {} }

32 VPG/Otto Knudsen32 RMI RMI (Remote Method Invocation) Kald af metoder på serverobjekt fra klient Filosofi Objekter på serveren gøres tilgængelige på klienten Abstraktionsniveau Højere abstraktionsniveau end Sockets Objektorienteret – Syntaksen svarer til almindelig Java Fælles data og funktionalitet Transparens – Der arbejdes med serverobjekterne, som om de lå på klienten Miljø RMI findes kun til Java

33 VPG/Otto Knudsen33 RMI - Arkitektur

34 VPG/Otto Knudsen34 RMI - Arkitektur 1. Kald af metoden server.metode() fra klienten udføres som et metodeklad på stub’en: stub.metode() 2. Stub’en arrangerer argumenterne i metodekaldet, (marshalling), og sender dem til skeleton’en på serveren tillige med information om kaldet 3. Skeleton’en afkoder argumenterne samt informationen om kaldet, (demarshalling), og kalder metoden på serveren: server.metode() 4. Serverobjektet eksekverer metodekaldet og sender eventuel en returværdi til skeleton’en 5. Skeleton’en arrangerer returværdien, (marshalling), og sender resultatet til stub’en 6. Stub’en afkoder, (demarshalling), returværdien og returnerer den til klienten

35 VPG/Otto Knudsen35 RMI – Begreber Marshalling Arrangering af information om metodekald, dvs. objekt-id, metodenavn, argumenter og returværdier Lokale objekter Objekter, som kun kan tilgås lokalt, enten på serveren eller på klienten. Lokale objekter, der overføres som argumenter eller returværdier skal implementere markør-interfacet Serializable Remote objekter Objekter, som er tilgængelige fra andre maskiner/processer. Remote objekter skal implementere markør-interfacet Remote Remote reference Reference til et objekt, der fysisk er placeret på en anden maskine/proces. Referencen indeholder ip-adresse, portnr samt objekt- id på serverobjektet Remote metodekald Kald af servermetode fra klient. Ved remote metodekald overføres lokale objekter by value og remote objekter by reference

36 VPG/Otto Knudsen36 RMI – Proxy-mønsteret

37 VPG/Otto Knudsen37 RMI - Serversiden import java.rmi.*; public interface Konto extends Remote {... // metodeerklæringer public double indsaet(double beloeb) throws RemoteException; } import java.rmi.*; import java.rmi.server.UnicastRemoteObject; public class KontoServer extends UnicastRemoteObject implements Konto {... // attributter double saldo; public KontoServer() throws RemoteException { super(); saldo = 0.0; }... // metodeimplementeringer public double indsaet(double beloeb) throws RemoteException { saldo += beloeb; return saldo; }

38 VPG/Otto Knudsen38 RMI - Kontoeksemplet

39 VPG/Otto Knudsen39 Forløbet af et RMI-kald (1) 1. Definér et interface (kontrakt) til et remote objekt public interface Konto extends java.rmi.Remote {... public double indsaet(double beloeb) throws RemoteException; } 2. Implementér ovenstående interface på serversiden public class KontoServer extends java.rmi.server.UnicastRemoteObject implements Konto {... public double indsaet(double beloeb) throws RemoteException; }

40 VPG/Otto Knudsen40 Forløbet af et RMI-kald (2) 3. Skab en instans af NameServer-objektet på en given port (fx 1099) vha. LocateRegistry java.rmi.registry.LocateRegistry.createRegistry(1099); 4. Skab en instans af serveren og registrér serveren i RMI- registry Konto server = new KontoServer(); java.rmi.Naming.rebind("Konto", server); 5. Generér stub og skeleton class-filer vha. RMI-compile Filerne får navnene KontoServer_Stub.class og KontoServer_Skeleton.class Stub-klassen implementerer også Konto-interfacet

41 VPG/Otto Knudsen41 Forløbet af et RMI-kald (3) 6. Lokalisér remote objektet – konto er nu en instans af stub- klassen, som implementerer Konto-interfacet Konto konto = (Konto)java.rmi.Naming.lookup("//localhost:1099/Konto") 7. Lav en klient, som anvender metoderne på konto-objektet: konto.indsaet(100);

42 VPG/Otto Knudsen42 RMI – MathInterface package math; import java.rmi.*; public interface MathInterface extends Remote { public int add(int a, int b) throws RemoteException; public int sub(int a, int b) throws RemoteException; public int mul(int a, int b) throws RemoteException; public int div(int a, int b) throws RemoteException, ArithmeticException; }

43 VPG/Otto Knudsen43 RMI - MathServer package math; import java.rmi.*; import java.rmi.server.*; public class MathServer extends UnicastRemoteObject implements MathInterface { public MathServer() throws RemoteException {} public int add(int a, int b) throws RemoteException{return a + b;} public int sub(int a, int b) throws RemoteException{return a - b;} public int mul(int a, int b) throws RemoteException{return a * b;} public int div(int a, int b) throws RemoteException, ArithmeticException {return a / b;} }

44 VPG/Otto Knudsen44 RMI - Server package math; import java.rmi.*; import java.rmi.registry.*; public class Server { public static void main(String[] args) { try { LocateRegistry.createRegistry(1099); Naming.bind("Math", new MathServer()); System.out.println("Serveren er registreret"); } catch (RemoteException e) {System.exit(1);} }

45 VPG/Otto Knudsen45 RMI - Klient package math; import java.rmi.*; public class MathClient { public static void main(String[] args) { MathInterface math = null; try { math = (MathInterface)Naming.lookup("Math"); System.out.println("1 + 2 = " + math.add(1, 2)); System.out.println("3 + 4 = " + math.add(3, 4)); System.out.println("5 + 6 = " + math.add(5, 6)); System.out.println("7 + 8 = " + math.add(7, 8)); } catch (Exception e) {System.exit(1);} }


Download ppt "VPG/Otto Knudsen1 VPR - Repetition Trådning Distribueret Programmering Sprogteori Grafer."

Lignende præsentationer


Annoncer fra Google