1. Introducción
Flashcards
- ¿Qué es la multitarea?
- La capacidad de un ordenador de ejecutar varias tareas simultáneamente.
- ¿Cuál es la diferencia entre multitarea real y simulada?
- La multitarea real tiene tantas unidades de proceso como procesos, mientras que la simulada tiene menos unidades de proceso que procesos.
- ¿Qué dos elementos son cruciales para la capacidad de multitarea de un sistema?
- El procesador (capacidad física) y el sistema operativo (capacidad lógica).
- ¿Qué es un núcleo en un procesador?
- Una unidad con capacidad de ejecución dentro de un procesador.
Preguntas tipo test
- ¿Cuál es la principal característica de la multitarea?
- a) Ejecutar varias tareas simultáneamente
- b) Ejecutar una tarea a la vez
- c) Limitar el número de procesos
- d) Utilizar un solo núcleo del procesador
Respuesta: a) Ejecutar varias tareas simultáneamente. La multitarea se define como la capacidad de un sistema para ejecutar varias tareas al mismo tiempo, independientemente del número de unidades de procesamiento disponibles.
- ¿Qué componente del ordenador tiene la capacidad física para ejecutar instrucciones de programas?
- a) El sistema operativo
- b) El procesador
- c) La memoria RAM
- d) El disco duro
Respuesta: b) El procesador. El procesador es el componente que ejecuta las instrucciones de los programas, siendo el 'cerebro' del dispositivo.
- ¿Cuál de los siguientes sistemas operativos es un ejemplo de sistema monotarea?
- a) UNIX
- b) Windows 10
- c) MS-DOS
- d) Linux
Respuesta: c) MS-DOS. MS-DOS es un ejemplo de sistema operativo monotarea, ya que solo permite ejecutar una tarea en un momento determinado.
1.1. Introducción a los sistemas multitarea
Flashcards
- ¿Qué es la multitarea?
- La capacidad de un ordenador de ejecutar varias tareas simultáneamente.
- ¿Qué es un sistema monotarea?
- Un sistema que solo puede ejecutar una tarea a la vez.
- ¿Qué dos elementos son clave para la multitarea?
- El procesador y el sistema operativo.
- ¿Qué es la computación concurrente?
- Una forma de multitarea donde los tiempos de CPU se reparten entre procesos.
Preguntas tipo test
- ¿Cuál es la principal función de la multitarea en un ordenador?
- a) Aumentar la velocidad del procesador.
- b) Ejecutar varias tareas simultáneamente.
- c) Reducir el consumo de energía.
- d) Mejorar la calidad gráfica.
Respuesta: b) Ejecutar varias tareas simultáneamente.. La multitarea permite que un ordenador ejecute varias tareas al mismo tiempo, alternando entre ellas de manera rápida.
- ¿Qué componente del ordenador proporciona la capacidad física para la multitarea?
- a) La memoria RAM.
- b) El disco duro.
- c) El procesador.
- d) La tarjeta gráfica.
Respuesta: c) El procesador.. El procesador, especialmente con múltiples núcleos, es el que tiene la capacidad física de ejecutar instrucciones de programas.
- En un sistema multitarea, ¿qué rol desempeña el sistema operativo?
- a) Proporciona la capacidad física.
- b) Gestiona la capacidad lógica.
- c) Acelera el procesador.
- d) Almacena los programas.
Respuesta: b) Gestiona la capacidad lógica.. El sistema operativo proporciona la capacidad lógica para gestionar la ejecución de múltiples tareas y asignar recursos.
1.1.2. El sistema operativo y los lenguajes de programación
Flashcards
- ¿Qué es la multitarea?
- La capacidad de un ordenador de ejecutar varias tareas simultáneamente.
- ¿Cuál es la función del sistema operativo?
- Actuar como intermediario entre los programas y el hardware del ordenador.
- ¿Qué diferencia a los lenguajes compilados de los interpretados?
- Los compilados se traducen a código binario antes de la ejecución, mientras que los interpretados se ejecutan directamente por un intérprete.
- ¿Qué es un proceso en un sistema operativo?
- Un programa en ejecución.
Preguntas tipo test
- ¿Qué componente del ordenador actúa como intermediario entre el hardware y los programas?
- a) El procesador
- b) El sistema operativo
- c) La memoria RAM
- d) El compilador
Respuesta: b) El sistema operativo. El sistema operativo es el encargado de gestionar los recursos del hardware y proporcionar una interfaz para que los programas interactúen con él.
- ¿Cuál de las siguientes clasificaciones NO se aplica a los lenguajes de programación?
- a) De bajo nivel
- b) Orientados a objetos
- c) Interpretados
- d) De diseño gráfico
Respuesta: d) De diseño gráfico. Los lenguajes de programación se clasifican comúnmente por su nivel de abstracción (bajo o alto), paradigma (orientado a objetos, estructurado) y forma de ejecución (compilado o interpretado). El diseño gráfico no es una clasificación de lenguajes de programación.
- ¿Qué característica define a los lenguajes de programación compilados?
- a) Se ejecutan directamente en cualquier sistema operativo
- b) Se traducen a código binario específico para un sistema operativo
- c) No requieren un proceso de compilación
- d) Son inherentemente más lentos que los interpretados
Respuesta: b) Se traducen a código binario específico para un sistema operativo. Los lenguajes compilados se traducen a código binario específico para un sistema operativo, lo que permite una ejecución más rápida en la plataforma de destino.
1.1.3. Programas. Ejecutables. Procesos. Servicios
Flashcards
- ¿Qué es un programa ejecutable?
- Un programa que contiene instrucciones comprensibles por el sistema operativo y que puede ser ejecutado para generar un proceso.
- ¿Qué es un proceso?
- Un programa en ejecución en el sistema operativo.
- ¿Qué es un servicio?
- Un programa que se ejecuta en segundo plano sin necesidad de interacción del usuario.
- ¿Cuál es la función del sistema operativo en la ejecución de programas?
- Coordinar el funcionamiento del hardware y software, indicando qué programas se desean ejecutar.
Preguntas tipo test
- ¿Cuál de los siguientes NO es un término directamente relacionado con la gestión de programas y su ejecución en un sistema operativo?
- a) Proceso
- b) Ejecutable
- c) Servicio
- d) Hardware
Respuesta: d) Hardware. Hardware se refiere a los componentes físicos de un ordenador, mientras que proceso, ejecutable y servicio son conceptos de software relacionados con la ejecución de programas.
- ¿Qué componente del ordenador se encarga de coordinar tanto el hardware como el software?
- a) El compilador
- b) El sistema operativo
- c) El procesador
- d) La memoria RAM
Respuesta: b) El sistema operativo. El sistema operativo actúa como intermediario entre el hardware y el software, gestionando los recursos y permitiendo la ejecución de programas.
- En el contexto de la programación, ¿qué genera un programa al ser ejecutado por un usuario?
- a) Un archivo de código fuente
- b) Un proceso en el sistema operativo
- c) Un error de compilación
- d) Una actualización del sistema
Respuesta: b) Un proceso en el sistema operativo. Cuando un programa se ejecuta, el sistema operativo crea un proceso para gestionar su ejecución y asignarle recursos.
1.1.4. Computación concurrente y paralela
Flashcards
- ¿Qué es la computación concurrente?
- Es la capacidad de un sistema de ejecutar varios procesos de manera que parecen simultáneos, aunque en realidad se turnan en el uso de la CPU.
- ¿Qué es el procesamiento paralelo?
- Es la capacidad de un sistema de ejecutar varias partes de un proceso simultáneamente en diferentes núcleos o procesadores.
- ¿De quién es responsabilidad el procesamiento concurrente?
- Del sistema operativo.
- ¿De quién es responsabilidad el procesamiento paralelo?
- Es una responsabilidad compartida entre el sistema operativo y el programa.
Preguntas tipo test
- ¿Qué tipo de computación se basa en repartir los tiempos de CPU entre los distintos procesos según una planificación del sistema operativo?
- a) Computación secuencial
- b) Computación concurrente
- c) Computación paralela
- d) Computación distribuida
Respuesta: b) Computación concurrente. La computación concurrente se basa en la gestión de los tiempos de CPU entre procesos por el sistema operativo, simulando la simultaneidad.
- ¿Cuál es la principal característica del procesamiento paralelo?
- a) Ejecutar procesos en una sola unidad de procesamiento.
- b) Dividir procesos en subtareas que se ejecutan en diferentes núcleos.
- c) Ejecutar tareas de forma secuencial.
- d) Simular la ejecución simultánea de tareas.
Respuesta: b) Dividir procesos en subtareas que se ejecutan en diferentes núcleos.. El procesamiento paralelo implica la división de procesos en subtareas que se ejecutan simultáneamente en diferentes núcleos para reducir los tiempos de ejecución.
- ¿Quién es el responsable del procesamiento concurrente?
- a) El programador
- b) El usuario
- c) El sistema operativo
- d) El hardware
Respuesta: c) El sistema operativo. El sistema operativo es responsable de gestionar el procesamiento concurrente, distribuyendo los tiempos de CPU entre los procesos.
1.1.5. Programación distribuida
Flashcards
- ¿Qué es la programación distribuida?
- Un paradigma donde la ejecución del software se distribuye entre varios ordenadores.
- ¿Cuál es una ventaja clave de la programación distribuida?
- Permite una potencia de procesamiento más elevada y escalable.
- ¿Qué se necesita para construir un sistema distribuido?
- Una red de ordenadores para distribuir el trabajo.
- ¿Cómo se define el procesamiento distribuido?
- Un proceso que se ejecuta en unidades de computación independientes conectadas y sincronizadas.
Preguntas tipo test
- ¿Cuál es la principal ventaja de la programación distribuida en comparación con la programación en un único ordenador?
- a) Mayor facilidad de depuración del código.
- b) Menor costo de desarrollo inicial.
- c) Mayor potencia de procesamiento escalable y, normalmente, más económica.
- d) Compatibilidad garantizada con todos los sistemas operativos.
Respuesta: c) Mayor potencia de procesamiento escalable y, normalmente, más económica.. La programación distribuida permite una mayor potencia de procesamiento al distribuir la carga entre varios ordenadores, lo que resulta escalable y, en muchos casos, más económico que aumentar la potencia de un solo ordenador.
- ¿Qué se requiere para construir un sistema distribuido?
- a) Un único ordenador con múltiples núcleos.
- b) Una red de ordenadores interconectados.
- c) Un sistema operativo monotarea.
- d) Un lenguaje de programación específico.
Respuesta: b) Una red de ordenadores interconectados.. Para implementar la programación distribuida, es esencial contar con una red de ordenadores que puedan colaborar y compartir la carga de trabajo.
- ¿Cuál de las siguientes NO es una característica típica de la programación distribuida?
- a) Ejecución de software distribuida entre varios ordenadores.
- b) Alta escalabilidad de la potencia de procesamiento.
- c) Dependencia de un único procesador centralizado.
- d) Potencial para ser más económica que una solución de un solo ordenador.
Respuesta: c) Dependencia de un único procesador centralizado.. La programación distribuida se caracteriza por la independencia de los nodos de procesamiento, no por la dependencia de un procesador centralizado.
1.1.6. Hilos
Flashcards
- ¿Qué es la programación multihilo?
- Técnica que permite dividir un algoritmo en varias unidades más pequeñas y ejecutarlas en paralelo.
- ¿Cómo se denominan los programas que se ejecutan en un único hilo?
- Programas monohilo.
- ¿Qué ventaja ofrecen los hilos al formar parte del mismo proceso?
- Son extremadamente económicos en referencia a los recursos que utilizan.
- ¿Qué característica deben cumplir las fracciones de programa para ejecutarse simultáneamente como hilos?
- Deben cumplir con determinadas características que permitan su ejecución en paralelo.
Preguntas tipo test
- ¿Cuál es la principal característica de la programación multihilo?
- a) Ejecutar sentencias de manera secuencial.
- b) Ejecutar fracciones de programa simultáneamente.
- c) Ejecutar un programa en un único hilo.
- d) Crear copias idénticas de un proceso.
Respuesta: b) Ejecutar fracciones de programa simultáneamente.. La programación multihilo se caracteriza por la capacidad de ejecutar fracciones de un programa simultáneamente, aprovechando el procesamiento paralelo.
- ¿Qué recurso consumen los hilos al formar parte del mismo proceso?
- a) Son costosos en términos de recursos.
- b) Son extremadamente económicos en términos de recursos.
- c) No consumen recursos.
- d) Consumen recursos de forma aleatoria.
Respuesta: b) Son extremadamente económicos en términos de recursos.. Los hilos, al formar parte del mismo proceso, son extremadamente económicos en términos de los recursos que utilizan, ya que comparten el mismo espacio de memoria y recursos del proceso padre.
- En programación, ¿cómo se denomina a un programa que se ejecuta en un único hilo?
- a) Programa multihilo.
- b) Programa bifurcado.
- c) Programa monohilo.
- d) Programa distribuido.
Respuesta: c) Programa monohilo.. Un programa que se ejecuta en un único hilo se denomina programa monohilo, en contraposición a los programas multihilo que utilizan varios hilos.
1.1.7. Bifurcación o fork
Flashcards
- ¿Qué es una bifurcación (fork) en programación?
- Una copia idéntica de un proceso.
- ¿Cómo se denominan el proceso original y su copia después de una bifurcación?
- El proceso original se denomina 'padre' y su copia 'hijo'.
- ¿Qué comparten inicialmente el proceso padre y el proceso hijo después de una bifurcación?
- El estado del proceso original (padre).
- ¿Qué identificador es diferente entre el proceso padre y el proceso hijo después de una bifurcación?
- El identificador de proceso (PID).
Preguntas tipo test
- ¿Qué ocurre con los identificadores de proceso (PID) después de una bifurcación?
- a) El proceso padre y el proceso hijo comparten el mismo PID.
- b) El proceso hijo recibe el mismo PID que el proceso padre al inicio, pero luego se actualiza.
- c) Cada proceso (padre e hijo) tiene un PID diferente.
- d) Ninguno de los procesos mantiene su PID original.
Respuesta: c) Cada proceso (padre e hijo) tiene un PID diferente.. Después de una bifurcación, tanto el proceso padre como el proceso hijo tienen identificadores de proceso (PID) diferentes. Esto permite al sistema operativo rastrear y gestionar cada proceso de forma independiente.
- ¿Qué estado comparte inicialmente el proceso hijo con el proceso padre después de una bifurcación?
- a) Solo el estado de la memoria.
- b) Solo el estado de la ejecución.
- c) El estado del proceso original (padre).
- d) Ningún estado, el hijo comienza desde cero.
Respuesta: c) El estado del proceso original (padre).. Después de una bifurcación, el proceso hijo inicialmente comparte el estado del proceso original (padre), incluyendo el estado de la memoria y el estado de la ejecución. Sin embargo, a partir de la creación, cada proceso mantiene su propio estado de memoria independiente.
- ¿Qué función del sistema operativo se utiliza comúnmente para crear una bifurcación en sistemas tipo Unix como Linux?
- a) create_process()
- b) fork()
- c) clone()
- d) new_process()
Respuesta: b) fork(). La función fork() es la llamada al sistema utilizada en sistemas tipo Unix, como Linux, para crear una bifurcación de un proceso. Esta función crea un nuevo proceso (el proceso hijo) que es una copia del proceso existente (el proceso padre).
1.2. Procesos: conceptos teóricos
Flashcards
- ¿Qué es un proceso?
- Un programa en ejecución.
- ¿Qué información clave comprende el contexto de un proceso?
- Estado del proceso, de la ejecución (registros del procesador) y de la memoria.
- ¿Qué implica el cambio de contexto?
- Guardar el estado del proceso actual, determinar el siguiente proceso, recuperar y restaurar su estado, y continuar su ejecución.
- ¿De qué es responsable el sistema operativo en la gestión de procesos?
- De mantener en ejecución simultánea varios programas o procesos, gestionando los recursos limitados.
Preguntas tipo test
- ¿Cuál de las siguientes opciones describe mejor un proceso en el contexto de la programación?
- a) Un programa en reposo almacenado en el disco duro.
- b) Un programa en ejecución que utiliza recursos del sistema.
- c) Un archivo de configuración del sistema operativo.
- d) Una biblioteca de funciones reutilizables.
Respuesta: b) Un programa en ejecución que utiliza recursos del sistema.. Un proceso es, fundamentalmente, un programa en ejecución. Esto implica que está utilizando recursos del sistema, como la CPU y la memoria, para llevar a cabo sus tareas.
- ¿Qué componente NO forma parte de la composición de un proceso?
- a) Las instrucciones que se van a ejecutar.
- b) El estado del propio proceso.
- c) El estado de la memoria.
- d) La marca y modelo del procesador.
Respuesta: d) La marca y modelo del procesador.. Un proceso está compuesto por las instrucciones a ejecutar, su estado, el estado de la memoria que utiliza, y el estado de la ejecución, pero no por las características físicas del procesador.
- ¿Qué se entiende por 'cambio de contexto' en la gestión de procesos?
- a) La modificación del código fuente de un programa en ejecución.
- b) El intercambio de información entre dos procesos diferentes.
- c) El proceso de guardar el estado de un proceso y restaurar el estado de otro.
- d) La actualización de las bibliotecas del sistema operativo.
Respuesta: c) El proceso de guardar el estado de un proceso y restaurar el estado de otro.. El cambio de contexto es el mecanismo por el cual el sistema operativo guarda el estado de un proceso que se va a interrumpir y restaura el estado de otro proceso que se va a ejecutar. Esto permite que varios procesos compartan el tiempo de la CPU.
1.2.1. Gestión y estados de los procesos
Flashcards
- ¿Qué componente del sistema operativo gestiona la convivencia entre procesos?
- El planificador de procesos.
- ¿Cuál es el objetivo principal del planificador de procesos?
- Conseguir que todos los procesos terminen lo antes posible aprovechando al máximo los recursos del sistema.
- ¿Qué implica un cambio de contexto?
- Guardar y restaurar el estado de un proceso.
- ¿Cuáles son los estados básicos de un proceso?
- Nuevo, Listo, En ejecución, Bloqueado y Finalizado.
Preguntas tipo test
- ¿Cuál es el componente del sistema operativo responsable de asignar recursos a los procesos?
- a) El compilador
- b) El intérprete
- c) El planificador de procesos
- d) La máquina virtual
Respuesta: c) El planificador de procesos. El planificador de procesos es el elemento del sistema operativo que se encarga de repartir los recursos del sistema entre los procesos que los demandan, gestionando la convivencia entre ellos.
- ¿Cuál de los siguientes NO es un objetivo del planificador de procesos?
- a) Maximizar el rendimiento del sistema
- b) Maximizar la equidad en el reparto de los recursos
- c) Maximizar los tiempos de espera
- d) Minimizar los tiempos de respuesta
Respuesta: c) Maximizar los tiempos de espera. El planificador busca minimizar, no maximizar, los tiempos de espera, junto con maximizar el rendimiento y la equidad, y minimizar los tiempos de respuesta.
- ¿Qué sugiere la analogía del planificador de procesos con el responsable del almacén de herramientas en un taller?
- a) La importancia de tener muchas herramientas disponibles
- b) La necesidad de que cada empleado tenga su propia herramienta
- c) La gestión eficiente de recursos limitados entre múltiples usuarios
- d) La asignación permanente de herramientas a los empleados
Respuesta: c) La gestión eficiente de recursos limitados entre múltiples usuarios. La analogía destaca la gestión eficiente de recursos (herramientas) limitados entre múltiples usuarios (procesos), asegurando que todos avancen en sus tareas.
1.2.2. Comunicación entre procesos
Flashcards
- ¿Qué es IPC?
- Inter-Process Communication (Comunicación entre procesos).
- Menciona dos alternativas para llevar a cabo la comunicación entre procesos.
- Utilización de sockets, flujos de entrada y salida, RPC, sistemas de persistencia, servicios proporcionados a través de internet.
- ¿Qué son los sockets?
- Mecanismos de comunicación de bajo nivel que permiten establecer canales de comunicación de bytes bidireccionales entre procesos.
- ¿Qué significa RPC?
- Remote Procedure Call (Llamada a procedimiento remoto).
Preguntas tipo test
- ¿Qué significa IPC en el contexto de la comunicación entre procesos?
- a) Internal Process Communication
- b) Inter-Process Communication
- c) Integrated Program Control
- d) Internet Protocol Connection
Respuesta: b) Inter-Process Communication. IPC significa Inter-Process Communication, que se refiere a los mecanismos que permiten la comunicación entre diferentes procesos.
- ¿Cuál de las siguientes NO es una alternativa para la comunicación entre procesos (IPC)?
- a) Utilización de Sockets
- b) Flujos de entrada y salida estándar
- c) Llamadas a Procedimiento Remoto (RPC)
- d) Creación de variables globales
Respuesta: d) Creación de variables globales. La creación de variables globales no es una forma estándar de IPC, ya que los procesos suelen tener espacios de memoria aislados.
- ¿Qué tipo de comunicación entre procesos permite establecer canales bidireccionales entre procesos alojados en distintas máquinas y programados con diferentes lenguajes?
- a) Flujos de entrada y salida
- b) Sockets
- c) RPC
- d) Sistemas de persistencia
Respuesta: b) Sockets. Los sockets permiten la comunicación bidireccional y son adecuados para la comunicación entre procesos en diferentes máquinas y con diferentes lenguajes.
1.2.3. Sincronización entre procesos
Flashcards
- ¿Qué es la sincronización entre procesos?
- La coordinación de la ejecución de múltiples procesos para asegurar el acceso ordenado a recursos compartidos.
- ¿Cuál es el propósito de un mutex?
- Proporcionar exclusión mutua, permitiendo que solo un proceso acceda a una sección crítica a la vez.
- ¿Qué problema resuelve un semáforo?
- Controla el acceso a un número limitado de recursos, evitando el acceso simultáneo excesivo.
- ¿Qué es la inanición (starvation) en la sincronización de procesos?
- Una situación en la que un proceso es bloqueado indefinidamente y no puede acceder a los recursos que necesita.
Preguntas tipo test
- ¿Cuál es el propósito principal de la sincronización entre procesos en sistemas multiproceso?
- a) Optimizar el uso de la memoria RAM.
- b) Asegurar que los procesos accedan a los recursos compartidos de manera controlada y coordinada.
- c) Acelerar la velocidad de ejecución de los procesos individuales.
- d) Reducir el consumo de energía del sistema.
Respuesta: b) Asegurar que los procesos accedan a los recursos compartidos de manera controlada y coordinada.. La sincronización entre procesos es esencial para evitar conflictos y asegurar la integridad de los datos cuando múltiples procesos acceden a recursos compartidos. Permite una gestión coordinada y controlada de estos recursos.
- ¿Qué ocurre si no se implementa la sincronización adecuada en un sistema donde múltiples procesos acceden a la misma base de datos?
- a) El sistema operativo bloqueará automáticamente el acceso concurrente.
- b) Se producirán errores de compilación en el código fuente.
- c) Se pueden producir inconsistencias en los datos y condiciones de carrera.
- d) La velocidad de acceso a la base de datos aumentará significativamente.
Respuesta: c) Se pueden producir inconsistencias en los datos y condiciones de carrera.. La falta de sincronización puede llevar a que varios procesos modifiquen los datos simultáneamente, resultando en inconsistencias y corrupción de la información almacenada en la base de datos.
- ¿Cuál de los siguientes mecanismos NO es comúnmente utilizado para la sincronización entre procesos?
- a) Semáforos.
- b) Mutex.
- c) Variables globales sin protección.
- d) Monitores.
Respuesta: c) Variables globales sin protección.. Las variables globales sin protección son una fuente común de problemas de concurrencia, ya que permiten el acceso simultáneo sin control, lo que puede resultar en condiciones de carrera y datos inconsistentes. Los semáforos, mutex y monitores son mecanismos de sincronización.
1.3. Programación de aplicaciones multiproceso en Java
Flashcards
- ¿Qué es la multitarea?
- La capacidad de un ordenador de ejecutar varias tareas (programas) al mismo tiempo, independientemente del número de unidades de procesamiento.
- ¿Cuál es la diferencia entre un programa y un proceso?
- Un programa es un conjunto de instrucciones almacenadas, mientras que un proceso es un programa en ejecución.
- ¿Qué es un 'fork' en la programación de procesos?
- Una copia idéntica de un proceso.
- ¿Qué es la computación concurrente?
- Es cuando varios procesos se ejecutan en una misma unidad de proceso de manera alterna, provocando el avance simultáneo de los mismos.
Preguntas tipo test
- ¿Cuál de las siguientes NO es una necesidad para programar un sistema basado en la ejecución de múltiples procesos?
- a) Poder arrancar un proceso y hacerle llegar los parámetros de ejecución.
- b) Poder recoger el código de finalización de ejecución para determinar si el proceso se ha ejecutado correctamente o no.
- c) Poder leer los datos generados por el proceso para su tratamiento.
- d) Poder modificar el código fuente de otros procesos.
Respuesta: d) Poder modificar el código fuente de otros procesos.. Las necesidades para programar un sistema basado en la ejecución de múltiples procesos incluyen arrancar procesos, esperar a que terminen, recoger sus códigos de finalización y leer los datos que generan. No es necesario modificar el código fuente de otros procesos para lograr la coordinación.
- ¿Qué clase de Java se utiliza para interactuar con el entorno de ejecución de una aplicación?
- a) java.lang.Process
- b) java.lang.System
- c) java.lang.Runtime
- d) java.lang.Environment
Respuesta: c) java.lang.Runtime. La clase `java.lang.Runtime` proporciona métodos para interactuar con el entorno de ejecución de la aplicación, permitiendo ejecutar procesos externos y acceder a información del sistema.
- En el contexto de la programación multiproceso, ¿qué describe mejor el término 'fork'?
- a) Un tipo de bucle en la programación concurrente.
- b) Una copia idéntica de un proceso.
- c) Un método para unir dos hilos en un programa.
- d) Una estructura de datos utilizada para la comunicación entre procesos.
Respuesta: b) Una copia idéntica de un proceso.. Un 'fork' es una copia idéntica de un proceso, creando un nuevo proceso hijo que continúa con el estado del proceso original (padre).
1.3.1. Creación de procesos con Runtime
Flashcards
- ¿Qué clase de Java permite a una aplicación interactuar con su entorno de ejecución?
- java.lang.Runtime
- ¿Qué método de la clase Runtime se utiliza para ejecutar programas externos?
- exec()
- ¿Qué representa la clase Process en Java?
- Un proceso en ejecución
- ¿Qué método de la clase Process permite esperar a que un proceso termine?
- waitFor()
Preguntas tipo test
- ¿Cuál de las siguientes NO es una necesidad para programar un sistema basado en la ejecución de múltiples procesos?
- a) Poder arrancar un proceso y hacerle llegar los parámetros de ejecución.
- b) Poder quedar a la espera de que el proceso termine.
- c) Poder modificar el código fuente del proceso en tiempo real.
- d) Poder leer los datos generados por el proceso para su tratamiento.
Respuesta: c) Poder modificar el código fuente del proceso en tiempo real.. Modificar el código fuente en tiempo real no es una necesidad básica para la programación multiproceso. Las otras opciones son esenciales para la gestión y coordinación de procesos.
- ¿Qué clase de Java se utiliza para interactuar con el entorno de ejecución?
- a) java.lang.ProcessBuilder
- b) java.lang.Runtime
- c) java.io.File
- d) java.util.concurrent.Executor
Respuesta: b) java.lang.Runtime. La clase `java.lang.Runtime` proporciona métodos para interactuar con el entorno de ejecución, permitiendo a la aplicación ejecutar comandos del sistema operativo.
- ¿Cuál es la función del método `exec` de la clase `Runtime`?
- a) Crear una nueva instancia de la clase Runtime.
- b) Establecer la prioridad de un proceso.
- c) Ejecutar un programa externo o comando del sistema operativo.
- d) Gestionar la memoria utilizada por un proceso.
Respuesta: c) Ejecutar un programa externo o comando del sistema operativo.. El método `exec` de la clase `Runtime` se utiliza para ejecutar un programa externo o comando del sistema operativo desde una aplicación Java.
1.3.2. Creación de procesos con ProcessBuilder
Flashcards
- ¿Qué clase en Java se utiliza para crear procesos?
- `ProcessBuilder`
- ¿Qué método inicia la ejecución de un proceso creado con `ProcessBuilder`?
- `start()`
- ¿Qué tipo de parámetros puede recibir el constructor de `ProcessBuilder`?
- El nombre del ejecutable y argumentos para el proceso.
- ¿Qué retorna el método `start()` de `ProcessBuilder`?
- Un objeto `Process` para gestionar el proceso.
Preguntas tipo test
- ¿Cuál es la función principal de la clase `ProcessBuilder`?
- a) Gestionar la memoria del sistema.
- b) Crear nuevos procesos.
- c) Modificar el sistema operativo.
- d) Optimizar el rendimiento del hardware.
Respuesta: b) Crear nuevos procesos.. La clase `ProcessBuilder` se utiliza para crear procesos, similar a la clase `Runtime`, permitiendo la ejecución de programas externos desde Java.
- ¿Qué ocurre al crear un proceso con `ProcessBuilder`?
- a) El proceso se ejecuta inmediatamente.
- b) Se define el programa a ejecutar, pero no se inicia.
- c) Se asigna memoria para el proceso.
- d) Se establece la prioridad del proceso.
Respuesta: b) Se define el programa a ejecutar, pero no se inicia.. Al crear un proceso con `ProcessBuilder`, se especifica el programa a ejecutar, pero la ejecución real se realiza al invocar el método `start()`.
- ¿Qué permite el método `start()` de la clase `ProcessBuilder`?
- a) Finalizar la ejecución del proceso.
- b) Iniciar la ejecución del proceso.
- c) Modificar los parámetros del proceso.
- d) Consultar el estado del proceso.
Respuesta: b) Iniciar la ejecución del proceso.. El método `start()` es el encargado de iniciar la ejecución del proceso definido mediante `ProcessBuilder`.
Actividades de comprobación
Flashcards
- ¿Qué es la multitarea?
- La capacidad de ejecutar varios programas simultáneamente.
- ¿Cuál es la diferencia entre concurrencia y paralelismo?
- La concurrencia es la simulación de la ejecución simultánea, mientras que el paralelismo es la ejecución simultánea real.
- ¿Qué es un proceso?
- Un programa en ejecución.
- ¿Qué es un hilo?
- Una fracción de un programa que puede ejecutarse simultáneamente.
Preguntas tipo test
- ¿Cuál de los siguientes sistemas operativos es un ejemplo de sistema monotarea?
- a) Unix
- b) Linux
- c) Windows 10
- d) MS-DOS
Respuesta: d) MS-DOS. MS-DOS es un sistema operativo que solo permite ejecutar una tarea a la vez, lo que lo convierte en un sistema monotarea.
- En el contexto de la computación, ¿qué define la multitarea?
- a) La capacidad de ejecutar tareas complejas
- b) La capacidad de ejecutar un programa tras otro
- c) La capacidad de realizar tareas sincronizadas
- d) La capacidad de ejecutar varios programas simultáneamente
Respuesta: d) La capacidad de ejecutar varios programas simultáneamente. La multitarea se refiere a la capacidad de un sistema para ejecutar varios programas o tareas al mismo tiempo.
- ¿Qué componente del ordenador es el responsable de gestionar la multitarea?
- a) El lenguaje de programación
- b) El sistema operativo
- c) El sistema de archivos
- d) La BIOS
Respuesta: b) El sistema operativo. El sistema operativo es el encargado de gestionar la multitarea, asignando recursos y tiempo de procesamiento a cada tarea.
Y 16 flashcards y 32 preguntas más en el documento.
Texto del documento
Programación multiproceso UNIDAD 1 Objetivos Descubrir los sistemas multitarea y sus múltiples variantes. Enumerar los elementos participantes en los sistemas multitarea. Conocer el funcionamiento básico del sistema operativo en lo referente a la gestión de las tareas. Profundizar en el conocimiento de los procesos, incluidos sus mecanismos de sincronización y de comunicación. Aprender a realizar aplicaciones multitarea en varias de sus alternativas. Contenidos 1.1. Introducción a los sistemas multitarea 1.2. Procesos: conceptos teóricos 1.3. Programación de aplicaciones multiplataforma en Java INFORMÁTICAYCOMUNICACIONES 2 © Ediciones Paraninfo 1.
PROGRAMACIÓN MULTIPROCESO Introducción Los ordenadores son capaces de realizar muchas tareas de manera simultánea, pese a que el número de procesadores que tienen no es muy alto habitualmente. En parte es un engaño, ya que las tareas se van ejecutando por turnos, pero a tal velocidad que el ojo humano no es capaz de apreciar las ínfimas discontinuidades en la ejecución. En otras ocasiones, en cambio, el procesamiento es realmente simultáneo. Los proce- sadores modernos tienen varios núcleos de ejecución que funcionan como procesado- res de facto.
Cada núcleo es capaz de ejecutar una instrucción en un instante dado, por lo que se podrán ejecutar a la vez tantas instrucciones como núcleos de manera real. También existe la posibilidad de utilizar varios ordenadores y construir una red en la que los elementos se distribuyan el trabajo para hacer bueno aquello de «la unión hace la fuerza». Varios procesadores con distintos núcleos trabajan a la vez resolviendo diversos procesos de manera simultánea. Son muchos los términos, las posibilidades, las dificultades y sus correspondientes soluciones que orbitan alrededor de toda la tecnología relacionada con el procesa- miento y la programación multiproceso.
En esta unidad se presentan las bases de la programación multiproceso para comprender el funcionamiento de esta área de la computación. 1.1. Introducciónalossistemasmultitarea Un ordenador actual de potencia media con un procesador con cuatro núcleos y correc- tamente configurado es capaz de realizar simultáneamente varias tareas. Por ejemplo, puede reproducir un fichero de sonido, imprimir un documento, descargar un programa de internet, recibir un correo electrónico, actualizar el sistema operativo y monitorizar la temperatura de la CPU. Este hecho sugiere una pregunta, ¿cómo puede un ordenador ejecutar a la vez más tareas que el número de unidades de proceso que tiene disponi- bles?
La respuesta es gracias a la multitarea, que es la capacidad de ejecutar varias ta- reas simultáneamente por parte de un computador. Los primeros ordenadores domésticos eran muy limitados y algunos sistemas operativos reflejaban de forma evidente esa limitación: o se estaba editando un documento de tex- to, o ejecutando un programa que realizaba un cálculo o jugando a un videojuego. Solo permitían hacer una tarea en un momento determinado. Estos sistemas se denominan monotarea y el sistema operativo MS-DOS, publicado en 1981, sería uno de sus princi- pales ejemplos.
No obstante, esa fecha no debe ser una referencia del paso de la mo- notarea a la multitarea, ya que sistemas como UNIX, desarrollado varios años antes, ya contemplaban la multitarea. INFORMÁTICAYCOMUNICACIONES 3 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO Figura 1.1. Los antiguos sistemas monotarea no permitían ejecutar más de un programa a la vez. La multitarea es, por lo tanto, la capacidad que tienen los ordenadores de realizar va- rias tareas (ejecutar varios programas) al mismo tiempo, independientemente del núme- ro de elementos de procesamiento.
Esta multitarea puede ser real (hay tantas unidades de proceso como procesos a ejecutar) o simulada (hay menos unidades de proceso que procesos a ejecutar). La capacidad de realizar multitarea de un sistema depende principalmente del procesador y del sistema operativo. El primero tiene la capacidad física y el segundo, la capacidad ló- gica.
Curiosamente, unas determinadas características del sistema operativo son necesa- rias para que exista multitarea mientras que las necesidades del procesador son menos restrictivas: un procesador simple con un sistema operativo adecuado puede disponer de multitarea; un procesador con múltiples núcleos con un sistema operativo inadecuado no aprovechará los recursos disponibles. Alrededor de la multitarea existe una serie de conceptos que, en ocasiones, provocan confusión, ya que la frontera que los delimita es difusa. Concurrencia, paralelismo, proce- so o hilo son algunos de los términos cuyo significado es fundamental explicar para com- prender esta interesante disciplina de la computación.
1.1.1.Elprocesador Uno de los elementos más importante de un ordenador (o de un teléfono móvil, o de una videoconsola...) es el procesador. Este componente es el que proporciona la capacidad de ejecutar las instrucciones de los programas. Es «el cerebro» del dispositivo. Existen muchos modelos de procesador, tantos como necesidades de capacidad, ta- maño y coste. Desde el legendario Zilog Z80A de los ordenadores Sinclair ZX Spectrum de los años ochenta del siglo XX hasta los modernos Intel Core i9, por citar solo dos INFORMÁTICAYCOMUNICACIONES 4 © Ediciones Paraninfo 1.
PROGRAMACIÓN MULTIPROCESO ejemplos representativos, ha habido un salto en potencia, gestión energética y reducción de tamaño inimaginable hace años. También es llamativo el incremento en el número de núcleos y su impacto en la multitarea. Un núcleo es una unidad con capacidad de ejecución dentro de un procesador. En un sis- tema con un procesador y cuatro núcleos se pueden ejecutar cuatro instrucciones simultá- neamente. Esto no significa que se disponga de cuatros procesadores, pero sí que se tiene mucha más capacidad de procesamiento simultáneo. Obviamente, no todos los procesadores son iguales.
Sin ir a los extremos más distantes, se pueden comparar los procesadores Intel i486 SX de 33 MHz y un solo núcleo con los Intel Core i7 de más de 2 GHz en su modelos más sencillos y cuatro núcleos. Los resul- tados de dicha comparación evidencian las diferencias entre distintos procesadores. Actividad propuesta 1.1 Comparación de procesadores Compara algún procesador de la familia Intel 486 o i486 y alguno de la familia Intel Core i3, i5 o i7. Examina parámetros como la velocidad, el número de bits y el número de nú- cleos. Intenta comparar los precios actualizados de unos y otros. ¿Significa todo esto que un procesador con un único núcleo no puede realizar multita- rea? La respuesta es no.
De hecho, el procesamiento multitarea existe en sistemas ope- rativos que se ejecutan sobre arquitecturas que disponen de un solo procesador con un único núcleo. Figura 1.2. Los antiguos procesadores solo disponían de un núcleo, pero permitían la multitarea. Cualquier procesador puede, potencialmente, ejecutar varias tareas y que parezca que las realiza todas simultáneamente. El «truco» consiste en dedicar una pequeña porción de tiempo de ejecución a cada una, de tal manera que no se aprecie el cambio entre tarea (denominado cambio de contexto). Si el ordenador es suficientemente rápido se INFORMÁTICAYCOMUNICACIONES 5 © Ediciones Paraninfo 1.
PROGRAMACIÓN MULTIPROCESO producirá una «ilusión» de ejecución simultánea. La realidad es que todas las tareas avanzan sin tener que esperar unas a que las otras terminen, pero en un instante dado solo alguna de ellas está realmente en ejecución. Un procesador con varios núcleos, o un sistema basado en varios procesadores, podrá realizar una ejecución simultánea real, pero nunca será capaz de ejecutar más operacio- nes concurrentes que el número de unidades de procesamiento disponible. 1.1.2.Elsistemaoperativoyloslenguajesdeprogramación Un ordenador, para funcionar y ser útil, además del propio hardware necesita disponer de un sistema operativo y de programas.
Se puede crear una analogía entre un sistema com- putacional y una orquesta: el hardware es el auditorio y los instrumentos; el sistema ope- rativo, el director y los programas, los músicos. Todo es necesario, ya que si falta alguna de las partes el resto no tiene utilidad. Figura 1.3. El sistema operativo es el director de orquesta de un computador. El sistema operativo hace de intermediario entre los programas y el hardware del orde- nador. Cuando se pulsa una tecla del teclado o se mueve el ratón, es el sistema opera- tivo quien detecta el evento y hace posible su gestión. Cuando se accede a una variable en un programa, es el sistema operativo quien va a la memoria RAM a buscar su va- lor.
Cuando se almacena un fichero en un disco duro mecánico, es el sistema operativo quien mueve el motor y desplaza las cabezas lectoras. Un programador medianamente experimentado sabe capturar las pulsaciones del tecla- do, utilizar variables (de lo contrario no sería un programador) y guardar un fichero en un disco duro, pero puede no saber cómo funciona internamente ninguno de los elemen- tos de hardware involucrados. ¿Se puede programar algo que no se sabe muy bien cómo funciona? En la mayoría de los casos la respuesta es afirmativa. INFORMÁTICAYCOMUNICACIONES 6 © Ediciones Paraninfo 1.
PROGRAMACIÓN MULTIPROCESO Cuando se va a crear un programa informático, una de las decisiones más importantes que se debe tomar consiste en elegir el lenguaje de programación en el que se va a escribir. Existen muchos lenguajes de programación, cada uno con sus particularidades. Hay len- guajes adaptados a un tipo de temática concreta como puede ser Fortran a las matemá- ticas o de vocación más general como C++. También hay lenguajes orientados a objetos como Java y otros que siguen el paradigma de la programación estructurada como C. Otra clasificación divide a los lenguajes de programación en lenguajes de bajo nivel, como ensamblador, y de alto nivel, como Kotlin. Sabías que...
Las clasifi caciones de los lenguajes de programación no son estancas, sino que conviven entre sí. Por ejemplo, Java es un lenguaje de alto nivel, de propósito general y orientado a objetos. Hay varias clasificaciones entre las que los lenguajes se distribuyen según correspon- de, pero en lo que compete a esta unidad, la clasificación que resulta de interés es la que divide a los lenguajes de programación en compilados e interpretados, debido a que su pertenencia a uno o a otro grupo determina cómo son enviados al sistema operativo para su ejecución.
En los lenguajes de programación compilados, el código fuente se «traduce» a código bina- rio que es el que entiende el sistema operativo para el que se está realizando la compila- ción. El resultado del proceso de compilación es un programa ejecutable solamente en el sistema operativo de destino y en la versión correspondiente (y quizás en distintas versio- nes si estas son compatibles a nivel binario). Una compilación realizada para Windows 11 no será ejecutable en un ordenador con sistema operativo Ubuntu 21, y viceversa. A cam- bio de esta restricción, el programa ejecutable, al estar optimizado para la plataforma de destino, se ejecutará de manera más rápida.
A pesar de todo, si el lenguaje es estándar, en muchas ocasiones el mismo código fuente puede ser compilado para distintos sistemas sin necesitar modificaciones. C y C++ son dos claros ejemplos de lenguajes compilados. Figura 1.4. El código binario es comprensible solo para la plataforma para la que se compiló. INFORMÁTICAYCOMUNICACIONES 7 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO En el otro lado de la balanza se encuentran los lenguajes interpretados. Los programas escritos en lenguajes interpretados no se compilan para generar un programa binario ejecutable directamente sobre el sistema operativo.
Este tipo de programa se ejecuta por parte de otro programa llamado intérprete, que sí está programado para un sistema operativo concreto. La principal ventaja es que, al no tener que realizar proceso de compilación, el mismo código fuente se puede llevar a cualquier ordenador que tenga instalado el intérprete, in- dependientemente del sistema operativo instalado. Las desventajas más evidentes son la necesidad de disponer del intérprete instalado en el sistema de destino y que el proceso de «traducción» del programa a las instrucciones que entiende el sistema operativo supondrán una pequeña pérdida de velocidad, que en algunas ocasiones podrá no ser asumible.
PHP o Python son dos buenos ejemplos de este tipo de lenguaje. Existe, además, un punto intermedio entre los lenguajes compilados e interpretados y su máximo exponente es Java. Java es un lenguaje de programación compilado, pero en lugar de realizarse la compilación para un sistema operativo real se efectúa para un «sistema operativo virtual», la conocida como JVM o Java Virtual Machine. Es la JVM la encargada de traducir el código compilado en Java al lenguaje del sistema operativo du- rante la ejecución de los programas.
Por lo tanto, el escenario es parecido al de los len- guajes de programación interpretados, ya que se requiere tener la máquina virtual de Java instalada y la traducción en ejecución ralentizará algo los programas. En cambio, se dispone de programas multiplataforma que se ejecutan en un entorno seguro y controla- do como es la JVM. Dadas, por lo tanto, estas dos opciones (más la intermedia abanderada por la máquina virtual de Java) a la hora de escribir un programa, se debe saber cómo se relacionan es- tos con el sistema operativo.
Todos ellos tienen un punto de partida común, el código fuente, que está formado por las líneas de código escritas por el programador, siendo a partir de este donde comienza la relación con el sistema operativo. En los lenguajes compilados, el proceso de compilación transforma el código fuente en un código ejecutable. El código obtenido es directamente ejecutable sobre el sistema operativo de destino. En los lenguajes interpretados, el código fuente se procesa en el momento de la ejecu- ción, por lo que no existe un código ejecutable como tal. Sabías que...
Aunque los lenguajes interpretados no generan un código ejecutable, disponen de técnicas de optimización que permiten que en sucesivas ejecuciones algunas de las fases del análisis del código no se repitan, agilizando dichas ejecuciones. INFORMÁTICAYCOMUNICACIONES 8 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO 1.1.3.Programas.Ejecutables.Procesos.Servicios Programa, proceso, ejecutable y servicio son términos que hacen referencia a elementos distintos, pero íntimamente relacionados. Es necesario comprender las particularidades de cada uno de ellos para poder avanzar en el conocimiento de la programación multiproceso.
El sistema operativo es el elemento del ordenador que coordina el funcionamiento del resto de componentes de este, tanto software como hardware. Es a él a quien se indica qué se quiere hacer o, siendo más precisos, qué programas se desean ejecutar. Figura 1.5. El sistema operativo coordina tanto el hardware como el software. Para llegar a poder ejecutar un programa primero hay que obtenerlo o, en el caso de los programadores, crearlo, para posteriormente proceder a su ejecución. El proceso de crea- ción por parte del programador y de ejecución por parte del usuario final de un programa compilado es el siguiente: 1.
El programador escribe el código fuente con un editor de texto y lo almacena en un fichero. 2. El programador compila el código fuente utilizando un compilador, generando un programa ejecutable. Este programa contiene instrucciones comprensibles por el sistema operativo para el cual se realizó la compilación. 3. El usuario ejecuta el programa ejecutable, generando un proceso. Por lo tanto, se puede afirmar que un programa, al ser ejecutado por un usuario, gene- ra un proceso en el sistema operativo: un proceso es un programa mientras se encuen- tra en ejecución.
Por su parte, un servicio es también un programa cuya ejecución se realiza en segundo plano y que no requiere la interacción del usuario. Normalmente, se arranca de manera au- tomática por el sistema operativo y está en constante ejecución. Todos los sistemas operativos modernos distinguen entre procesos y servicios, aunque en esta unidad se pondrá el foco en los primeros. INFORMÁTICAYCOMUNICACIONES 9 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO En la Figura 1.6 se puede observar el Administrador de tareas de Windows 10.
En la pes- taña «Procesos» se muestran las aplicaciones que están en ejecución, junto con su PID (identificador de proceso) y datos relacionados con el consumo de recursos. El proceso identificado con el PID 3548 se corresponde con una instancia del programa Microsoft Word. Figura 1.6. El Administrador de tareas de Windows permite examinar los procesos en ejecución. En Unix y sus derivados, el comando ps (process status) muestra, con distinto nivel de detalle, información sobre los procesos que están en ejecución en un momento determi- nado, incluyendo también su identificador de proceso (PID). En Windows se puede ejecu- tar este comando desde la consola PowerShell.
En la Figura 1.7 se muestra el listado de procesos de un sistema Linux. El proceso iden- tificado con el PID 112 se corresponde con un programa escrito en C con el nombre «ho- lamundo». Figura 1.7. El comando ps de Linux muestra los procesos. INFORMÁTICAYCOMUNICACIONES 10 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO Es interesante reseñar que cuando el programa que se ejecuta no es compilado, el pro- ceso que se arranca no es el propio programa, sino el del intérprete (como en Python) o el de la máquina virtual (como en Java). En ambos casos el nombre del proceso no coin- cidirá con el nombre del programa.
En la captura del listado de procesos de Ubuntu (Figura 1.8) se puede observar que es- tán conviviendo tres procesos correspondientes a tres programas de distintas natura- lezas: un programa escrito en C con PID 112, otro escrito en Python con PID 667 y un último escrito en Java con PID 4784. En estos dos últimos no se observa el nombre del programa que se está ejecutando, sino el nombre del intérprete en el caso de Python y el de la máquina virtual en el caso de Java, ya que dentro de estos procesos es donde se ejecutan los programas correspondientes. Figura 1.8. Los procesos tienen como nombre el del programa ejecutado.
Como se ha comentado anteriormente, el número de procesos que puede estar convi- viendo en un sistema es alto y muy superior al número de núcleos de ejecución. Es el sistema operativo el encargado de conseguir que sea posible repartir los limitados recur- sos del ordenador de forma ordenada, justa y eficiente. Actividad propuesta 1.2 Destrucción de proceso de terminal Abre un editor de texto y destruye el proceso desde un terminal con el comando kill a par- tir de su PID. En Windows es posible ejecutar dicho comando desde la consola PowerShell.
1.1.4.Computaciónconcurrenteyparalela Salvo los sistemas más antiguos, sencillos o limitados, como MS-DOS o los embebidos en las placas de desarrollo Arduino, todos los sistemas operativos modernos disponen de la capacidad de realizar multitarea o multiproceso. La multitarea, como indica su nombre, es la capacidad de realizar varias tareas simultá- neamente, frente a la restricción de la monotarea, en donde las tareas se ejecutan una detrás de otra. Cuando se trabaja en un sistema multitarea, varias tareas avanzan a la vez, aunque pueden hacerlo de diferentes maneras. INFORMÁTICAYCOMUNICACIONES 11 © Ediciones Paraninfo 1.
PROGRAMACIÓN MULTIPROCESO Un sistema basado en un único procesador con un único núcleo es capaz de realizar multitarea mediante el uso de la concurrencia. En la computación concurrente, los tiem- pos de CPU se reparten entre los distintos procesos según una planificación dirigida por el sistema operativo. Si la CPU es suficientemente rápida, el número de procesos limita- do y el planificador tienen un buen diseño, todas las tareas avanzarán a la vez (aparente- mente) pese a que en un ciclo de CPU en un momento dado solo se puede ejecutar una instrucción. En una unidad de tiempo de computación solo avanza un proceso.
La veloci- dad en la asignación de la CPU a los distintos procesos logra que no se perciba el cam- bio, pero, aunque este se apreciase, seguiría siendo multitarea, ya que todas las tareas avanzan sin tener que esperar unas a que las otras terminen. Este tipo de computación se denomina concurrente. Los sistemas basados en varios procesadores o en procesadores de varios núcleos aportan una mejora sustancial: permiten ejecutar varias instrucciones en un único ciclo de reloj. Esta capacidad hace posible ejecutar en paralelo varias instrucciones, lo que da origen al término procesamiento paralelo.
En este tipo de procesamiento, los procesos se dividen en pequeñas subtareas (hilos) que se ejecutan en los diferentes núcleos, con- siguiendo una reducción en los tiempos de ejecución de los procesos. Figura 1.9. El paralelismo optimiza el uso de los recursos de computación. Como resumen, se pueden definir los conceptos de procesamiento concurrente y parale- lo de la siguiente manera: Procesamiento concurrente. Es aquel en el que varios procesos se ejecutan en una misma unidad de proceso de manera alterna, provocando el avance simultáneo de los mismos y evitando la secuencialidad. Procesamiento paralelo.
Es aquel en el que divisiones de un proceso se ejecutan de manera simultánea en los diversos núcleos de ejecución de un procesador o en diversos procesadores. Se puede, para finalizar, concluir que el procesamiento concurrente es responsabilidad del sistema operativo mientras que el procesamiento paralelo es una responsabilidad compar- tida entre el sistema operativo y el programa. INFORMÁTICAYCOMUNICACIONES 12 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO 1.1.5.Programacióndistribuida La programación distribuida es otro de los paradigmas de la programación multiproce- so.
En este tipo de arquitectura, la ejecución del software se distribuye entre varios or- denadores, consiguiendo así disponer de una potencia de procesamiento mucho más elevada, escalable y, normalmente, económica. Si en un único ordenador el número de núcleos viene determinado por el procesador que se está utilizando y es inmutable, en un sistema distribuido se elimina dicha restricción. Para construir un sistema distribuido se requiere una red de ordenadores entre los que distribuir el trabajo.
No todas las tareas son susceptibles de distribuirse ni en todos los casos se obtendrá beneficio respecto de una ejecución convencional, pero en el caso en el que la ventaja es posible, estos tipos de sistemas son altamente eficientes y no re- quieren de una inversión tan elevada como la resultante de conseguir la misma potencia de cálculo con un único ordenador. Se puede definir el procesamiento distribuido como aquel en el que un proceso se ejecu- ta en unidades de computación independientes conectadas y sincronizadas.
1.1.6.Hilos Un programa básico está compuesto por una serie de sentencias que se ejecutan de ma- nera secuencial y síncrona: hasta que no se completa la ejecución de la primera de las sentencias no se comienza con la ejecución de la segunda, y así sucesivamente hasta terminar la ejecución del programa completo. En muchos casos, es necesaria esta secuencialidad y sincronía, ya que los diferentes pasos del algoritmo programado son dependientes entre sí y no existe la posibilidad de invertir el orden de ejecución sin generar un resultado del proceso erróneo.
En otros ca- sos, en cambio, un algoritmo podría trocearse en varias unidades más pequeñas, ejecu- tar cada una de ellas por separado y en paralelo, juntar los resultados sin que importe el orden en que se obtengan y generar el resultado final. Esta técnica se conoce como pro- gramación multihilo. Los hilos de ejecución son fracciones de programa que, si cumplen con determinadas características, pueden ejecutarse simultáneamente gracias al procesamiento paralelo. Al formar parte del mismo proceso son extremadamente económicos en referencia a los recursos que utilizan.
Los programas que se ejecutan en un único hilo se denominan programas monohilo, mientras que los que se ejecutan en varios hilos se conocen como programas multihilo. 1.1.7.Bifurcaciónofork Una bifurcación, referenciada habitualmente por su término en inglés fork, es una copia idéntica de un proceso. El proceso original se denomina «padre» y sus copias, «hijos», te- niendo todos ellos diferentes identificadores de proceso (PID). La copia creada continúa INFORMÁTICAYCOMUNICACIONES 13 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO con el estado del proceso original (padre), pero a partir de la creación cada proceso mantiene su propio estado de memoria.
En el siguiente código se realiza la creación de un fork de un proceso escrito en lenguaje C y ejecutándose en un sistema Linux. 1. #include <stdio.h> 2. #include <unistd.h> 3. #include <sys/types.h> 4. int main(void) { 5. int contador=0; 6. printf("Comenzando la ejecución\n"); 7. pid_t idHijo; 8. pid_t idPadre; 9. idPadre = getpid(); 10. printf("Antes de bifurcar\n"); 11. contador++; 12. idHijo = fork(); 13. contador++; 14. printf("Después de bifurcar\n"); 15. if (idHijo == 0) { 16. printf("Id. hijo:%ld Id. padre:%ld Contador:%d \n ", (long)getpid(), (long)idPadre, contador); 17. } else { 18. printf("Id. padre:%ld Id. hijo:%ld Contador:%d \n", (long)getpid(), (long)idPadre, contador); 19.
} 20. return 0; 21. } La salida generada por la ejecución es la siguiente: 1 Comenzando la ejecución 2 Antes de bifurcar 3 Después de bifurcar 4 Después de bifurcar 5 Id. padre:143 Id. hijo:143 Contador:2 6 Id. hijo:144 Id. padre:143 Contador:2 Sin entrar en detalles sintácticos sobre el lenguaje C, los aspectos relevantes de la crea- ción de la bifurcación son los siguientes: La variable contador se declara e inicializa a 0 en la línea 5. En la línea 6 se muestra el texto «Comenzando la ejecución» una única vez, ya que en este punto el proceso es único. En la línea 10 se muestra el texto «Antes de bifurcar» una única vez, ya que en este punto el proceso es único.
En la línea 11 el valor de contador se incrementa en 1, tomando el valor 1. En la línea 12 se crea la bifurcación. INFORMÁTICAYCOMUNICACIONES 14 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO En la línea 13 el valor de contador se incrementa en 1, una vez por cada proceso. No obstante, cada proceso dispone de su propio espacio de memoria por lo que la variable de ambos procesos es distinta. En la línea 14 se muestra el texto «Después de bifurcar» dos veces, una por cada copia del proceso. En la línea 16 se muestra la información referente al proceso hijo. Se puede obser- var que el PID es 144 y el valor de la variable contador es 2.
En la línea 18 se muestra la información referente al proceso padre. Se puede ob- servar que el PID es 143 y el valor de la variable contador es 2. Sabías que... En Java existe el framework Fork/Join desde la versión 7. Proporciona herramientas para aprovechar los núcleos del sistema operativo y realizar procesamiento paralelo. 1.2. Procesos:conceptosteóricos De manera simplificada, se puede definir un proceso como un programa en ejecución. Al- gunos ejemplos de proceso podrían ser las instancias de un navegador web, de un pro- cesador de textos, de un entorno de desarrollo o de una máquina virtual de Java. Cada proceso está compuesto por: Las instrucciones que se van a ejecutar.
El estado del propio proceso. El estado de la ejecución, principalmente recogido en los registros del procesador. El estado de la memoria. Los procesos están constantemente entrando y saliendo del procesador. Se denomina contexto a toda la información que determina el estado de un proceso en un instante dado. Es una especie de fotografía que permite quitar al proceso del procesador y res- taurarlo en otro momento en el mismo estado en el que se encontraba. Sacar a un proceso del procesador para meter a otro se conoce como cambio de contex- to.
Un cambio de contexto implica capturar el estado de la CPU y de sus registros, de la memoria y de la propia ejecución del proceso saliente para restaurar la información equi- valente del proceso entrante y poder continuar en el punto en el que este último abando- nó el procesador en el cambio de contexto anterior. Lógicamente, el cambio de contexto implica un consumo de recursos y en circunstancias extremas y con un planificador mal diseñado, el sistema podría estar constantemente realizando cambios de contexto sin que los procesos implicados avanzasen en la ejecución.
Los pasos que se han de realizar para llevar a cabo un cambio de contexto se pueden resumir en los siguientes: INFORMÁTICAYCOMUNICACIONES 15 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO Guardar el estado del proceso actual. Determinar el siguiente proceso que se va a ejecutar. Recuperar y restaurar el estado del siguiente proceso. Continuar con la ejecución del siguiente proceso. Es el sistema operativo el encargado de la gestión de los procesos, quedando en la res- ponsabilidad del programador el crear los programas que van a dar lugar a los procesos y en manos de los usuarios ejecutarlos.
1.2.1.Gestiónyestadosdelosprocesos En la actualidad, prácticamente todos los sistemas de computación (ordenadores, teléfo- nos móviles inteligentes —smartphones—, tabletas, relojes inteligentes —smartwatches—, videoconsolas, etc.) son multiproceso, por lo que tienen la capacidad de mantener en eje- cución simultánea varios programas o procesos. Normalmente, el número de estos es mucho mayor que el número de núcleos de ejecución que hay disponibles en el procesa- dor o procesadores que tenga el dispositivo. Los procesos necesitan recursos y estos son limitados. El procesador, la memoria, el acceso a los sistemas de almacenamiento o a los diferentes dispositivos son algunos de ellos.
La pregunta que surge como consecuencia de esta afirmación es la siguiente: ¿cómo se consigue que la convivencia entre los procesos, que compiten entre sí por los limitados recursos del sistema de computación, sea posible? La respuesta está en el sistema operativo y, más concretamente, en elplanificador de procesos. Figura 1.10. El sistema operativo se encarga de gestionar la convivencia de los procesos. El planificador de procesos es el elemento del sistema operativo que se encarga de re- partir los recursos del sistema entre los procesos que los demandan.
De hecho, es uno de sus componentes fundamentales, ya que determina la calidad del multiproceso del sistema y, como consecuencia, la eficiencia en el aprovechamiento de los recursos. Los objetivos del planificador son los siguientes: Maximizar el rendimiento del sistema. Maximizar la equidad en el reparto de los recursos. Minimizar los tiempos de espera. Minimizar los tiempos de respuesta. INFORMÁTICAYCOMUNICACIONES 16 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO Se puede sintetizar que el objetivo del planificador es conseguir que todos los procesos terminen lo antes posible aprovechando al máximo los recursos del sistema. La tarea, como se puede suponer, es compleja.
Es posible imaginar al planificador como el responsable del almacén de las herramien- tas de un taller. El número de herramientas es limitado y mucho menor que el núme- ro de empleados que las necesitan para realizar su trabajo. El responsable del almacén debe satisfacer los siguientes requisitos: Todos los empleados tienen acceso a las herramientas para poder realizar su tra- bajo. Todos los empleados deben tener acceso a las herramientas durante aproximada- mente la misma cantidad de tiempo. Ningún empleado puede quedarse la herramienta de forma permanente. Ningún empleado puede estar eternamente esperando a que le llegue el turno de usar la herramienta.
Si hay una emergencia, el responsable debe tener la capacidad de recuperar las herramientas del empleado que las esté utilizando para dicha emergencia. Si este proceso de gestión de recursos se realiza a la suficiente velocidad y los emplea- dos fuesen muy rápidos, la percepción de un observador externo sería que todos los em- pleados avanzan en la ejecución de sus respectivas tareas a la vez. Eso es, en cierto modo, lo que ocurre en un sistema de computación gracias al planificador de procesos. Existen muchos algoritmos para la planificación de los procesos, pero su enumeración y explicación están fuera del alcance de este libro.
No obstante, hay que considerar que cada sistema operativo utiliza sus propias estrategias de gestión de recursos a distin- tos niveles y que dichas estrategias influyen de manera directa en el funcionamiento del sistema. Para realizar la gestión de los procesos, el planificador necesita conocer el estado en que se encuentran. En un momento dado, un proceso se encuentra en un estado de un conjunto de estados posibles. Los estados básicos en los que puede estar un proceso son los siguientes: Nuevo. Técnicamente no es un estado, sino el reflejo del instante en el que se crea el proceso. Listo. El proceso está en memoria, preparado para ejecutarse.
Está a la espera de que el planificador le conceda tiempo de procesamiento. En ejecución. El proceso se encuentra en ejecución. Bloqueado. Se encuentra a la espera de que ocurra un evento externo ajeno al pla- nificador. Finalizado. Al igual que el «estado» Nuevo, no es técnicamente un estado. Refleja el instante posterior a la finalización del proceso. Las posibles transiciones entre estos estados se recogen en el diagrama de transi- ción de estados que representa su ciclo de vida y que se muestra en la Figura 1.11. INFORMÁTICAYCOMUNICACIONES 17 © Ediciones Paraninfo 1.
PROGRAMACIÓN MULTIPROCESO Este es un diagrama simplificado, ya que no recoge estados intermedios relacionados con la suspensión (listo y suspendido o bloqueado y suspendido, por citar algunos ejem- plos clásicos), pero permite tener una visión panorámica del flujo de cambios de estado. NUEVO BLOQUEADO LISTO EN EJECUCIÓN FINALIZADO Figura 1.11. Los procesos tienen un ciclo de vida controlador por el planificador. No es infrecuente que un sistema se detenga durante un breve instante de tiempo cuan- do está sometido a una excesiva carga de trabajo (fenómeno conocido como lag, también asociado a las fluctuaciones de las redes de datos).
Esto puede deberse, entre otras ra- zones, a que, en el establecimiento de prioridades del sistema operativo, alguna tarea ha acaparado los recursos del sistema durante una breve fracción detiempo, dejando «pau- sados» al resto de procesos. Estas pausas se perciben especialmente durante la repro- ducción de contenidos multimedia o en la ejecución de videojuegos y son inevitables si la carga de trabajo del sistema excede a su capacidad. Recuerda Ni el programador ni el usuario tienen control directo sobre los estados de un proceso, ya que el ciclo de vida es responsabilidad exclusiva del planificador del sistema operativo.
1.2.2.Comunicaciónentreprocesos Por definición, los procesos de un sistema son elementos estancos. Cada uno tiene su espacio de memoria, su tiempo de CPU asignado por el planificador y su estado de los registros. No obstante, los procesos deben poder comunicarse entre sí, ya que es natu- ral que surjan dependencias entre ellos en lo referente a las entradas y salidas de datos. La comunicación entre procesos se denomina IPC (Inter-Process Communication) y exis- ten diversas alternativas para llevarla a cabo. Algunas de estas alternativas son las siguientes: Utilización de sockets. Los sockets son mecanismos de comunicación de bajo ni- vel.
Permiten establecer canales de comunicación de bytes bidireccionales entre procesos alojados en distintas máquinas y programados con diferentes lenguajes. INFORMÁTICAYCOMUNICACIONES 18 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO Gracias a los sockets dos procesos pueden intercambiar cualquier tipo de informa- ción. Se tratan en detalle en la Unidad 3 de este libro. Utilización de flujos de entrada y salida. Los procesos pueden interceptar los flujos de entrada y salida estándar, por lo que pueden leer y escribir información unos en otros. En este caso, los procesos deben estar relacionados previamente (uno de ellos debe haber arrancado al otro obteniendo una referencia al mismo).
En la Ac- tividad resuelta 1.1 de esta unidad se puede observar el funcionamiento de este tipo de técnica. RPC. Llamada a procedimiento remoto (Remote Process Call, en inglés). Consiste en realizar llamadas a métodos de otros procesos que, potencialmente, pueden es- tar ejecutándose en otras máquinas. Desde el punto de vista del proceso que rea- liza la llamada, la ubicación de los procesos llamados es transparente. En Java, este tipo de llamada se realiza mediante la tecnología conocida como RMI (Remote Method Invocation), equivalente a las RPC, pero orientada a objetos. La tecnología RMI se presenta en la Unidad 4 de este libro. Mediante el uso de sistemas de persistencia.
Consiste en realizar escrituras y lec- turas desde los distintos procesos en cualquier tipo de sistema de persistencia, como los ficheros o las bases de datos. Pese a su sencillez, no se puede ignorar esta alternativa, ya que puede ser suficiente en múltiples ocasiones. Mediante el uso de servicios proporcionados a través de internet. Los procesos pue- den utilizar servicios de transferencia de ficheros FTP, aplicaciones o s ervicios web, así como la tecnología cloud como mecanismos de conexión entre procesos que permiten el intercambio de información.
1.2.3.Sincronizaciónentreprocesos Todos los sistemas en los que participan múltiples actores de manera concurrente están sometidos a ciertas condiciones que exigen que exista sincronización entre ellos. Por ejemplo, puede que sea necesario saber si un proceso ha terminado satisfactoriamen- te para ejecutar el siguiente que se encuentra en un flujo de procesos o, en caso de que haya ocurrido un determinado error, ejecutar otro proceso alternativo. Sabías que... En ocasiones, el documento conocido como «Manual de Explotación» o «Manual de Administración» de un sistema software debe recoger los posibles códigos de fi nalización de los procesos junto con su descripción.
Esta información es necesaria para poder construir fl ujos de trabajo que incluyan a varios procesos, permitiendo establecer las rutas de ejecución en función de los códigos de fi nalización. Es el planificador del sistema operativo el encargado de decidir en qué momento tiene acceso a los recursos un proceso, pero a nivel general, la decisión de crear y lanzar un proceso es humana y expresada a través de un algoritmo. INFORMÁTICAYCOMUNICACIONES 19 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO En la Figura 1.12 se muestra un posible ejemplo de flujo de ejecución de un conjunto de procesos.
Las condiciones que determinan dicho flujo son las siguientes: El proceso «Proceso 1» se ejecuta inicialmente. – Si el código de finalización de «Proceso 1» es 0, se ejecuta el proceso «Proceso 1.1». Si el código de finalización de «Proceso 1.1» es 0, se ejecuta el proceso «Pro- ceso 1.1.1». Si el código de finalización de «Proceso 1.1» es 1, se ejecuta el proceso «Pro- ceso 1.1.2». – Si el código de finalización de «Proceso 1» es 1, se ejecuta el proceso «Proceso 1.2». Independientemente del código de finalización del proceso «Proceso 1.2», pero únicamente cuando haya finalizado, se ejecuta el proceso «Proceso 1.2.1».
PROCESO 1 PROCESO 1.1 PROCESO 1.1.1 PROCESO 1.1.2 PROCESO 1.2 PROCESO 1.2.1 Figura 1.12. El flujo de ejecución de un sistema de procesos puede depender del resultado de las ejecuciones de sus integrantes. Para gestionar un flujo de trabajo como el presentado en el ejemplo se necesita dispo- ner de los siguientes mecanismos: Ejecución. Un mecanismo para ejecutar procesos desde un proceso. Espera. Un mecanismo para bloquear la ejecución de un proceso a la espera de que otro proceso termine. Generación de código de terminación. Un mecanismo de comunicación que permita indicar a un proceso cómo ha terminado la ejecución mediante un código. Obtención de código de terminación.
Un mecanismo que permita a un proceso ob- tener el código de terminación de otro proceso. En Java, estas necesidades se satisfacen con las clases y métodos que se muestran en la Tabla 1.1. INFORMÁTICAYCOMUNICACIONES 20 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO Tabla 1.1.
Clases y métodos de Java que proporcionan soporte a la gestión de procesos Mecanismo Clase Método Ejecución Runtime exec() Ejecución ProcessBuilder start() Espera Process waitFor() Generación de código de terminación System exit(valor_del_retorno) Obtención de código de terminación Process waitFor() Pese a que en el Apartado 1.3 se estudian las clases Runtime y ProcessBuilder, es inte- resante presentar un ejemplo de sincronización entre procesos realizada en Java.
La siguiente clase escrita en Java representa un proceso que, tras intentar realizar aque- llo para lo que está programado, devuelve un código de retorno 103 utilizando el méto- do exit de la clase System, que significa que ha ocurrido un error de un tipo determinado. 1 package es.paraninfo.sincronizacion; 2 3 public class ProcesoSecundario { 4 public static void main(String[] args) { 5 System.out.println("Proceso secundario..."); 6 System.exit(103); 7 } 8 } Por otra parte, la clase siguiente representa un proceso que ejecuta el proceso anterior (método exec), queda a la espera de que termine (método waitFor), recoge el valor de fi- nalización del proceso y lo evalúa para tomar una decisión.
1 package es.paraninfo.sincronizacion; 2 3 public class ProcesoPrincipal { 4 public static void main(String[] args) { 5 try { 6 String[] infoProceso = {"java","es.paraninfo.sincronizacion.ProcesoSecundario"}; 7 Process proceso = Runtime.getRuntime().exec(infoProceso); 8 int valorRetorno = proceso.waitFor(); 9 if (valorRetorno==0) { 10 System.out.println("El proceso se ha completado satisfactoriamente"); 11 }else { 12 System.out.println("El proceso ha fallado. Código de error:" + valorRetorno); 13 } 14 } catch (Exception e) { 15 e.printStackTrace(); 16 } 17 } 18 } INFORMÁTICAYCOMUNICACIONES 21 © Ediciones Paraninfo 1.
PROGRAMACIÓN MULTIPROCESO El resultado de la ejecución del programa ProcesoPrincipal es el siguiente: El proceso ha fallado. Código de error:103 El proceso principal recoge el código de finalización del proceso secundario, lo evalúa y en función del valor que toma elige uno u otro camino. En este ejemplo se muestra uno u otro mensaje de texto por la salida estándar en función del código de finalización del proceso secundario. Si en lugar de mostrar mensajes se hubiesen ejecutado procesos, se habría creado un flujo de ejecución de trabajos. Recuerda Este tipo de sincronización se puede realizar entre procesos escritos en distintos lenguajes de programación.
Actividad propuesta 1.3 Redacción de descripciones asociadas a códigos de finalización Un programa recalcula la tarifa de los precios de los productos de una empresa almace- nados en una base de datos creada según el índice de precios al consumo (IPC) obteni- do de un servicio web. Una vez recalculados se deben actualizar en la base de datos y enviar por correo electrónico al responsable correspondiente. Completa la siguiente tabla, redactando la descripción de cuatro posibles finalizaciones incorrectas. Código de fi nalización Descripción 0 El proceso ha terminado correctamente. 1 2 3 4 1.3.
ProgramacióndeaplicacionesmultiprocesoenJava Cada instancia de una aplicación en ejecución es un proceso. Cada proceso dispone de un conjunto de instrucciones, un estado de los registros del procesador, un espacio de memo- ria y un estado en lo referente a la gestión que hace de él el planificador del sistema opera- tivo. ¿Tiene sentido, por lo tanto, hablar de programación de aplicaciones multiprocesos si una aplicación cuando se ejecuta constituye uno único? INFORMÁTICAYCOMUNICACIONES 22 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO La respuesta es sí, siempre y cuando se acote el significado del concepto «aplicación multiproceso», ya que se trata de un término cuyo alcance es difuso.
En esta unidad se aborda la programación de aplicaciones multiproceso como la capacidad de coordinar la ejecución de un conjunto de aplicaciones para lograr un objetivo común. Por ejemplo, si se dispone de un sistema compuesto por un conjunto de procesos que deben ejecutarse de manera individual, pero que tienen dependencias entre sí, se nece- sita disponer de un mecanismo de gestión y coordinación. Las necesidades que se deben satisfacer para poder programar un sistema basado en la ejecución de múltiples procesos son las siguientes: Poder arrancar un proceso y hacerle llegar los parámetros de ejecución. Poder quedar a la espera de que el proceso termine.
Poder recoger el código de finalización de ejecución para determinar si el proceso se ha ejecutado correctamente o no. Poder leer los datos generados por el proceso para su tratamiento. En Java, la creación de un proceso se puede realizar de dos maneras diferentes: Utilizando la clase java.lang.Runtime. Utilizando la clase java.lang.ProcessBuilder. A continuación, se presentan estas dos alternativas y sus diferencias a la hora de crear y ejecutar los procesos. 1.3.1.CreacióndeprocesosconRuntime Toda aplicación Java tiene una única instancia de la clase Runtime que permite que la propia aplicación interactúe con su entorno de ejecución a través del método estático ge- tRuntime.
Este método proporciona un «canal» de comunicación entre la aplicación y su entorno, posibilitando la interacción con el sistema operativo a través del método exec. El siguiente código Java genera un proceso en Windows indicando al entorno de ejecución (al sistema operativo) que ejecute el bloc de notas a través del programa «Notepad.exe». En este caso, la llamada se realiza sin parámetros y sin gestionar de ninguna manera el pro- ceso generado. Runtime.getRuntime().exec("Notepad.exe"); En muchos casos, los procesos necesitan parámetros para iniciarse.
El método exec puede recibir una cadena de caracteres (un objeto de la clase String) y en dicha cadena, separados por espacios, se indicarán, además del programa que se desea ejecutar, los diferentes parámetros. En el siguiente código se está ejecutando el bloc de notas indicando que «notas.txt» es el fichero que debe abrir o crear si no existe. Runtime.getRuntime().exec("Notepad.exe notas.txt"); INFORMÁTICAYCOMUNICACIONES 23 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO Alternativamente, se puede crear el proceso proporcionando unarray de objetos String con el nombre del programa y los parámetros.
String[] infoProceso = {"Notepad.exe","notas.txt"}; Runtime.getRuntime().exec(infoProceso); El siguiente nivel consiste en gestionar el proceso lanzado. Para ello, se debe obtener la referencia a la instancia de la clase Process proporcionada por el método exec. Es este ob- jeto el que proporciona los métodos para conocer el estado de la ejecución del proceso. String[] infoProceso = {"Notepad.exe","notas.txt"}; Process proceso = Runtime.getRuntime().exec(infoProceso); Si se necesita esperar a que el proceso ejecutado termine y conocer el estado en que ha finalizado dicha ejecución, se puede utilizar el método waitFor.
Este método suspen- de la ejecución del programa que ha arrancado el proceso quedando a la espera de que este termine, proporcionando además el código de finalización. 1 String[] infoProceso = {"Notepad.exe","notas.txt"}; 2 Process proceso = Runtime.getRuntime().exec(infoProceso); 3 int codigoRetorno = proceso.waitFor(); 4 System.out.println("Fin de la ejecución:" + codigoRetorno); La clase Process representa al proceso en ejecución y permite obtener información so- bre este. Los principales métodos que proporciona dicha clase son los que se recogen en la Tabla 1.2. Tabla 1.2. Métodos de la clase java.lang.Process Método Descripción destroy() Destruye el proceso sobre el que se ejecuta.
exitValue() Devuelve el valor de retorno del proceso cuando este fi naliza. Sirve para controlar el estado de la ejecución. getErrorStream() Proporciona un InputStream conectado a la salida de error del proceso. getInputStream() Proporciona un InputStream conectado a la salida normal del proceso. getOutputStream() Proporciona un OutputStream conectado a la entrada normal del proceso. isAlive() Determina si el proceso está o no en ejecución. waitFor() Detiene la ejecución del programa que lanza el proceso a la espera de que este último termine. Recuerda Se puede ampliar información sobre las clases y métodos en la documentación de Java.
Por ejemplo, se puede consultar la documentación completa del API de la clase Process en la siguiente dirección: https://docs.oracle.com/javase/8/docs/api/java/lang/Process.html INFORMÁTICAYCOMUNICACIONES 24 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO Actividad resuelta 1.1 Conexión de procesos Java y Python con lectura de salida Desde un programa escrito en Java, ejecutar un programa escrito en Python y leer los da- tos que genera como salida. Solución Proceso iniciador (Java).
Fichero App.java 1 package es.paraninfo.gestorprocesos; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 7 public class App { 8 9 public static void main(String[] args) { 10 try { 11 12 Process proceso = new ProcessBuilder("Python", "C:\\PSP_Unidad1\\proceso_python\\proceso_python.py").start(); 13 14 BufferedReader br = new BufferedReader(new InputStreamReader(proceso.getInputStream())); 15 proceso.waitFor(); 16 int exitStatus = proceso.exitValue(); 17 System.out.println("Retorno:" + br.readLine()); 18 System.out.println("Valor de la salida:" + exitStatus); 19 } catch (IOException " InterruptedException e ) { 20 e.printStackTrace(); 21 } 22 } 23 } Proceso iniciado (Python).
Fichero proceso_python.py 1 import json 2 import sys 3 4 pelicula = {"El Resplandor": 5 { 6 "Director":"Kubrick", 7 "Anyo":1980, 8 "Reparto":[ 9 {"Nombre":"Jack Nicholson"}, 10 {"Nombre":"Shelley Duvall"}, 11 {"Nombre":"DannyLloyd"}, 12 {"Nombre":"Scatman Crothers"} 13 ] 14 } 15 } 16 17 print(json.dumps(pelicula)) 18 sys.exit(0) INFORMÁTICAYCOMUNICACIONES 25 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO Ejecución y salida: Como se puede observar, desde el programa escrito en Java (proceso iniciador) se está ejecutando el intérprete de Python (proceso iniciado) que recibe un parámetro (el nombre del programa Python a ejecutar).
El proceso iniciador queda a la espera de que el proce- so iniciado termine para leer la salida que este proporciona a través del stream de salida, en este caso una cadena de caracteres que contiene un fichero JSON. 1.3.2.CreacióndeprocesosconProcessBuilder La clase ProccessBuilder permite, al igual que Runtime, crear procesos. La creación más sencilla de un proceso se realiza con un único parámetro en el que se indica el programa a ejecutar. Es importante saber que esta construcción no supone la ejecución del proceso.
new ProcessBuilder("Notepad.exe") La ejecución del proceso se realiza a partir de la invocación al método start: new ProcessBuilder("Notepad.exe").start(); El constructor de ProcessBuilder admite parámetros que serán entregados al proceso que se crea. new ProcessBuilder("Notepad.exe","datos.txt").start(); Al igual que ocurre con el método exec de la clase Runtime, el método start de Process- Builder proporciona un proceso como retorno, lo que posibilita la sincronización y ges- tión de este.
1 Process proceso = new 2 ProcessBuilder("Notepad.exe","datos.txt").start(); 3 int valorRetorno = proceso.waitFor(); 4 System.out.println("Valor retorno:" + valorRetorno); INFORMÁTICAYCOMUNICACIONES 26 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO El método start permite crear múltiples subprocesos a partir de una única instancia de ProccessBuilder. El siguiente código crea diez instancias del bloc de notas de Windows. 1 ProcessBuilder pBuilder = new ProcessBuilder("Notepad.exe"); 2 for (int i=0;i<10;i++) { 3 pBuilder.start(); 4 } Además del método start, la clase ProcessBuilder dispone de métodos para consultar y gestionar algunos parámetros relativos a la ejecución del proceso.
Los métodos más re- levantes de ProcessBuilder se muestran en la Tabla 1.3. Tabla 1.3. Métodos de la clase java.lang.ProcessBuilder Método Descripción start Inicia un nuevo proceso usando los atributos especifi cados. command Permite obtener o asignar el programa y los argumentos de la instancia de ProcessBuilder. directory Permite obtener o asignar el directorio de trabajo del proceso. environment Proporciona información sobre el entorno de ejecución del proceso. redirectError Permite determinar el destino de la salida de errores. redirectInput Permite determinar el origen de la entrada estándar. redirectOutput Permite determinar el destino de la salida estándar.
A continuación, se muestran algunos ejemplos relacionados con los métodos expuestos. El siguiente código crea un objeto ProcessBuilder y determina el directorio de trabajo del proceso: ProcessBuilder pBuilder = new ProcessBuilder("Notepad.exe","datos.txt"); pBuilder.directory(new File("c:/directorio_salida/")); Para acceder a la información del entorno de ejecución, el método environment devuel- ve un objeto Map con la información proporcionada por el sistema operativo.
El siguien- te ejemplo muestra por pantalla el número de procesadores disponibles en el sistema: 1 ProcessBuilder pBuilder = new 2 ProcessBuilder("Notepad.exe","datos.txt"); 3 java.util.Map<String, String> env = pBuilder.environment(); 4 System.out.println("Número de procesadores:" + 5 env.get("NUMBER_OF_PROCESSORS")); INFORMÁTICAYCOMUNICACIONES 27 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO Actividad resuelta 1.2 Conexión de procesos Java y C con configuración de directorio de trabajo Desde un programa escrito en Java ejecutar un programa compilado escrito en C indican- do el directorio de trabajo. El programa en C debe escribir un texto en un fichero.
Dicho fi- chero debe guardarse en el directorio de trabajo indicado. Solución Proceso iniciador (Java).
Fichero CreadorProcesosProcessBuilder.java 1 package es.paraninfo.gestorprocesos; 2 3 import java.io.File; 4 import java.io.IOException; 5 6 public class CreadorProcesosProcessBuilder { 7 8 public static void main(String[] args) { 9 10 try { 11 ProcessBuilder pBuilder = new ProcessBuilder("C://PSP_Unidad1//proceso_c//proceso_c.exe"); 12 pBuilder.directory(new File("C://directorio_salida")); 13 Process proceso = pBuilder.start(); 14 int valorRetorno = proceso.waitFor(); 15 if (valorRetorno==0) { 16 System.out.println("El proceso se ha completado satisfactoriamente"); 17 }else { 18 System.out.println("El proceso ha fallado.
Código de error:" + valorRetorno); 19 } 20 } catch (IOException " InterruptedException e) { 21 e.printStackTrace(); 22 } 23 } 24 } Proceso iniciado (C). Fichero proceso_c.c. Nota: este fichero debe ser compilado. 1 #include <stdio.h> 2 int main() { 3 FILE* fichero; 4 fichero = fopen("salida.txt", "wt"); 5 fputs("Este texto está generado por el proceso escrito en C", fichero); 6 fclose(fichero); 7 return 0; 8 } INFORMÁTICAYCOMUNICACIONES 28 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO Ejecución y salida: El proceso escrito en C escribe el fichero en el directorio de trabajo indicado a través del objeto ProcessBuilder.
Es importante recordar que el programa ejecutable escrito en C se encuentra en una ubi- cación diferente al directorio de salida y que en el código de dicho programa no se hace ninguna referencia a la ubicación del archivo generado, lo que implica que el proceso se ha ejecutado utilizando como directorio de trabajo el indicado en el objeto ProcessBuilder. El fichero tiene el contenido siguiente: Este texto está generado por el proceso escrito en C MAPA CONCEPTUAL 29 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO ACTIVIDADES FINALES 30 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO 1.1. ¿Cuál de los siguientes sistemas operativos no es multitarea? a) Unix. b) Linux. c) Windows 10.
d) MS-DOS. 1.2. En computación, se entiende por multitarea: a) La capacidad que tiene un ordenador de realizar tareas complejas. b) La capacidad que tiene un ordenador de ejecutar un programa detrás de otro. c) La capacidad que tiene un ordenador de realizar tareas sincronizadas entre sí. d) La capacidad que tiene un ordenador de ejecutar varios programas al mismo tiempo. 1.3. ¿Qué elemento del ordenador se encarga de gestionar la multitarea? a) El lenguaje de programación elegido para crear los programas. b) El sistema operativo. c) El sistema de archivos. d) Ninguna de las respuestas anteriores es correcta. 1.4.
¿Qué afirmación referente a los lenguajes de programación compilados no es correcta? a) En condiciones normales son más rápidos que los interpretados. b) Requieren una compilación específica para cada sistema operativo. c) Si el lenguaje es estándar, la misma compilación sirve para todos los sistemas operativos. d) El código fuente debe compilarse para obtener el código binario para ser ejecutado. 1.5. El identificador de proceso se suele identificar por las siglas: a) CPU. b) PID. c) IPD. d) TTY. 1.6. El procesamiento que se ejecuta en diferentes ordenadores independientes, pero conectados y sincronizados se denomina: a) Distribuido. b) Concurrente. c) Paralelo. d) Monohilo. 1.7.
¿Cuál de los siguientes no es un objetivo del planificador de procesos del siste- ma operativo? a) Maximizar el rendimiento del sistema. b) Maximizar los tiempos de respuesta. c) Maximizar la equidad en el reparto de los recursos. d) Minimizar los tiempos de espera. Actividadesdecomprobación ACTIVIDADES FINALES 31 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO 1.8. ¿Cuál es el estado al que puede pasar un proceso que está en estado Listo? a) Nuevo. b) Bloqueado. c) En ejecución. d) Finalizado. 1.9. ¿Qué afirmación referente a la clase Runtime de Java es errónea? a) Permite lanzar un proceso indicando los parámetros de ejecución.
b) Permite quedar a la espera de la terminación del proceso lanzado. c) Permite conocer el valor de las variables internas del proceso lanzado. d) Permite obtener el estado de la finalización el proceso lanzado. 1.10. ¿Cómo se llama el método de la clase Process de Java que hace esperar a que ter- mine el proceso lanzado? a) sleep(). b) finish(). c) waitFor(). d) waitEnd(). Actividadesdeaplicación 1.11. Explica las diferencias entre los lenguajes de programación interpretados y compilados. 1.12. Describe las diferencias entre programa y proceso. 1.13. Explica en qué consiste la programación distribuida. 1.14.
Encuentra las diferencias entre ejecutar dos procesos o realizar una bifurcación ofork. 1.15. Diseña un sistema basado en bases de datos para intercambiar información entre dos procesos. 1.16. Diseña un sistema basado en ficheros de texto para sincronizar procesos. 1.17. Decide qué sistema de sincronización podría servir para sincronizar procesos que se ejecutan en ordenadores independientes conectados a través de internet. 1.18. Explica por qué los hilos (threads) consumen menos recursos que los procesos. 1.19. Explica qué tarea cumple el planificador de procesos dentro del sistema operativo. 1.20. Diseña un planificador de proceso sencillo.
Determina cómo se asigna el tiempo de CPU a los distintos procesos que gestiona para que puedan avanzar todos más o menos si- multáneamente. 1.21. Elabora el listado de los valores y sus descripciones que podrá devolver la ejecución de un proceso que tenga que acceder a una base de datos, a un ordenador a través de la red y a internet. 1.22. Desarrolla un programa en Java que ejecute el navegador web Firefox. Utiliza la clase Runtime. Intenta que el navegador abra directamente una página web. ACTIVIDADES FINALES 32 © Ediciones Paraninfo 1. PROGRAMACIÓN MULTIPROCESO 1.23. Suponiendo que se necesita una capacidad de cálculo de 40…