Home IT
Home / Teaching / Telecommunication Engineering / Computer Architecture Laboratory / Laboratory 6
anteriorsiguiente
 
Laboratorio de Arquitectura de Ordenadores
Práctica 6:
Procesos y Señales
Contenidos
   1. Introducción
   2. Descripción del ejercicio
   3. Ayuda para el ejercicio

 

1. Introducción
Con esta práctica se pretende que los alumnos alcancen los siguientes objetivos:
  • Entender que linux es un sistema operativo multiproceso en el cual pueden estar ejecutándose a la vez un conjunto de procesos. Un programa puede lanzar varios procesos y tales procesos tienen una jerarquía determinada (todo proceso tiene otro proceso padre) que va evolucionando a lo largo de la ejecución del programa.
  • Aprender a realizar y comprender árboles de procesos asociados a un determinado programa, que nos muestra durante la ejecución de un programa cómo se van creando los procesos, en que orden, con que estructura jerárquica, etc. así como las señales intercambiadas entre ellos
  • Aprender a realizar y comprender tablas de variables asociadas a un determinado programa que nos muestran la evolución del valor de todas las variables para cualquier proceso generado en dicho programa, durante toda la ejecución del programa.
  • Comprender cómo funciona el planificador de procesos de linux y cómo poder simular que la ejecución de un proceso A se realizará antes que la ejecución de un proceso B.
  • Comprender los distintos tipos de señales y cómo un determinado proceso puede mandar una señal a otro y la forma de tratar las señales recibidas por parte de un proceso.
  • Saber el estado de un proceso a lo largo del tiempo y en particular saber su estado final.
  • Saber utilizar y comprender un conjunto de llamadas al sistema relacionadas con los procesos y señales.
  • Implementar un programa en código C de tal forma que siga una determinada especificación acorde con un árbol de procesos, una tabla de variables, un estado final de procesos y un conjunto de señales intercambiadas concreto.

 

 
 2. Descripción del ejercicio
En este ejercicio debe realizar un programa en código C llamado "process.c" en el que obligatoriamente sólo podrá usar para su realización una combinación de los siguientes elementos:
  • Definición de variables.
  • Asignación de valores a variables.
  • Definición de funciones internas al programa en código C.
  • Obligatoriamente sólo podrá usar como llamadas al sistema las siguientes (nº 2 del manual): fork, exit, getpid, getppid, waitpid, execve, sigaction, signal, kill, alarm y pause
  • Obligatoriamente sólo podrá usar como funciones del sistema las siguientes (nº 3 del manual): fflush, printf y sleep
  • Cualquier estructura condicional en código C que involucre cualquiera de los anteriores elementos.

Cualquier otro elemento no nombrado en la lista anterior no está permitido para la resolución del ejercicio.

El programa a realizar debe cumplir obligatoriamente con los siguientes requerimientos:

1) Al ejecutar el programa el árbol de procesos generado durante la ejecución debe ser el siguiente:

Este árbol de procesos implica los siguientes aspectos:

  • Por convenio, el primer proceso que tenemos al lanzar el programa llevará el nº 100 en el árbol de procesos y el resto de procesos le asignamos numeración creciente según su orden de creación (101, 102, etc.). Es decir que un proceso de número i no podrá en ningún caso crearse antes que un proceso con numero j si i>j. Por tanto, el diagrama de procesos nos indica el orden de aparición de los procesos en el sistema.
  • El diagrama de procesos nos indica también de cada uno de los procesos que otro proceso lo ha creado.
  • Cuando vuestro programa se ejecute la numeración de los procesos creados será diferente, ya que la asignación de números por el sistema operativo es aleatoria. Pero para cada proceso del árbol de procesos debe existir un proceso en el sistema (con el número que asigne el sistema operativo) que se ajuste exactamente a los requerimientos que se indican en el árbol de procesos.
  • El diagrama nos muestra exactamente que procesos deben mandar señales a otros procesos.

2) Al ejecutar el programa la tabla de variables que nos indica la evolución de las variables a lo largo de la ejecución del programa para cada proceso, debe ser la siguiente:

  100 101 102 103 104 105 106 107
a 0, 1 0, 1 0, 1 0 1 0, 1 0 0
b 0 0 0, 102 0 0 0, 105 102 105
c 0, 101 0 101 0 101 101 101 101
d 0, 100 0, 101 100 101 100 100 100 100
e 0, 102 0, 103 0 0 102 0 0 0
f 0, 104 0 0, 105 0 0 0 105 0
g 0, 100 100 100 100 100 100 100 100

