SISTEMAS OPERATIVOS II Solución examen junio 2006 SOLUCION EXAMEN junio 2006 1. Explique razonadamente si las siguientes afirmaciones son verdaderas o falsas: I) (1 p) En UNIX únicamente se distinguen dos tipos de procesos: los procesos de usuario y los procesos del núcleo. II) (1 p) En UNIX, la caché de buffers de bloques utiliza una política de escritura del tipo post-escritura. Solución: I) Los procesos en el sistema UNIX pueden ser de tres tipos: procesos de usuario, procesos demonio y procesos del núcleo o del sistema. En conclusión la afirmación es FALSA. II) Generalmente, una caché puede soportar dos políticas de escritura: inmediata y postescritura. La política de escritura inmediata consiste en que cuando hay que realizar una operación de escritura ésta se realiza tanto en la copia de los datos almacenados en la caché como en los datos originales situados en el almacenamiento de apoyo (el sistema de ficheros en el disco). La política de escritura inmediata no es apropiada para la caché de buffers de bloques, puesto que el rendimiento del sistema se ve seriamente afectado. Se estima que en la operación normal de un sistema cerca de un tercio de las operaciones de E/S son operaciones de escritura, y muchas de ellas son transitorias. Por ejemplo, la sobreescritura de un dato o el borrado del contenido de un fichero. Esto causaría muchas escrituras innecesarias, relantizando al sistema tremendamente. Por esta razón, la caché de buffer de UNIX utiliza una política de escritura del tipo post-escritura. Es decir, los bloques modificados son simplemente marcados como “sucios”, y son escritos al disco cuando los buffers que los contienen son seleccionados para ubicar otros bloques al no existir buffers libres en la caché. En conclusión la afirmación es VERDADERA. 1 SISTEMAS OPERATIVOS II Solución examen junio 2006 2. (2 p) Enumere y explique brevemente las principales circunstancias que motivan en UNIX la realización de un cambio de contexto. Solución: Entre las principales circunstancias que motivan la realización de un cambio de contexto se encuentran: La entrada de un proceso en el estado dormido. La realización de un cambio de contexto en esta circunstancia está plenamente justificada ya que puede transcurrir una cierta cantidad de tiempo hasta que el proceso despierte, con lo que mientras tanto se pueden ejecutar otros procesos. La finalización de la ejecución de una llamada al sistema exit. Esta llamada al sistema provoca la terminación del proceso en cuyo contexto se está ejecutando el núcleo. Por lo tanto, puesto que el proceso actual ha sido finalizado el núcleo debe hacer un cambio de contexto para continuar o iniciar la ejecución de otro proceso. La vuelta al modo usuario tras ejecutarse una llamada al sistema y la existencia de un proceso esperando para ser ejecutado con mayor prioridad de planificación que el actual. En este caso se produce un cambio de contexto porque si hay otro proceso con mayor prioridad de planificación, sería injusto mantenerle esperando. La vuelta al modo usuario tras atenderse una interrupción y la existencia de un proceso esperando para ser ejecutado con mayor prioridad de planificación que el actual. La justificación del cambio de contexto en esta circunstancia es análoga al caso anterior. La finalización del tiempo de uso del procesador de un proceso ejecutándose en modo usuario. En esta circunstancia se planifica otro proceso para ser ejecutado en modo usuario y por tanto es necesario realizar un cambio de contexto. 2 SISTEMAS OPERATIVOS II Solución examen junio 2006 3. Considérese la siguiente llamada al sistema: salida=shmat(par1,par2,par3). a) (0.4 p) ¿Para que se utiliza esta llamada al sistema?. b) (1.2 p) Explique el significado de par1, par2 y par3 c) (0.4 p) Explique los posibles valores que puede tomar salida. Solución: a) La llamada shmat asigna un espacio de direcciones virtuales al segmento de memoria cuyo identificador ha sido dado por shmget. Por lo tanto shmat enlaza una región de memoria compartida de la tabla de regiones con el espacio de direcciones de un proceso. b) par1 es un identificador de una región de memoria compartida. par2 es la dirección virtual del proceso donde se desea que empiece la región de memoria compartida. par3, es una máscara de bits que indica la forma de acceso a la memoria. c) Si la llamada al sistema shmat tiene éxito en salida se almacena la dirección a la que está unido el segmento de memoria compartida par1. En caso contrario en salida se almacena el valor -1. 3 SISTEMAS OPERATIVOS II Solución examen junio 2006 4. En la Figura se muestra la lista de callouts del núcleo del UNIX BSD en un cierto instante de tiempo. Se pide: a) (0.5 p) Explicar brevemente que es un callout. b) (0.75 p) Determinar el tiempo de disparo (en tics) de func1, func2, func5 y func12. c) (0.75 p) Supuesto que ha transcurrido un tic, dibujar la lista de callout. Cabecera de la lista de callouts t=5 func12 t=2 func1 t=1 func5 t=3 func2 Solución: a) Los callouts son un mecanismo interno del núcleo que le permite invocar funciones transcurrido un cierto tiempo. Un callout típicamente almacena el nombre de la función que debe ser invocada, un argumento para dicha función y el tiempo en tics transcurrido el cual la función debe ser invocada. b) En la figura del enunciado se muestra la lista de callouts en un cierto instante de tiempo. Se observa que dicha lista contiene cuatro entradas asociados a cuatro callouts. En el UNIX BSD la lista de callouts se ordena en función del tiempo que le resta al callout para ser invocado. A este tiempo comúnmente se le denomina tiempo de disparo. Cada entrada de la lista de callouts almacena la diferencia entre el tiempo de disparo de su callout asociado y el tiempo de disparo del callout asociado a la entrada anterior. Por lo tanto La primera entrada de la lista está asociada al callout para la función func12 y en ella también se almacena su tiempo de disparo que es 5 tics. La segunda entrada está asociada al callout para la función func1. En su entrada de la lista se almacena el tiempo que resta para ser invocada con respecto a func12, en este caso es 2 tics. Su tiempo de disparo es la suma de los tiempos almacenados en esta segunda entrada y en la primera entrada, es decir, 5+2= 7 tics. La tercera entrada está asociada al callout para la función func5. En su entrada de la lista se almacena el tiempo que resta para ser invocada con respecto a func1, en este caso es 1 tic. Su tiempo de disparo es la suma de los tiempos almacenados en esta tercera entrada y en las dos entradas anteriores, es decir, 5+2+1= 8 tics. La cuarta entrada está asociada al callout para la función func2. En su entrada de la lista se almacena el tiempo que resta para ser invocada con respecto a func5, en este caso es 3 tics. Su tiempo de disparo es la suma de los tiempos almacenados en esta cuarta entrada y en las tres entradas anteriores, es decir, 5+2+1+3= 11 tics. 4 SISTEMAS OPERATIVOS II Solución examen junio 2006 c) En la figura inferior se representa la lista de callouts supuesto que ha transcurrido un tic Cabecera de la lista de callouts t=4 func12 t=2 func1 t=1 func5 t=3 func2 5. Al compilar el siguiente código C se crea el ejecutable j06. En el momento de ejecutar j06 existe en el sistema el siguiente rango de identificadores de procesos (pid) disponibles: [5000-9000]. Conteste razonadamente a los siguientes apartados: a) (0.5 p) Explique el significado de las sentencias del código marcadas con [ ]. b) (1.5 p) Explique el funcionamiento de este programa supuesto que se invoca desde la línea de ordenes del terminal de la siguiente forma: $ j06 17 20 [1] void main(int argc, char *argv[]) { [2] int X, Y, Z, h=0; [3] if (argc!=3) [4] exit(0); else { [5] X=atoi(argv[1]); Y=atoi(argv[2]); [6] Z=X&Y; [7] for (h=0;h<2;h++) Z=Z>>1; [8] if (fork()==2) Z=Z<<2; [9] printf("%d %o %x\n",Z,Z,Z); } } Solución: En la contestación de los dos apartados se va a suponer que el sistema asocia el proceso A a la ejecución del fichero ejecutable j06. a) El significado de cada una de las sentencias marcadas con [] de este código es el siguiente: [1] Declaración de la función principal main del programa, que en este caso indica que el ejecutable j06 podrá recibir argumentos desde la línea de comandos ($) cuando sea invocado. El parámetro argc de tipo entero contendrá el número de argumentos que recibe el ejecutable desde la línea de comandos, recuerde que el nombre del ejecutable es considerado como argumento. Por otro lado *argv[]es un array de punteros a caracteres, cada elemento del array apunta a un argumento de la línea de ordenes. 5 SISTEMAS OPERATIVOS II Solución examen junio 2006 [2] Declaración de las variables X, Y, Z y h de tipo entero. De todas ellas, sólo la variable h es inicializada, en este caso a 0. [3] Sentencia condicional if, para comprobar si el número de argumentos argc que recibe el ejecutable desde la línea de comandos es distinto de 3. [4] Llamada al sistema exit para finalizar el proceso A. Posee un 0 como parámetro de entrada, que es el código de retorno para el proceso padre de A. [5] Función de librería atoi para convertir el primer argumento (argv[1]) que recibe j06, a un número entero. Dicho valor entero se asigna a la variable X. [6] Operación binaria AND entre las variables X e Y. El resultado se almacena en la variable Z. [7] Bucle for cuyo índice de control h se inicializa al valor h=0. La condición que debe ser satisfecha para que se continúe la ejecución del bucle es que h sea menor de 2. El índice se incrementa en una unidad (h++) al finalizar una ejecución del bucle. En cada ejecución del bucle se realiza la operación binaria Z=Z>>1, es decir, desplazar el número binario almacenado en Z un bit a la derecha. El resultado de esta operación binaria se vuelve a almacenar en Z. [8] Sentencia condicional if, para evaluar si la llamada al sistema fork, que crea un proceso hijo a partir del proceso A, devuelve el valor 2. En caso afirmativo se realiza la operación binaria Z=Z>>2, es decir, desplazar el número binario almacenado en Z dos bits a la derecha. El resultado de esta operación binaria se vuelve a almacenar en Z. [9] Función printf, para escribir el valor de Z en el dispositivo de salida estándar (típicamente el monitor) de acuerdo con la siguiente cadena de control “%d %o %x\n". Es decir, en pantalla se mostraría lo siguiente: el valor entero de Z, un espacio en blanco, el valor octal de Z, un espacio en blanco, el valor hexadecimal de Z y un salto de línea. b) En primer lugar el proceso A comprueba si el número de argumentos que recibe el ejecutable desde la línea de comandos es distinto de 3. La comprobación es negativa ya que la orden j06 17 20 tiene tres argumentos (se debe recordar que el nombre del ejecutable se cuenta como argumento). En segundo lugar, convierte los argumentos 1 y 2 de la orden, de cadenas de caracteres a números enteros. Luego X=17 e Y=20. 6 SISTEMAS OPERATIVOS II Solución examen junio 2006 En tercer lugar, realiza la operación binaria AND entre las variables X e Y, y almacena el resultado de la operación en Z. El número 17 en binario es 10001 y el 20 en binario es 10100. Luego Z= (10001) & (10100) =10000, es decir, Z=16. En cuarto lugar, de acuerdo con el bucle for, realiza dos veces la operación Z=Z>>1. Así, para h=0, el resultado de la operación es Z=(10000>>1)=01000. Y para h=1, el resultado de la operación es Z=(01000>>1)=00100. Luego al finalizar el bucle Z=4. En quinto lugar se crea, mediante la invocación de la llamada al sistema fork, un proceso hijo B del proceso padre A. Luego en este punto del programa se tienen dos procesos el padre A y el hijo B. En consecuencia hay que diferenciar las acciones que realiza cada proceso: - Proceso A: La llamada al sistema fork devuelve al proceso padre el pid del proceso hijo. Este pid de acuerdo con el enunciado estará comprendido entre [5001-9000], supuesto que al proceso A se le ha asociado el pid=5000. En consecuencia no se cumple la condición que evalua el if. A continuación, imprime en la pantalla el texto 4 4 4 y finaliza. - Proceso B: La llamada al sistema fork devuelve al proceso hijo el valor 0.. En consecuencia no se cumple la condición que evalua el if. A continuación, imprime en la pantalla el texto 4 4 4 y finaliza. Comentario: Es el planificador de UNIX es el que decidirá que proceso A o B se ejecuta en primer lugar. De cara al usuario, en el caso de j06, este hecho es imperceptible ya que la traza que genera la ejecución de j06 en pantalla es: 4 4 4 4 4 4 7