Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PID=1 atiende A
PID=2 atiende B
t=1. A puja
Fork() Fork()
PID=3 atiende ..
Web Server
process_new_connection() Web_Server_Main () t=1. B puja { for (;;) { new_connection = accept (i, NULL, NULL); Process_new_connection(); } } ap_scoreboard_image>parent[slot].pid = pid; return 0; }
2
Creacin de procesos
int pid; if (pid= fork()) == -1) perror(error); else if (pid == 0) /*cdigo del proc. hijo*/ else /* cdigo del proc. padre */ El ncleo del SO. con la llamada fork(): 1. Busca una entrada libre en la tabla de procesos y reservar memoria. 2. Asigna un identificador nico al pro. hijo. 3. Realiza las copias del contexto del proc. padre para el proc. hijo. 4. Copia las tablas de control de ficheros del proc. padre para el proc. hijo. 5. Retorna al proceso padre el pid del hijo y al hijo el valor cero. P_hijo
4
P_padre
3
Implementaciones de Hilos
A parent process may spawn child processes. parent process A process may spawn child threads a process main thread child thread 1
Thread
child processes child thread 2
run()
Los hilo siempre existen dentro de un proceso pesado, lo necesitan. Programas que implementan la gestin de hilos, p.ej. Java Virtual Machine. Las aplicaciones multihilo se ejecutan dentro del proceso del programa. Tambin existen sistemas operativos que implementan en su kernel la gestin de hilos: Windows NT, y muchas variantes de Unix. en este caso los hilos tambin estn dentro de un proceso.
7
MyThread run()
Ejecucin de Ejemplo
Salida Ejecucin RunThreads: Thread3: 1 Thread3: 2 Thread3: 3 Thread1: 1 Thread1: 2 Thread1: 3 Thread1: 4 Thread1: 5 Thread1: 6 Totalmente Thread1: 7 Thread1: 8 Concurrente Thread1: 9 Thread1: 10 (aunque la Thread3: 4 Thread3: 5 salida de linux Thread3: 6 vs. Window Thread3: 7 Thread3: 8 suele diferir) Thread3: 9 Thread3: 10 Thread2: 1 Thread2: 2 Thread2: 3 Thread2: 4 Thread2: 5 Thread2: 6 Thread2: 7 Thread2: 8 Salida Ejecucin RunThreads con sleep(10): Thread1: 1 Thread2: 1 Thread3: 1 Thread1: 2 Thread2: 2 Thread3: 2 Thread2: 3 Thread1: 3 Cada 10 seg. los 3 Thread3: 3 hilos escriben Thread2: 4 concurrentemente. Thread1: 4 Thread3: 4 Thread2: 5 Thread3: 5 Thread1: 5 Thread2: 6 Thread3: 6 Thread1: 6 Thread2: 7 Thread3: 7 Thread1: 7 Thread2: 8 10 Thread3: 8
Una clase Thread tiene que implementar el metodo run(), Una clase Thread se inicia llamando al metodo start().
9
MyRun run()
sleep(),join() start()
start() comienza el hilo, siempre llama a run() sleep(x) duerme el hilo un tiempo. join() espera a que otro hilo finalice.
13
} }
14
} }
15
16
Syncronize en Threads
class SomeThread3 implements Runnable { static int count=0;
Hilo 1: count = 1
Time Hilo 2: count = 2 Hilo 3: count = 2 Hilo 4: count = 1 Hilo 5: count = 1 . . No DESEADO
21
22
Bucle servidor.
24
accept
accept
25
26
Servidor MultiHilo
import java.io.*; import java.net.*; public class EchoServer3 { public static void main(String[] args) { int serverPort = 7; // default port String message; try { // instantiates a stream socket for accepting // connections ServerSocket myConnectionSocket = new ServerSocket(serverPort); while (true) { // forever loop // wait to accept a connection MyStreamSocket myDataSocket = new MyStreamSocket (myConnectionSocket.accept( )); // Start a thread to handle this client's sesson Thread theThread = new Thread(new EchoServerThread(myDataSocket)); theThread.start(); } //end while forever } // end try catch (Exception ex) { Cliente ex.printStackTrace( ); } // end catch } //end main } // end class
ServerThread