Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

To måder at overføre objekt- referencer mellem processer (1) Via naming service - interface RMISolver (2) Som parametre til fjernprocedurekald - interface.

Lignende præsentationer


Præsentationer af emnet: "To måder at overføre objekt- referencer mellem processer (1) Via naming service - interface RMISolver (2) Som parametre til fjernprocedurekald - interface."— Præsentationens transcript:

1 To måder at overføre objekt- referencer mellem processer (1) Via naming service - interface RMISolver (2) Som parametre til fjernprocedurekald - interface RMIProblemSe t Fælles: de objekter, der overføres referencer til, skal implementere et interface, som er kendt hos både server og klient, og som nedarver fra java.rmi.Remote de objekter, der overføres referencer til, skal være instanser af klasser som der på server-siden genereres stubbe og skeletter ud fra Forskel: (1) kræver synkronisering af rebind()/lookup. (1) kræver type-cast.

2 Parameter-overførsel af objekter ved fjern-procedurekald import..; class RMISolverImpl extends UniCastRemote implements RMISolver {.. public boolean setProblem(RMIProblemSet s) { currProblem = s; return true;.. } Problem slås ikke op

3 Type-casting Implicit type-konvertering: int i = 0; float f = i; System.out.println(f); Type-casting = eksplicit programmeret type-konvertering float f = 1.1; int i = (int) f; System.out.println(i); public java.rmi.Remote lookup(){..};.. Thing t = (Thing) Naming.lookup() Procedure lookup returnerer et objekt af typen java.rmi.Remote

4 CLASSPATH RMI-compiler (rmic) kender ikke den default-classpath, som java-oversætteren (javac) bruger. Derfor skal classpath-en sættes eksplict i C:\autoexec.bat set CLASSPATH=.;C:\jdk1.1.8\classes;C:\jdk1.1.8\lib\classes.zip Nu kan RMI-compileren finde klasser i: det aktuelle katalog kataloget C:\jdk1.1.8\classes zip-filen C:\jdk1.1.8\lib\classes.zip Tjek med instruktorerne hvad classpath skal være på maskinerne i J420 installationsafhængigt

5 Formål med Farleys multitrådede webserver/problemsolver (eks. 4.1-4.3) Klient/browser Server Solver Håndtering af multiple klienter

6 Formål med Farleys rmi-programmer (eks. 3.10-3.14) solver koordinator Fordeling af solvere på forskellige værtsmaskiner

7 // Farley eks. 4-2 class RunnableSolverServer {.. serviceClient(..) { RunnableSolver s = new RunnableSolver(..); Thread t = new Thread(s); t.start; } Servicering af klient-forespørgsel i separat tråd Fordele: svargaranti: en tråd er dedikeret til at lytte til nye henvendelser højniveauprogrammering: overflødiggør eksplicit programmering af fordeling af cpu-tid mellem de enkelte henvendelser

8 Eksplicit programmering af fordeling af cpu-tid while (true) { listen_for_0.1_sec_and_add_new_clients_to_list_L; for_all_clients_c_in_L { service_client_for_0.1_sec(c); }; } // ?? Hvordan vides hvor serviceringen er kommet til (hvilken programlinje) ? Hvordan undgås tidsspilde pga. blokering ? Teknisk set måske muligt, men vanvittig kompliceret.

9 Design: 1 tråd per samtidig opgave/agent Hver opgave, der skal løses samtidigt med andre opgaver, placeres i separat tråd eller proces. Administration af samtidighed overlades til operativsystem (og/eller Java køretidssystem). Programmet for den enkelte opgave kan skrives som om programmet havde maskinen for sig selv (stort set).

10 Multi-proces vs. multi-tråd Ligheder med fork()-ning af nye processer: samme programtekst samme OS-resourcer (fildeskriptorer, etc.) hver sin tråd (i billedlig betydning) parallelitet: cpu-deling blokering skeduleres (mini-skedulering af tråde i samme proces) Forskel - tråde har samme globale variable er del af samme proces Afgørende for håndtering af multiple klienter

11 Javas tråd-implementation: Klasser, interfaces, modifier interface Runnable class Thread run() start()stop() sleep() setPriority(..) …. class Object wait()notify() …. Thread(Runnable t) // constructor Implementa- tionen af run() er trådens program En instans af class Thread gør programmet til separat tråd Metode-modifier: synchronized

12 To måder at skabe en tråd interface Runnable class Thread run() class RI run() class SubT

13 To måder at skabe en tråd Ofte er begge metoder anvendelige. 1. Implementation af runnable A. Definer en class RI som implementerer interface Runnable. B. Parameteroverfør en instans af RI til en instans af class Thread. C. Kald start() i Thread -instansen. Giver mulighed for at tråden nedarver fra andre klasser. 2. Nedarvning fra class Thread A. Definer en class SubT som nedarver fra class Thread. B. Kald start() i en instans af class SubT. (Giver visse muligheder for at overskrive metoder.) Jf. Farley

14 Farleys multitrådede server: klassehierarki RunnableSolverServerRunnableSolver SolverSimpleServer RunnableSolverClient SimpleClient Runnable

15 Farley brug af metode 1 (A) run() Skridt A: En solver defineres som en klasse, der implementerer Runnable. RunnableSolver Solver Runnable solve() class RunnableSolver implements Runnable, Solver { void solve() {..sqrt..} public void run() {.. solve();.. }

16 class RunnableSolver implements Runnable, Solver { void solve() {..sqrt..} public void run() {.. solve();.. } class RunnableSolverServer {.. RunnableSolver s = new RunnableSolver(); Thread T = new Thread(s); t.start();.. } Skridt B: Solveren oprettes af RunnableSolverServer som tråd ved at parameter- overføre solver-objektet til et Thread-objekt. Skridt C: Thread-objektets start()-metode kaldes. Kalder run() i s /solver-objektet Farley brug af metode 1 (B+C)

17 Farleys multitrådede program Vink til tilpasning: Brug Java-filerne i kataloget threads: runnablesolver.java etc. Solver og ProblemSet i ikke-distribueret udgave (eks. 3-1 og 3-2) fra kataloget distributed objects. Diverse klasser fra pseudo-webserver skal bruges. Ved evt. oversættelsesproblemer: Tjek store/små bogstaver i filnavne (unix: ProblemSet defineres i ProblemSet.java). RunnableSolver.java: - PrintResults(..) -> printResults(..)

18 Håndtering af tråde Synkronisering som gensidig udelukkelse: Beskyttelse af en kritisk region for at undgå race conditions. void run() { X = X + 1; } Synkronisering ved hjælp af kommunikation: Kommunikation mellem tråde - typisk om hvornår der er åbnet op for adgang til en kritisk region. Hvis X er en global variabel, må run() ikke udføres af to tråde samtidig.

19 Gensidig udelukkelse: modifieren synchronized synchronized void run() { X = X + 1; } Svarer til at sætte en semafor: void run() { down(sem); X = X + 1; up(sem); }

20 Kommunikation: metoderne wait() og notify() synchronized void take_fork() { while (!available) {wait()}; available = false; } synchonized void put_fork() { available = true; notify(); } Afgørende at forstå: Hvem bliver "notify"-et ?


Download ppt "To måder at overføre objekt- referencer mellem processer (1) Via naming service - interface RMISolver (2) Som parametre til fjernprocedurekald - interface."

Lignende præsentationer


Annoncer fra Google