PDF de programación - Procesos

Imágen de pdf Procesos

Procesosgráfica de visualizaciones

Publicado el 09 de Enero del 2019
1.175 visualizaciones desde el 09 de Enero del 2019. Una media de 49 por semana
304,6 KB
7 paginas
Creado hace 200d (02/01/2019)
Procesos

Anexo

Aquí dejo un enlace a una página donde encontrarás toda la información de este archivo

resumida y mucha más información.

https://welcomedevelopers.es/

Autor

Simón García Viz

1.Conceptos

1.1 Programa
Un programa es el conjunto de instrucciones (líneas de código en nuestro caso) para realizar

una acción. Un ejemplo sencillo sería una receta de cocina, mientras que te dice que tienes que
hacer para realizar la comida, solo la receta no te va a llenar el plato.

1.2 Procesos
Un proceso es un programa en ejecución. Por lo tanto un proceso es un programa la

actividad del mismo. Respecto al ejemplo anterior, si el programa es la receta de cocina, el proceso
sería a la persona realizando la receta y así terminar con un plato de comida hecho.

Los procesos se ejecutan también de forma concurrente, esto significa que mientras se

ejecuta un proceso se pueden estar realizando otros procesos al mismo tiempo.
2. Procesos en Java
2.0 Curiosidad

Una cosa a tener en cuenta cuando nos iniciamos en procesos en java, es que el método main
(donde implementamos el cuerpo del programa) es un proceso en sí mismo, el cual creará todos los
subprocesos necesarios (que crearemos) para ejecutar correctamente todo el programa.

2.1 Procesos de sistema
Desde java se pueden ejecutar procesos de sistema, principalmente comandos de terminal,

hay 2 clases principalmente para llamar a estos procesos: Runtime y ProcessBuilder. Ambas clases
trabajan con la clase Process. Todas estas clases están situadas en el paquete java.lang por lo que no
hace falta importarlas al programa principal.

Hay que tener en cuenta el sistema operativo que utilicemos, en caso de windows hará falta
añadir CMD /C antes del comando para que al ejecutar la instrucción correspondiente lo vea como
un comando de terminal.
2.1.1 Process
Es una clase abstracta que instancia un objeto que controla los procesos nativos del sistema

que devuelven las clases Runtime y ProcessBuilder.

2.1.2 Runtime
En cualquier aplicación de java se instancia esta clase ya que permite interactuar a la

aplicación con el entorno en el que se encuentra ejecutándose.

Veremos un ejemplo sencillo de lanzar un comando de terminal con ésta clase:

La salida a este código es la siguiente:

En caso de usar windows el String cmd sería: “CMD /C dir”, ya que ls -l es un comando de

unix.

2.1.3 ProcessBuilder
La clase ProcessBuilder maneja los siguientes atributos del proceso: comando, entorno,

directorio de trabajo, recurso de entrada estándar, el destino de la salida estándaro redireccionar la
salida estándar de error.

Al ejecutar este código la salida va hacia el fichero output.txt al cual redirigimos la salida en

la línea 16:

2.2 Procesos propios de java
En ésta categoría entran una clase y una interfaz, Thread y Runnable respectivamente.
Cuando hablamos de procesos propios de java estaremos indicando que lo crearemos nosotros
mediante código y lo ejecutaremos de la misma forma. En ambos casos, al crear la clase tendremos
que sobreescribir el metodo run() que son las instrucciones que realizará el proceso cuando lo
inicialicemos.

2.2.1 Thread
Al tratarse de una clase extendemos nuestra clase a ésta y sobreescribimos el método run()

para que realice algo al iniciarlo. Para esto instanciamos nuestra clase en el main y llamamos al
método start(), ojo con equivocarse con esto.

Este es un ejemplo sencillo en el que el programa saca 10 “No” por pantalla mientras que el

thread que creamos saca 10 “Si”. De aquí también cabe resaltar el método sleep, que viene de la
clase Thread y recibe un numero en long que será el tiempo en milisegundos que pondrá a dormir
un proceso. Fijarse en que en el programa principal tenemos que instanciar el Thread que está
ejecutándose en este caso siempre será el main y mandarle dormir. Fijarse que los resultados se van
intercalando, lo que significa que los procesos se están ejecutando de manera concurrente. Una de
las salidas posibles sería la siguiente:

2.2.2 Runnable

Al tratarse de una interfaz hay que implementarla y despues implementar el método run(),

ahora mostraré el programa anterior hecho de esta forma:

En los anteriores códigos lo interesante es observar como llamamos el método sleep en
nuestra clase igual que en el main y no directamente como en Thread, después también hay que
fijarse en que cambia la forma de ejecutar el proceso, primeros creamos un Thread con el
constructor que contiene un Runnable y ejecutamos el Thread. Las salidas serían iguales que con la
clase Thread.

