Resumen de Alejandro
Resumen de Alejandro
Resumen de Alejandro
Alumno: Fecha:29/03/2019
Profesor:
HILOS
En sistemas operativos, un hilo (del inglés thread), hebra (del inglés fiber),
proceso ligero o subproceso es una secuencia de tareas encadenadas muy
pequeña que puede ser ejecutada por un sistema operativo.
La destrucción de los hilos antiguos por los nuevos es una característica que
no permite a una aplicación realizar varias tareas a la vez (concurrentemente).
Los distintos hilos de ejecución comparten una serie de recursos tales como el
espacio de memoria, los archivos abiertos, la situación de autenticación, etc.
Esta técnica permite simplificar el diseño de una aplicación que debe llevar a
cabo distintas funciones simultáneamente.
Un hilo es simplemente una tarea que puede ser ejecutada al mismo tiempo
que otra tarea.
Los hilos de ejecución que comparten los mismos recursos, sumados a estos
recursos, son en conjunto conocidos como un proceso. El hecho de que los
hilos de ejecución de un mismo proceso compartan los recursos hace que
cualquiera de estos hilos pueda modificar estos recursos. Cuando un hilo
modifica un dato en la memoria, los otros hilos acceden a ese dato modificado
inmediatamente.
Los hilos se distinguen de los tradicionales procesos en que los procesos son –
generalmente– independientes, llevan bastante información de estados, e
interactúan solo a través de mecanismos de comunicación dados por el
sistema. Por otra parte, muchos hilos generalmente comparten otros recursos
de forma directa. En muchos de los sistemas operativos que dan facilidades a
los hilos, es más rápido cambiar de un hilo a otro dentro del mismo proceso,
que cambiar de un proceso a otro. Este fenómeno se debe a que los hilos
comparten datos y espacios de direcciones, mientras que los procesos, al ser
independientes, no lo hacen. Al cambiar de un proceso a otro el sistema
operativo (mediante el dispatcher) genera lo que se conoce como overhead,
que es tiempo desperdiciado por el procesador para realizar un cambio de
contexto (context switch), en este caso pasar del estado de ejecución (running)
al estado de espera (waiting) y colocar el nuevo proceso en ejecución. En los
hilos, como pertenecen a un mismo proceso, al realizar un cambio de hilo el
tiempo perdido es casi despreciable.
Al igual que los procesos, los hilos poseen un estado de ejecución y pueden
sincronizarse entre ellos para evitar problemas de compartición de recursos.
Generalmente, cada hilo tiene una tarea específica y determinada, como forma
de aumentar la eficiencia del uso del procesador.
Estados de un hilo
Cambio de estados
Creación: Cuando se crea un proceso se crea un hilo para ese proceso. Luego,
este hilo puede crear otros hilos dentro del mismo proceso, proporcionando un
puntero de instrucción y los argumentos del nuevo hilo. El hilo tendrá su
propio contexto y su propio espacio de la columna, y pasará al final de los
Listos.
Sincronización de hilos
Formas de multihilos
Sockets
Los sockets son un mecanismo que nos permite establecer un enlace entre
dos programas que se ejecutan independientes el uno del otro
(generalmente un programa cliente y un programa servidor) Java por medio
de la librería java.net nos provee dos clases: Socket para implementar la
conexión desde el lado del cliente y ServerSocket que nos permitirá
manipular la conexión desde el lado del servidor.
Como verás es un ejemplo simple, sin muchas complicaciones, así que manos
a la obra, veamos el código:
La clase Servidor
La clase Servidor básicamente estará a la espera de que un cliente se conecte
a él usando el socket en el puerto 1234, recibirá los mensajes, los mostrará y
cerrará la conexión, es todo.
Tenemos en este código entonces al servidor que espera la conexión desde el
cliente en el método accept(), una vez ésta sucede, envía un mensaje de
confirmación con writeUTF("mensaje"), lee todos los mensajes enviados por
el cliente con readLine() y cierra la conexión con el método close(). Veamos
ahora la clase Cliente
La clase Cliente
La clase Cliente, establecerá la conexión con el servidor usando un socket en
localhost y el puerto 1234, una vez establece la conexión escribe dos
mensajes en el servidor usando un ciclo for y cierra la conexión. Veamos:
Vemos entonces que el cliente obtiene el flujo de salida de datos hacia el
Servidor con el método getOutputStream y lo usa para enviarle un par de
mensajes con el método writeUTF("mensaje..."), finalmente cierra la
conexión con close(). Notar que si se desea enviar más de dos mensajes
bastará con cambiar el límite superior del ciclo for i < 100 por ejemplo.
Pues muy bien ya tenemos todo, aunque los segmentos de código con un
poco extensos (no demasiado) son bastante simples y están bien
comentados, a continuación pondré los códigos para los respectivos main
que harán uso del servidor y del cliente.