Esta tabla de variables tiene las siguientes implicaciones:

  • Si en una casilla sólo hay un valor significa que dicho proceso tiene ese valor desde su creación hasta el final.
  • Si en una casilla hay varios valores significa que el primero de ellos es el valor inicial de la variable en la creación del proceso y el resto de valores son por los que va pasando la variable a lo largo de ejecución de dicho proceso del programa
  • Cualquiera de los números dentro del rango de nuestro criterio para procesos ( [100, 107] ) que existe en la tabla de variables hace referencia al número real que tendrá dicho proceso en el sistema y no debe interpretarse como un número absoluto. Por ejemplo, supongamos que el proceso que llamamos en el árbol 102 tiene un PID cuando ejecutamos el programa de 1298, entonces en todos los lugares de la tabla donde aparece 102 en la ejecución real deberá aparecer 1298
  • No se pueden usar ninguna otra variable adicional a estas para la resolución del ejercicio. Por lo tanto sólo estas variables enteras deben estar definidas.

3) Un proceso cuando reciba cualquier número de señales con nº 15 en ningún caso morirá. En su lugar ejecutará una rutina que mostrará el número de veces que ha recibido la señal 15 hasta el momento. El mensaje que sacará por pantalla tal rutina será (supuesto recibe una señal el proceso 102):

"El proceso nº 102 acaba de recibir una señal y el número de señales recibidas es de 1"

4) Los mensajes que deben aparecer por pantalla mientras se ejecuta el código debe ser el siguiente (en este orden exactamente) (de nuevo el número de proceso debe sustituirse en la ejecución real por el número asignado por el sistema operativo):

"El proceso hijo número 101 ha sido creado desde el proceso padre 100"

"El proceso hijo número 102 ha sido creado desde el proceso padre 100"

"El proceso hijo número 103 ha sido creado desde el proceso padre 101"

"El proceso nº 100 acaba de recibir una señal y el número de señales recibidas es de 1"

"El proceso nº 101 acaba de recibir una señal y el número de señales recibidas es de 1"

"El proceso hijo número 104 ha sido creado desde el proceso padre 100"

"El proceso hijo número 105 ha sido creado desde el proceso padre 102"

"El proceso hijo número 106 ha sido creado desde el proceso padre 102"

"El proceso hijo número 107 ha sido creado desde el proceso padre 105"

"El proceso nº 102 acaba de recibir una señal y el número de señales recibidas es de 1"

"El proceso nº 105 acaba de recibir una señal y el número de señales recibidas es de 1"

5) Se deberá mostrar por pantalla el valor de cada variable, esto incluye, su valor inicial en cada proceso así como cualquier cambio que ocurra de dicha variable en dicho proceso. Estos mensajes se podrán intercalar en cualquier lugar de entre los mensajes del punto anterior y tendrán el siguiente formato:

"El proceso nº 102 tiene el valor para c de 101"

6) El estado final para los procesos debe ser el siguiente:

100: Terminado y liberado memoria

101: Terminado y liberado memoria

102: En ejecución y huérfano

103: En ejecución y huérfano

104: Terminado y liberado memoria

105: En ejecución

106: En ejecución

107: En ejecución

 3. Ayuda para el ejercicio

Para la realización del ejercicio se sugiere seguir los siguientes pasos:

i) Primero resuelva el ejercicio planteado escribiendo el código suponiendo que el planificador de linux cumplirá los siguientes criterios:

  • De entre los procesos que están preparados para la ejecución en un determinado momento y que no estén en bucle infinito, se toma primero aquel cuya siguiente instrucción a ejecutar está más cerca del inicio del código y en caso de empate el de menor PID.
  • Una vez que un proceso ejecuta una instrucción el planificador saca a ese proceso y pasa a elegir un nuevo proceso entre los que estén preparados para ejecución siguiendo el criterio anterior. Puede ser de nuevo el anterior proceso.
  • Un mismo proceso puede ser elegido consecutivamente por el planificador (y por lo tanto ejecutar a la vez varias instrucciones sin que por en medio se ejecute otro proceso).
  • Cuando sólo quedan procesos que han entrado en un trozo de código que implica un bucle infinito, entonces se ejecutarán estos procesos.
  • El tiempo que tarda el planificador para decidir el próximo proceso que se ejecutará entre los disponibles suponemos que es nulo.

ii) Ejecutaremos el código realizado en el punto anterior. Verá que el resultado no es el esperado puesto que el planificador real no se comporta en la forma en que hemos realizado los supuestos.

iii) Añada a su solución diferentes sleep de forma que modifiquemos el comportamiento del planificador planteado en el punto i) para acercarlo a los requerimientos del ejercicio. Podemos suponer que el tiemo de ejecución de un commando del programa es mucho menor que 1 segundo.

iv) Volveremos a ejecutar el programa y comprobaremos que el resultado es acorde con la especificación del ejercicio. (Para ver el estado final de los procesos puede ayudar ejecutar ps)

v) Finalmente realizaremos el ejercicio inverso al realizado, es decir a partir del código de nuestro programa realizaremos el diagrama de procesos, la tabla de variables, mensajes de salida, estado final de los procesos y comprobaremos que el resultado es el mismo que el mostrado en la especificación.

 
 Submission
Página de entrega de práctica de Procesos y Señales

Notas de práctica de procesos y señales


Location | Personnel | Teaching | Research | News | Intranet
inicio | mapa del web | contacta