Si esto es así porque habría de utilizar la interfaz Runnable sobre la clase Thread? Pues

dependiendo de lo que quieras hacer y como esté estructurado tu programa. Hay que tener en cuenta

que en java no existe la herencia múltiple, por lo que en caso de querer implementar como un hilo a
una clase que herede de otra tendrás que utilizar la interfaz Runnable, en caso contrario podrás
utilizar la forma que más te guste.

3 Sincronización de procesos

La sincronización de procesos es necesaria cuando los procesos compiten por un recurso

compartido o cooperan entre ellos para comunicar información, normalmente de esto se encarga el
propio sistema operativo que utilicemos mediante los mecanismos de sincronización.

Al trabajar con procesos y querer sincronizarlos hay que conocer lo que son las secciones

críticas (SC): son los recursos compartidos entre los procesos en los que no pueden acceder mas de
un proceso. Sus propiedades principales son:

• Exclusión mutua: garantiza que si un proceso está dentro de la SC no vaya a entrar

ningún otro.

• No interbloqueo: ningún proceso fuera de la SC puede negar la entrada a este.

• No inanición: los procesos tienen que poder entrar en algún momento.



Independencia del hardware: no hacer suposiciones del número de procesadores o de
la velocidad relativa de los procesos.

Las formas más comunes de sincronizar procesos es mediante semáforos, monitores y

mensajes.

3.1 Semáforos
Los procesos mirarán una variable flag que se situará en la sección crítica a la que acceden y

dependiendo del valor de esta se pondran a esperar o seguirán ejecutandose. Cuando un proceso
salga de la sección crítica habrá modificado la variable y notificará a los demás procesos que
pueden entrar. Por lo que se produciría una condición de carrera que manejaría el SO.

Los semáforos son una abstracción mas general de lo anterior, en los que permite almacenar

los eventos ya producidos y despertar a un proceso en concreto. Un semáforo lleva asociado una
cola de procesos, para bloquear o despertar según sea preciso.

Los semáforos tienen dos operaciones básicas: bajar(s) – acquire() en java, subir(s) –

release() en java.

Cuando un proceso ejecuta bajar(s), la cuenta asociada a s es mayor que 0 entonces le resta 1
y ejecuta el proceso, en caso contrario se quedaría esperando hasta que s>0. Si se ejecuta subir(s), la
cuenta asociada a s aumenta en un valor, lo que permite a otro proceso entrar y ejecutarse.

3.2 Monitores
Los monitores son estructuras de un lenguaje de programación que ofrecen una

funcionalidad equivalente a la de los semáforos y que son más fáciles de controlar. Un módulo
monitor encapsula la mutua exclusión de datos y procedimientos que pueden acceder a los datos

protegidos. Los usuarios pueden hacer llamadas a estos procedimientos usando al monitor como una
tabla de estado para determinar cuando proceder y cuando suspender operaciones.

Para implementarlo en java, hay que añadir el modificador de método synchronazed a los

métodos que accedan al recurso compartido y que queramos exclusión mutua. Hay que tener
cuidado con esto porque esto afecta a todos los métodos que implementen el modificador. La forma
de solucionar esto es mediante waits y notifys.

3.3 Mensajes
Cuando se trata de intercambiar información entre distintos procesos no es posible utilizar

variables en memoria. La solución general para esto es utilizar un modelo de paso de mensajes,
básicamente es trabajar sobre una cola en la que el que envía añade elementos y el que recibe los
saca, que llamaremos buzón. La disciplina habitual a utilizar sera FIFO (first in – first out).

Existen 3 tipos de buzones según su capacidad:



Ilimitada: buzón ideal con capacidad infinita.

• Limitada: el proceso que envía puede encontrarse con el buzón lleno.

• Nula: no se puede almacenar ningún mensaje, por lo que los procesos tienen que

sinconizarse para cada comunicación, el primero que llega tiene que esperar al
segundo en el punto de comunicación. A este modelo se le conoce como rendezvous.
La ventaja que tiene este método es que no necesita ningún buffer intermedio.

Proyecto

Aquí dejo un link a github de un proyecto en el que implemento las tres formas de

sincronización de procesos en java.

Realizaré unas aclaraciones sobre el proyecto de arriba:

- Las clases waiter, cooker y client son los threads que tienen que sincronizar para el correcto
funcionamiento del programa.

- Las clases restaurant y kitchen realizan las sincronización mediante semáforos.

- La clase stacks es un monitor y también realiza la sincronización mediante mensajes con
capacidad ilimitada (al utilizar la clase LinkedList<> como recurso compartido).

- Este programa tiene un fallo de estructura que se puede arreglar de 2 formas, dejo al lector el
pensar donde está y cambiarlo en su ordenador.
  • Links de descarga
http://lwp-l.com/pdf14811

Comentarios de: Procesos (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad

Revisar política de publicidad