Descarga la aplicación para disfrutar aún más
Esta es una vista previa del archivo. Inicie sesión para ver el archivo original
coleccion-examenes/.DS_Store __MACOSX/coleccion-examenes/._.DS_Store coleccion-examenes/2002/exasep2002.doc UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INFORMÁTICA Examen de SISTEMAS OPERATIVOS. INGENIERÍA EN INFORMÁTICA. 12-septiembre-2002 Fecha de publicación de las notas: 20-septiembre-2002 Fecha de revisión: 23-septiembre-2002 a las 11:30 (laboratorio 2.2B08) Para la realización del presente examen se dispondrá de 2 horas y media No se pueden utilizar libros ni apuntes Ejercicio 1 (4 puntos) Sea el siguiente programa denominado bucle_procesos: int main (int argc, char **argv) { int contador, i, pid; contador = atoi(argv[1]); i = 0; while (i < contador) { pid = fork(); i++; } a.) Explique qué hace y dibuje un diagrama con la jerarquía de procesos que se origina cuando se ejecuta el mandato bucle_procesos 4. b.) Explique qué es un proceso zombie y cuándo se producen. c.) ¿Se generan procesos zombies al ejecutar el mandato anterior? Explique su respuesta. d.) ¿Qué ocurriría si se ejecutara bucle_procesos 100? Explique la respuesta y modifique el programa para que se solucione el problema existente. e.) Modifique el programa anterior para que todos los procesos generados puedan compartir el archivo denominado pepe.txt. Explique su solución. Ejercicio 2 (3 puntos) Sean las dos instrucciones máquina siguientes: LD R7, A # Carga en el registro R7 el contenido de la posición de memoria A SUB B,R7, C # Resta C a R7 y lo almacena en B. B y C direcciones de memoria Asumiendo que se ejecutan en un computador con memoria virtual y que cada instrucción y cada operando ocupa una palabra de memoria, conteste a las siguientes preguntas: a.) ¿Cuántos marcos de página serían necesarios para ejecutar estas instrucciones teniendo en cuenta un modelo de proceso en el que texto y datos están en distintos segmentos? Explique su respuesta. b.) ¿Cuántos fallos de página se podrían producir como máximo debidos a la ejecución de las dos instrucciones anteriores? Explique su respuesta. c.) ¿Qué cambiaría si se usara direccionamiento relativo directo para A, B y C (sumando las direcciones a un registro)? ¿Y si se usara direccionamiento indirecto? Ejercicio 3 (3 puntos) El siguiente programa intenta implementar el siguiente mandato: dividir f1 f2 f3 Este mandato lee el archivo f1 y crea dos archivos (f2 y f3). En el archivo f2 se escriben los bytes situados en las posiciones pares de f1 y en el archivo f3 los bytes situados en las posiciones impares. Así, si el contenido de f1 es 12121212121212 · El contenido de f2 será 1111111 · El contenido de f3 será 2222222 void main (int argc, char *argv[]) { int fd1, fd2, fd3; char c; int size; int i; fd1= open(argv[1], O_RDONLY); fd2= creat(argv[2], 0640); fd3= creat(argv[3], 0640); size = lseek(fd1, 0, SEEK_END); lseek(fd1, 0, SEEK_SET); if (fork() == 0) { for ( i = 0; i < size; i = i + 2) { lseek(fd1, i, SEEK_SET); read(fd1, &c, 1); write(fd2, &c, 1); } } else { for ( i = 1; i < size; i = i + 2) { lseek(fd1, i, SEEK_SET); read(fd1, &c, 1); write(fd3, &c, 1); } } close(fd1); close(fd2); close(fd3); exit(0); } Se pide: a) Suponiendo que el programa es correcto, modifique el programa para que haga un correcto tratamiento de todas las llamadas al sistema. b) ¿Por qué el programa anterior no consigue el funcionamiento esperado para el mandato dividir? Razone su respuesta. c) Suponiendo que la implementación sigue utilizando dos procesos, proponga dos modificaciones que resuelvan el problema del apartado b. coleccion-examenes/2002/Icon __MACOSX/coleccion-examenes/2002/._Icon coleccion-examenes/2002/jun2002/2002junrexa.pdf Uc3m Informática Técnica de Gestión Examen de 26 junio de 2002 Sistemas Operativos 2001-2002 ssoo2@arcos.inf.uc3m.es 1. (2,5 puntos) Las prácticas de algunos alumnos se bloquean con ciertos datos de entrada. Un profesor decide realizar un programa que ejecute un comando indicado por parámetro que imprima un mensaje de error cuando pase un minuto de ejecución o la salida del comando supere el Megabyte de tamaño. De manera que el programa con un comando bien implementado se ejecutaría: # ./auto_ejec comando_bueno entrada 1 entrada 2 ... entrada n Si el comando se bloquea más de un minuto (60 segundos) la sesión es: #./auto_ejec comando_bloqueado entrada 1 entrada 2 entrada 3 ERROR: comando se bloquea. Si el comando queda en un bucle infinito, la sesión queda: # ./auto_ejec comando_infinito entrada 1 entrada 1 entrada 1 ... ERROR: salida mayor de un mega. El comando a ejecutar no necesita ningún parámetro. Para controlar la salida del comando, el profesor piensa en el siguiente diseño: comando auto_eje 1 0 1 pipe Uc3m Informática Técnica de Gestión Examen de 26 junio de 2002 Sistemas Operativos 2001-2002 ssoo2@arcos.inf.uc3m.es Para implementar el comando el profesor piensa en el siguiente código: #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <signal.h> void fin_minuto ( int sno ) ; int main ( int argc, char *argv[] ) { int err; int pd[2]; pid_t cpid; int leido, leidos; char buf[1024]; /* uso */ if (argc < 2){ printf("uso: %s comando\n",argv[0]); exit(1); } /* RELLENAR 1 : crear pipe */ cpid = fork(); /* fork */ switch (cpid) { case -1: /* error fork */ perror("fork:"); exit(3); break; case 0: /* RELLENAR 2 : conectar salida al pipe */ execvp(argv[1],argv+1); /* ejecutar comando */ perror("execvp:"); exit(4); break; default: /* RELLENAR 3 : conectar entrada del pipe */ signal(SIGALRM, fin_minuto); /* cronometrar 60 segundos */ alarm(60); /* RELLENAR 4 : leer y escribir, máximo 1 mega */ alarm(0); /* fin cronómetro */ if (leidos >= 1024*1024) /* comprobar leidos */ { printf("ERROR: salida mayor de un mega.\n"); exit(5); } break; } /* fin main */ return 0; } void fin_minuto ( int sno ) { /* RELLENAR 5 : imprimir "ERROR: comando se bloquea.\n" y finalizar la ejecución*/ } Se pide ayudar a nuestro profesor, completando las secciones de códigos indicadas a rellenar, justificando brevemente. Basta escribir el código distinguiendo las 5 zonas. Uc3m Informática Técnica de Gestión Examen de 26 junio de 2002 Sistemas Operativos 2001-2002 ssoo2@arcos.inf.uc3m.es 2. (2,5 puntos) Suponga un sistema con memoria virtual paginada usando dos niveles de tablas de páginas, direccionamiento de 32 bits con páginas de 4 kbytes de tamaño. Los atributos asociados a las páginas son: M (modificado), X(ejecutable), RO(sólo lectura), P(presente) y COW(Copiar en la escritura). Este último atributo indica que si na marcada con COW = 1, primero ha de duplicar la página y después modificar esta duplica. A) Se desea que la tabla de segundo nivel ocupe una página, es decir, 4Kbytes. § ¿Cuántos bits son necesarios para direccionar esta tabla? § ¿Sería posible incluir esta tabla de 2º nivel en memoria virtual y no en § ¿Cuánto ocupa en memoria principal la tabla de nivel 1? § ¿Es posible tener en Memoria virtual la rutina de tratamiento de fallo de página? ¿Por qué si? / ¿Por qué no? B) Se desea implementar la llamada al sistema: mm_FastMemCpy ( void * dst, void * src, int npages ) ; Para poder tener a partir de la dirección indicada en 'dst' los mismos datos que están a partir de 'src'. Se garantizan que ambas direcciones (src y dst) son el comienzo de una página y npages es un número de páginas válido. tabla N1 tabla N2 Memoria Uc3m Informática Técnica de Gestión Examen de 26 junio de 2002 Sistemas Operativos 2001-2002 ssoo2@arcos.inf.uc3m.es Nombre y Apellidos NIA Se pide: Escriba y describa en pseudocódigo la función descrita, usando la siguiente tabla: Pasos Comentario Acceder a ... Es necesario comprobar ... Uc3m Informática Técnica de Gestión Examen de 26 junio de 2002 Sistemas Operativos 2001-2002 ssoo2@arcos.inf.uc3m.es 3. (2,5 puntos) Cuatro alumnos están jugando en clase en el descanso a un juego de cartas que implica coordinación (no saltarse los turnos) y exclusión mutua (mientras uno roba una carta o la cambia con el compañero el resto debe esperar a que acabe para no quitarse la carta de la mano). Se plantea tomar como base esta experiencia para implantar una arquitectura de comunicación entre procesos que permita realizar una práctica de inteligencia artificial en la que cada alumno codificará su estrategia dentro de las siguientes funciones aisladas: Proceso_jugador() { while ( 1 ) { Pensar_la_jugada(); // va calculando la mejor opción Jugar(); // intercambia rápidamente las cartas } } Todos los procesos serán hijos de un proceso principal denominado partida, y por tanto heredaran tras el fork y exec correspondiente una serie de semáforos inicializados de la siguiente manera: #define NUMERO_DE_JUGADORES 4 #define NUMERO_DE_CARTAS 40 #define SIGUIENTE ((IDENTIFICADOR_DE_JUGADOR + 1) % NUMERO DE JUGADORES) Semáforo esperar [NUMERO_DE_JUGADORES]; User_ID baraja [NUMERO_DE_CARTAS]; Se pide: 1. Intercalar en el código propuesto para proceso_jugador() las ordenes wait y signal necesarias sobre los semáforos esperar[IDENTIFICADOR_DE_JUGADOR] y esperar[SIGUIENTE] para asegurar el correcto funcionamiento del mismo, es decir, que cada jugador deba esperar a su turno antes de poder ejecutar jugar() 2. ¿Cómo debe estar inicializado el array de semáforos para que el funcione, es decir, empiece el primer jugador y ceda el turno al siguiente y así sucesivamente, quedando bloqueado cada cual hasta que le toque? 3. En el caso de que jugar() no se ejecute de forma atómica, ya que tendrá que modificar al menos dos entradas de la tabla baraja… ¿Habría que incorporar algo para garantizar la exclusión mutua en la ejecución de jugar()? De ser necesario, escribir el código. De no serlo, explicar por que. Uc3m Informática Técnica de Gestión Examen de 26 junio de 2002 Sistemas Operativos 2001-2002 ssoo2@arcos.inf.uc3m.es 4. (2,5 puntos) El sistema de ficheros de la figura muestra el resultado del disco /dev/hda3 una vez montado sobre el directorio /usr/extra. Se trata de una partición muy pequeña en la que tan solo hay 10 inodos y 50 sectores de datos de 1K cada uno de ellos. Sobre ese disco y con CWD /usr/extra, se ejecutan los comandos siguientes: rmdir directorio touch fichero1 ln fichero1 fichero2 ln –s ./fichero2 fichero3 nota: touch actualiza la fecha de un fichero, y si no existe lo crea vacio. Se pide: 1.) Dibujar la estructura del disco al finalizar las operaciones indicadas, indicando los valores de inodos y bloques según lo mostrado en el dibujo 2.) ¿Cuántos ficheros de 1K podrían crearse a partir de ese momento? 3a.) ¿Cuál seria el tamaño máximo de fichero que podríamos crear si en lugar de crear muchos de 1K creásemos solo uno pero grande? 3b.) ¿Cuantos enlaces físicos (o duros) podrían hacerse a ese fichero de tamaño una vez creado el mismo? Explica la respuesta 3c.) ¿Y si en lugar de físicos los quisiésemos simbólicos, cuantos podrían crearse? i - nodo 1 d rwxr - xr - x L ink - count 2 T amaño 1 024 datos 1 1 i - nodo 0 d rwxr - xr - x L ink - count 3 T amaño 1 024 datos 1 0 bloque 0 . 0 .. 0 directorio 1 bloque 1 . 1 .. 0 Uc3m Informática Técnica de Gestión Examen de 26 junio de 2002 Sistemas Operativos 2001-2002 ssoo2@arcos.inf.uc3m.es 1 SOLUCION #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <signal.h> void fin_minuto ( int sno ) ; int main ( int argc, char *argv[] ) { int err; int pd[2]; pid_t cpid; int leido, leidos; char buf[1024]; /* uso */ if (argc < 2) { printf("uso: %s comando\n",argv[0]); exit(1) ; } /* pipe */ err = pipe(pd); if (err < 0) { perror("pipe:"); exit(2) ; } /* fork */ cpid = fork(); switch (cpid) { case -1: /* error fork */ perror("fork:"); exit(3); break; case 0: /* salida al pipe */ close(pd[0]); close(1); dup(pd[1]); close(pd[1]); /* ejecutar comando */ execvp(argv[1],argv+1); perror("execvp:"); exit(4); break; default: /* entrada del pipe */ close(pd[1]); close(0); dup(pd[0]); close(pd[0]); /* cronometrar 60 segundos */ signal(SIGALRM, fin_minuto); alarm(60); /* leer y escribir, máximo 1 mega */ leidos = 0; do { leido = read(0,buf,1024); if (leido <= 0) break; write(1,buf,1024); leidos += leido; } while(leidos < 1024*1024+1); /* fin cronómetro */ alarm(0); /* comprobar leidos */ if (leidos >= 1024*1024) { printf("ERR: salida > mega.\n"); exit(5); } break; } /* fin main */ return 0; } void fin_minuto ( int sno ) { printf("ERROR: comando se bloquea.\n"); exit(6); } Informática Técnica de Gestión Examen de junio de 2002 Sistemas Operativos 2001-2002 ssoo2@arcos.inf.uc3m.es 2 SOLUCION A) Se desea que la tabla de segundo nivel ocupe una página, es decir, 4Kbytes. § ¿Cuántos bits son necesarios para direccionar esta tabla? 10 § ¿Sería posible incluir esta tabla de 2º nivel en memoria virtual y no en memoria física? Sí § ¿Cuánto ocupa en memoria principal la tabla de nivel 1? 2^10=4Kb § ¿Es posible tener en Memoria virtual la rutina de tratamiento de fallo de página?. ¿Por qué si?. ¿Por qué no?. No, porque si no se encuentra presente la rutina de tratamiento de excepción en memoria, quedaría en un bucle infinito. B) mm_FastMemCpy ( void * dst, void * src, int npages ) ; Pasos Comentario Acceder a la tabla de página de Nivel 1 y Nivel 2 correspondiente a la dirección origen. Es necesario comprobar que es una página válida y asignada al proceso. Acceder a la tabla de página de Nivel 1 y Nivel 2 correspondiente a la dirección destino. Es necesario comprobar que es una página válida y asignada al proceso. Copiar tantas entradas como el parámetro 'npages' indique, de la tabla de Nivel dos en la que está la dirección 'src' a la tabla de nivel dos en que está la dirección 'dst'. Puede realizarse en un bucle o copiando la zona de tabla de páginas de nivel dos en que están los 'npages' descriptores a partir del asociado a 'src'. Establecer el atributo COW (Copy On Write) a uno Permite retrasar la copia de contenidos al momento de actualización de datos. tabla N1 tabla N2 Memoria 10 10 12 Informática Técnica de Gestión Examen de junio de 2002 Sistemas Operativos 2001-2002 ssoo2@arcos.inf.uc3m.es 3 SOLUCION 1) Proceso_jugador() { while ( 1 ) { Pensar_la_jugada(); Wait esperar[IDENTIFICADOR_DE_JUGADOR]; Jugar(); Signal esperar[SIGUIENTE]; } } 2) Semáforo esperar [NUMERO_DE_JUGADORES] = { 1, 0, 0 …. 0 , 0 }; Como no podemos garantizar cual de los jugadores termina primero de pensar la jugada, solo un semáforo debe estar sin bloquear (podrían inicializarse todos a cero si antes de hacer los fork se hiciese un signal a uno de ellos). 3) No hace falta crear ningún semáforo binario tipo mutex, ya que garantizamos con la perfecta secuenciación de accesos a la función jugar() que uno y solo uno entra en esa sección critica a la vez. Informática Técnica de Gestión Examen de junio de 2002 Sistemas Operativos 2001-2002 ssoo2@arcos.inf.uc3m.es 4 SOLUCION 1. Dibujar la estructura del disco al finalizar las operaciones indicadas. 2. ¿Cuántos ficheros de 1K pueden crearse a partir de ese momento? Tantos como i-nodos, y solo quedan 10 – 3 = 7 3. ¿Cuál seria el tamaño máximo de fichero que podríamos crear si en lugar de crear muchos de 1K creásemos solo uno pero grande? Tantos K como bloques libres quedan: 50 - 2 = 48 K 4. Cuantos enlaces físicos podrían hacerse a ese fichero de tamaño máximo una vez creado el mismo. Explica la respuesta En el directorio que existe, pueden introducirse enlaces fisicos con distinto nombre pero apuntando al mismo i-nodo hasta que se llene el directorio. 5. ¿Y si en lugar de físicos los quisiésemos simbólicos, cuantos podrían crearse? Ninguno, ya que necesitaríamos al menos un bloque de datos por enlace simbolico, y el disco esta ya lleno. i - nodo 0 d rwxr - xr - x L ink - count 2 T amaño 1 024 datos 1 0 i - nodo 1 -rwxr - xr - x L ink - count 2 T amaño 0 datos 1 i-nodo 2 lrwxrwxrwx link-count 1 tamaño 8 datos 1 bloque 0 . 0 .. 0 fichero1 1 fichero2 1 fichero3 2 bloque 1 ./fichero2 coleccion-examenes/2002/jun2002/Icon __MACOSX/coleccion-examenes/2002/jun2002/._Icon coleccion-examenes/2002/jun2002/ssoo-sol-exa-jun-2002.doc Sea el archivo correspondiente al buzón de correo del usuario pepe, que es su dueño y cuyo nombre absoluto es /var/spool/mail/alumnos/bupepe. Suponiendo que el nodo-i / está en memoria, responda a las siguientes preguntas: a.- ¿Cuántos accesos a disco serán necesarios para abrir el archivo, como mínimo? · / está en memoria. Var está en el primer bloque de datos --> 1 acceso a disco para obtener su entrada + 1 acceso a disco para obtener nodo-i de var · Nodo-i var --> 1 acceso a disco para obtener el bloque datos + 1 acceso a disco para obtener nodo-i de spool. · Nodo-i spool --> 1 acceso a disco para obtener el bloque datos + 1 acceso a disco para obtener nodo-i de mail · Nodo-i mail --> 3 accesos a disco para obtener el bloque datos + 1 acceso a disco para obtener nodo-i de alumnos · Nodo-i alumnos --> 2 accesos a disco para obtener el bloque datos + 1 acceso a disco para obtener nodo-i de bupepe En total: 13 accesos a disco b.- ¿En que se diferencian stat y fstat? Si no está abierto se usa la llamada stat: ret = stat (nombre, struct stat &estado); Donde nombre es el nombre del archivo y estado es una estructura en la que devuelve la información de estado del archivo. Si está abierto se usa la llamada fstat: ret = fstat (fd, struct stat &estado); Donde fd es el descriptor del archivo abiertoy estado es una estructura en la que devuelve la información de estado del archivo. c.- ¿Si se quieren leer 21 Kbytes del archivo, es necesario comprobar prermisos con stat antes de abrir con O_RD ? Escriba un programa que lea los 21 Kbytes del archivo. No hace falta usar stat ni fstat, aunque se podría. La razón es que la llamada open cuando se piden los parámetros adecuados de operaciones devuelve un fallo si no se pueden hacer esas operaciones sobre el archivo. En este caso, pepe es del grupo de juan y el archivo tiene permisos rwxr-xr-x, lo que significa que los usuarios del grupo de juan lo pueden leer y ejecutar sin problemas. Por tanto la solución sería como la siguiente: void main (int argc, char **argv) { int fd, leidos, i; char buffer[1024]; fd = open(“/var/spoll/mail/alumnos/bupepe”, O_RD); if (fd < 0){ println(“error al abrir el archivo \n”); exit (-1); } for (i = 0; i < 21; i++) { leidos = read(fd, buffer, 1024); if (leidos ¡= 1024){ println(“error al leer el archivo \n”); exit (-1); } } close (fd); } __MACOSX/coleccion-examenes/2002/jun2002/._ssoo-sol-exa-jun-2002.doc __MACOSX/coleccion-examenes/2002/._jun2002 coleccion-examenes/2002/septiembre2002/.DS_Store __MACOSX/coleccion-examenes/2002/septiembre2002/._.DS_Store coleccion-examenes/2002/septiembre2002/2002sept_02_web.doc Uc3m Informática Técnica de Gestión Examen de 16 de septiembre de 2002 1. (3 puntos) Un sistema de gestión de materias peligrosas se ha automatizado mediante programas concurrentes que mediante controles remotos operan unos robots que las manipulan. En ocasiones deben entrar en una zona donde hay sustancias inflamables (ZSI). Para ello deben obtener acceso a una sección donde sólo pueden estar dentro simultáneamente un máximo de 5 procesos, para minimizar el riesgo de que choquen. Dentro de la zona mencionada hay un habitáculo donde un robot puede entrar (y sólo uno) para realizar mezclas peligrosas. El habitáculo de mezclas (HM) sólo se puede abrir desde fuera, por lo que para salir el robot debe esperar a que otro robot quiera utilizar el habitáculo, o llamar a algún robot auxiliar que deberá conseguir entrar en la ZSI y abrir el HM (sin meterse en él, sólo abrir y cerrar). El código utilizado para dar solución a la mencionada problemática es el siguiente: Semáforo ZSI = 5; Semáforo entrar_HM = 1; Semáforo abrir_puerta = -1; Int quieren_entrar = 0; Int quieren_salir=0; Semáforo mutex = 1; Robot_manipulador(){ Semáforo ayudame = 0; Lanza_proceso_asociado(robot_auxiliar); // cada robot crea un asociado que despertará con un semáforo heredado while (true){ Prepara_la_mision(); wait(ZSI); // intenta entrar en la ZSI manipula_sustancias_peligrosas(); if (es_necesaria_mezcla() ) { entrar_mezclador(); realiza_la_mezcla(); salir_mezclador(); } signal(ZSI) //sale de la ZSI } } robot_auxiliar(){ while(true){ wait(ayudame); //hasta que requieran mis servicios wait(ZSI); // intenta entrar en la ZSI auxiliar_abrir_y_cerrar(); signal(ZSI); //sale de la ZSI } } entrar_mezclador(){ wait(mutex); quieren_entrar++; // contabilidad de entrada signal(mutex); wait(entrar_HM); //intenta entrar en el HM signal(abrir_puerta); // el que está dentro puede salir } salir_mezclador(){ wait(mutex); quieren_entrar--; // contabilidad de entrada if (quieren_entrar < 1 ) signal(ayudame); // despierta auxiliar signal(mutex); signal(entrar_HM); //dejo que otro entre wait (abrir_puerta); //espera a poder salir del HM } auxiliar_abrir_y_cerrar(){ signal(abrir_puerta); // y crea un hijo que hace un wait(abrir_puerta) } // para dejarla otra vez cerrada. Se pide: 1. En el caso de que nos pueden asegurar que únicamente uno al día entra realmente a la HM y no está allí más de 15 minutos, trazar la ejecución del proceso mezclador1 (y se si auxiliar1 si procede) desde que intentan entrar en HM hasta que sale. Estudiar qué valores toman las variables durante el proceso de entrar y salir. NOTA: es obligatorio contestar en forma de tabla con el siguiente formato: Proceso Líneas que ejecuta Semáforo entrar_HM Semáforo abrir_puerta Semáforo ayudame Int quieren_entrar Int quieren_salir Explicación Inicialmente 1 -1 0 0 0 Mezclador1 Entrar_mezclador() 0 0 0 1 0 Bloquea el mutex, incrementa quieren_entrar, libera mutex, el wait(entrar_HM) no le bloquea y el signal(abrir_puerta) deja abrir_puerta bloqueado. Las variables quedan como se indica a la izquierda. Mezclador1 Salir_mezclador() 2. Repetir la traza pero suponiendo que 3 procesos mezcladores seguidos quieren entrar a la HM en el mismo minuto y están dentro 3 minutos cada uno. Los robots auxiliares tardan en llegar un mínimo de 10 minutos. NOTA: es obligatorio contestar en forma de tabla similar al apartado anterior. 3. Estudiar la siguiente secuencia: Proceso Líneas que ejecuta Semáforo entrar_HM Semáforo abrir_puerta Semáforo ayudame Int quieren_entrar Int quieren_salir Explicación inicialmente 1 -1 0 0 0 Mezclador4 Entrar_mezclador() Mezclador4 Salir_mezclador() Mezclador5 Entrar_mezclador() Mezclador5 Salir_mezclador() Auxiliar4 Auxiliar_abrir_y_cerrar() Auxiliar5 Auxiliar_abrir_y_cerrar() ¿Qué comportamiento incorrecto ocurrirá a partir de ese momento con la solución propuesta en el enunciado? 4. Reescribir el código de las funciones salir_mezclador() y auxiliar_abrir_y_cerrar() para que el comportamiento sea correcto hasta en este caso extremo descrito en el apartado 3. Para ello se recomienda llevar correctamente la cuenta de cuantos quieren entrar y cuantos quieren salir de la HM, y vincular la realización de los waits y signals sobre abrir_puerta a su necesidad real en ese instante. 2. (2,5 puntos) El sistema operativo que pretendemos utilizar en nuestro centro de gestión de procesos de control remoto de robots necesita que determinados parámetros sean configurados de antemano por el equipo administrador del sistema. Se le permite seleccionar el tipo de planificador que mejor se adapte a sus necesidades. Para elegirlo nuestros administradores estudian los procesos que más habitualmente se ejecutan y el tiempo que tardan en realizarlo, así como los instantes de llegada. Al final de este estudio obtienen un juego de pruebas que se adapta más o menos a la dinámica del uso que se va a dar a este computador. Con estos datos realizan una serie de pruebas con diversos algoritmos de planificación, de manera que puedan decidir cual sería el óptimo en nuestro caso. Este juego de prueba es el siguiente: PROCESO Instante de llegada Tiempo de proceso A 0 3 B 1 5 C 3 2 D 9 5 E 12 5 Se procede a obtener una traza de ejecución de dichos procesos y evaluar cual es el proceso peor tratado, es decir, el que tarda más tiempo en ser ejecutado comparado con el que debería tardar realmente su ejecución. Se pide: Mostrar los resultados que se obtendrán utilizando los siguientes algoritmos de planificación: 1. FIFO 2. Turno rotatorio con q=1 (cuanto de tiempo) (RR Round Robin) 3. Turno rotatorio con q=4 4. Primero el proceso más corto (SPN Shortest Proces Next) 5. Menor tiempo restante (SRT Shortest Remainin Time, al que le queda menos tiempo por ejecutar) 6. Una vez evaluados los retardos para cada proceso que introduce cada uno de los algoritmos probados, ¿cuál de ellos deberíamos utilizar en nuestro sistema?. Razona tu respuesta Nota: para la respuesta es obligatorio utilizar la hoja asignada al efecto: 3. (2 puntos) En el sistema operativo anterior, el gestor de memoria debe permitirnos que sea posible ejecutar concurrentemente los 5 procesos anteriores. Disponemos para ello de un espacio de disco de 131072 bytes (128K) y una memoria física de 32768 bytes (32K). Sabemos que nuestros procesos al ser ejecutados tienen los siguientes parámetros: proceso código pila datos A 4096 2000 2048 B 16384 8200 8192 C 2048 1000 1024 D 16384 8200 8192 E 16384 8200 8192 Los datos indican el tamaño en bytes de cada uno de los segmentos que forman parte de la imagen del proceso. Sabiendo que una página no puede contener partes de dos segmentos diferentes (pila, código o datos), hemos de determinar el tamaño de página que debería utilizar nuestro sistema y se barajan dos opciones: páginas de 4096 bytes (4K) o páginas de 512 bytes (1/2K). Se pide: 1. ¿Cuál sería la opción más apropiada, 4096 bytes o 512 bytes?. Justifica totalmente la respuesta mostrando todos los cálculos que has necesitado para llegar a dicha conclusión. 2. ¿Cuál es el formato de cada entrada de la Tabla de Páginas con el tamaño de página elegido? Justifica el tamaño de los campos con direcciones. ¿Cuántas entradas hay en la tabla de páginas (filas)?. Puedes añadir los bits que consideres necesarios para el buen funcionamiento del sistema indicando para que van a ser utilizados. NOTA: si no has sabido contestar la pregunta 1 elige cualquiera de las dos opciones, indícala expresamente y responde con ese dato a esta pregunta. 3. ¿Cuántas Tablas de Páginas habrá en este sistema? 4. (2,5 puntos) En la siguiente tabla se muestra esquemáticamente el contenido de un sistema de ficheros tipo UNIX. Algunos de los i-nodos se muestran en la primera fila, y algunos de los bloques de datos en la fila de abajo: 0 1 2 3 4 …. drwxr-xr-x linkcount=2 size=1024 bloque1=0 bloque2= -rw-r--r— linkcount=2 size=1 bloque1=1 bloque2= lrwxrwxrwx linkcount=1 size=1024 bloque1=2 bloque2= -rw-r--r— linkcount=0 size=1024 bloque1=3 bloque2= i-nodos . 0 .. 0 caso.txt 1 quiso.txt 1 queso.txt 2 3 ./quiso.txt ./coso.txt Datos El i-nodo correspondiente al directorio raíz es el 0. Se pide: 1. Mostrar la salida en pantalla que tendrá la ejecución del comando more * 2. Determinar el path absoluto del fichero que ocupa más espacio en el disco, y explicar por qué necesitamos más sectores para él y qué ventajas puede aportar ese gasto extra. 3. Indicar la secuencia de llamadas al sistema necesarias para ejecutar la orden ls / Indicar la diferencia en el caso de ejecutar ls –l / para obtener tamaños, fechas y permisos de los ficheros. 4. Determinar cual tarda más en salir por pantalla al ejecutar more * suponiendo que hay que recuperar los sectores sin tener inicialmente en bufferes RAM nada. Para ese cálculo suponer que recuperar un sector desde disco tarda 60 milisegundos y si está en caché solo tarda 40 microsegundos. 5. ¿Se puede determinar cual ha sido la secuencia de creación de todos los ficheros? Explica por qué, hasta el nivel que se pueda suponer con los datos del enunciado. 6. ¿Cómo podemos saber cuantos ficheros se pueden crear todavía en el disco? Nombre y Apellidos NIA PROBLEMA 1 1. Proceso Líneas que ejecuta Semáforo entrar_HM Semáforo abrir_puerta Semáforo ayudame Int quieren_entrar Int quieren_salir Explicación inicialmente 1 -1 0 0 0 2. Proceso Líneas que ejecuta Semáforo entrar_HM Semáforo abrir_puerta Semáforo ayudame Int quieren_entrar Int quieren_salir Explicación inicialmente 1 -1 0 0 0 Nombre y Apellidos NIA 3. Proceso Líneas que ejecuta Semáforo entrar_HM Semáforo abrir_puerta Semáforo ayudame Int quieren_entrar Int quieren_salir Explicación inicialmente 1 -1 0 0 0 Mezclador4 Entrar_ mezclador() Mezclador4 Salir_ mezclador() Mezclador5 Entrar_ mezclador() Mezclador5 Salir_ mezclador() Auxiliar4 Auxiliar_ abrir_y_cerrar() Auxiliar5 Auxiliar_ abrir_y_cerrar() 4. Nombre y Apellidos NIA PROBLEMA 2 1. FIFO Proceso E D C B A Tiempo 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Proceso peor tratado: Tiempo en el sistema tiempo en ejecución A B C D E media 2. RR q=1 Proceso E D C B A Tiempo 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Proceso peor tratado: Tiempo en el sistema tiempo en ejecución A B C D E media 3. RR q= 4 Proceso E D C B A Tiempo 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Proceso peor tratado: Tiempo en el sistema tiempo en ejecución A B C D E media Nombre y Apellidos NIA 4. SPN Proceso E D C B A Tiempo 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Proceso peor tratado: Tiempo en el sistema tiempo en ejecución A B C D E media 5. SRT Proceso E D C B A Tiempo 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Proceso peor tratado: Tiempo en el sistema tiempo en ejecución A B C D E media 6. SOLUCION 1. Proceso Líneas que ejecuta Semáforo entrar_HM Sem abrir_puerta Semáforo ayudame Int quieren_entrar Int quieren_salir Explicación inicialmente 1 -1 0 0 0 Mezclador1 Entrar_mezclador() 0 0 0 1 0 Bloquea el mutex, incrementa quieren_entrar, libera mutex, el wait(entrar_HM) no le bloquea a Mezclador1 pero impide que entre nadie más y el signal(abrir_puerta) deja abrir_puerta bloqueado. Las variables quedan como se indica a la izquierda. Mezclador1 Salir_mezclador() 1 -1 1 0 0 Bloquea mutex, decrementa quieren_entrar, no despierta a ningún auxiliar, libera mutex, libera entrar_HM para que entre otro y queda bloqueado para que le abran la puerta y salir Auxiliar1 Auxiliar_abrir_y_cerrar() 0 0 Se despierta para abir la puerta Mezclador1 Salir_mezclador() Se desbloquea 2. Proceso Líneas que ejecuta Semáforo entrar_HM Semá abrir_puerta Semáforo ayudame Int quieren_entrar Int quieren_salir Explicación inicialmente 1 -1 0 0 0 Mezclador1 Entrar_mezclador() 0 0 0 1 0 Bloquea el mutex, incrementa quieren_entrar, libera mutex, el wait(entrar_HM) no le bloquea a Mezclador1 pero impide que entre nadie más y el signal(abrir_puerta) deja abrir_puerta bloqueado. Las variables quedan como se indica a la izquierda. Mezclador2 Entrar_ mezclador() -1 1 2 Bloquea el mutex, incrementa quieren_entrar, libera mutex, wait(entrar_HM) le bloquea. Mezclador3 Entrar_ mezclador() -2 2 3 Bloquea el mutex, incrementa quieren_entrar, libera mutex, wait(entrar_HM) le bloquea. Mezclador1 Salir_ mezclador() -1 1 2 Bloquea el mutex, decrementa quieren_entrar, >1 no hace el signal y libera mutex Signal (entrar_HM) despierta a mezclador2 wait (abrir_puerta) lo deja bloqueado para salir. Mezclador2 Salir_ mezclador() 0 0 1 Se despierta de entrar_HM y hace un signal(abrir_puerta) para que M1 se vaya. Que queda bloqueado en abrir_puerta tambien. Mezclador3 Salir_ mezclador() 1 -1 1 0 Lanza un auxiliar, que nos dicen que tardará más que los tres juntos en estar dentro. El signal(entrar_HM) deja este parámetro a su estado inicial correctamente. Y se bloquea tambien en abrir_puerta. Mezclador1 Salir_ mezclador() Sale definitivamente (simplemente se desbloquea de su última instrucción) Mezclador2 Salir_ mezclador() Sale definitivamente (simplemente se desbloquea de su última instrucción) Auxiliar3 Abrir_Y_cerrar() 0 -1 0 Libera_abrir_puerta, y crea un hijo que vuelva a dejar el semáforo a -1. Mezclador3 Salir_ mezclador() 1 -1 0 0 0 Se desbloquea y se va 3. Proceso Líneas que ejecuta Semáforo entrar_HM Semáforo abrir_puerta Semáforo ayudame Int quieren_entrar Int quieren_salir Explicación inicialmente 1 -1 0 0 0 Mezclador4 Entrar_ mezclador() 0 0 0 1 0 Mezclador4 Salir_ mezclador() 1 -1 1 0 0 Mezclador5 Entrar_ mezclador() 0 0 1 1 0 Mezclador5 Salir_ mezclador() 1 -1 2 0 Auxiliar4 Auxiliar_ abrir_y_cerrar() 0 1 Auxiliar5 Auxiliar_ abrir_y_cerrar() 1 0 Puede entrar uno, pero al salir cree necesitar un auxiliar. Realmente sale porque otro de dentro entra dejándole ir. Este segundo también cree que necesita un auxiliar. Pero si ambos auxiliares hacen el signal(abrir_puerta), la dejan abierta para el siguiente mezclador que entre porque dejan el valor interno del semáforo a 2. 4. Entrar_mezclador(){ // no se ve afectado por cambio alguno wait(mutex); quieren_entrar++; signal(mutex); wait(entrar_HM); //intenta entrar en el HM signal(abrir_puerta); // el que está dentro puede salir } salir_mezclador(){ wait(mutex); quieren_entrar--; quieren_salir++; if (quieren_entrar < 1 ) signal(ayudame); // despertar auxiliar signal(mutex); signal(entrar_HM); //le dejo para que entre wait (abrir_puerta); //espera para salir del HM wait(mutex); quieren_salir--; signal(mutex); } auxiliar_abrir_y_cerrar(){ wait (mutex) if (quieren_entrar <1){ // si hay ya alguien encolado: no hago falta if (quieren_salir){ // y no sea que otro auxiliar ya lo haya dejado salir signal(abrir_puerta); } } signal(mutex); } SOLUCION 2: 1. FIFO E D C B A 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Proceso peor tratado: C Tiempo en el sistema Tiempo en ejecución A 3/3=1 B 7/5=1,4 C 7/2=3,5 D 6/5=1,2 E 8/5=1,6 Media 1,74 2. Round Robin q=1 E D C B A 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Proceso peor tratado: C Tiempo en el sistema tiempo en ejecución A 6/3=2 B 10/5=2 C 5/2=2,5 D 9/5=1,8 E 8/5=1,6 Media 1,98 3. Round Robin q=4 E D C B A 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Proceso peor tratado: C Tiempo en el sistema tiempo en ejecución A 3/3=1 B 9/5=1,8 C 6/2=3 D 10/5=2 E 8/5=1,6 Media 1,88 4. SPN E D C B A 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Proceso peor tratado: B Tiempo en el sistema tiempo en ejecución A 3/3=1 B 9/5=1,8 C 2/2=1 D 6/5=1,2 E 8/5=1,6 Media 1,32 5. SRT E D C B A 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Proceso peor tratado: B Tiempo en el sistema tiempo en ejecución A 3/3=1 B 9/5=1,8 C 2/2=1 D 6/5=1,2 E 8/5=1,6 Media 1,32 6. Para este conjunto de procesos, los algoritmos de planificación SPN y SRT obtienen los mismos resultados, y son los mejores de los 5 algoritmos probados, luego cualquiera de ellos sería el que deberíamos utilizar en nuestro sistema. SOLUCION 3 : 1. NP = número de páginas que necesito proceso código NP4096 NP512 pila NP4096 NP512 datos NP4096 NP512 A 4096 1 8 2000 1 4 2048 1 4 B 16384 4 32 8200 3 17 8192 2 16 C 2048 1 4 1000 1 2 1024 1 2 D 16384 4 32 8200 3 17 8192 2 16 E 16384 4 32 8200 3 17 8192 2 16 Con páginas de 4096 bytes necesitamos para poder ejecutar los 5 procesos cargar en memoria: 1+4+1+4+4+1+3+1+3+3+1+2+1+2+2 = 33 páginas Puesto que el sistema tiene un espacio de direcciones de 131072, el número de páginas posibles sería: 131072 / 4096 = 217 / 212 = 25 = 32 páginas. Para poder ejecutar los procesos necesitamos 33 páginas al menos, y solo tenemos capacidad para 32. Con páginas de 512 bytes necesitamos para poder ejecutar los 5 procesos cargar en memoria: 8+32+4+32+32+4+17+2+17+17+4+16+2+16+16 = 219 páginas Puesto que el sistema tiene un espacio de direcciones de 131072, el número de páginas posibles sería: 131072 / 512 = 217 / 29 = 28 = 256 páginas. Para poder ejecutar los procesos necesitamos 219 páginas al menos, y disponemos de 256 luego si es posible ejecutar estos procesos. Elegiremos pues páginas de 512 bytes. 2. El número de marcos de que disponemos en el sistema es: 32768 / 512 = 215 / 29 = 26 necesitamos 6 bits para hacer referencia al marco de página. marco de página P/A R M RO ... 6 bits 1 bit 1 bit 1 bit 1 bit 1 bit Cada proceso tiene su propia tabla de páginas, luego el número de entradas en la tabla de páginas dependerá de cual de los procesos (A, B, C, D o E) sea al que nos referimos. Para el proceso A, necesitaremos 16 entradas, tantas como páginas forman parte del proceso. 3. Serían al menos 5 tablas de página, una para cada proceso. SOLUCION 4 : 1. La salida por pantalla será 3 3 3 2. /queso.txt ya que además del bloque de datos con el contenido real necesita un bloque para almacenar el path, y consume un i-nodo además de la entrada en el directorio como el resto. 3. ls / opendir / readdir . readdir .. readdir caso.txt readdir quiso.txt readdir queso.txt closedir / ls –l / opendir / readdir . readdir .. readdir caso.txt stats caso.txt readdir quiso.txt stats quiso.txt readdir queso.txt stats queso.txt closedir / 4. caso.txt Leer i-nodo 0 60ms Leer / 60 ms Leer i-nodo 1 60 ms Leer bloque 1 60 ms quiso.txt Leer i-nodo 0 40µs Leer / 40µs Leer i-nodo 1 40µs Leer bloque 1 40µs queso.txt Leer i-nodo 0 40µs Leer / 40µs Leer i-nodo 2 60 ms Leer bloque 2 60 ms Leer i-nodo 0 40µs Leer / 40µs Leer i-nodo 1 40µs Leer bloque 1 40µs Tarda más al principio porque el acceso a disco es órdenes de magnitud más lento que el acceso a RAM. 5. queso.txt es un enlace simbólico a quiso.txt, luego primero tuvo que existir quiso para que se pudiese ejecutar la orden ln –s. En cuanto a caso.txt y quiso.txt, deberíamos tener acceso a la fecha de creación. No obstante el orden de creación será el de introducción en el directorio, por lo que parece que primero se creó caso.txt y luego se usó la orden ln para crear quiso.txt. 6. La información de cuantos i-nodos hay está en el superbloque y bastaría restar los ocupados, pero además hay un mapa para indicar cuales están ocupados y cuales libres. Sistemas Operativos 2001-2002 16 de 16 v 1.2 ssoo2@arcos.inf.uc3m.es __MACOSX/coleccion-examenes/2002/septiembre2002/._2002sept_02_web.doc coleccion-examenes/2002/septiembre2002/exasep2002.doc UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INFORMÁTICA Examen de SISTEMAS OPERATIVOS. INGENIERÍA EN INFORMÁTICA. 12-septiembre-2002 Fecha de publicación de las notas: 20-septiembre-2002 Fecha de revisión: 23-septiembre-2002 a las 11:30 (laboratorio 2.2B08) Para la realización del presente examen se dispondrá de 2 horas y media No se pueden utilizar libros ni apuntes Ejercicio 1 (4 puntos) Sea el siguiente programa denominado bucle_procesos: int main (int argc, char **argv) { int contador, i, pid; contador = atoi(argv[1]); i = 0; while (i < contador) { pid = fork(); i++; } a.) Explique qué hace y dibuje un diagrama con la jerarquía de procesos que se origina cuando se ejecuta el mandato bucle_procesos 4. b.) Explique qué es un proceso zombie y cuándo se producen. c.) ¿Se generan procesos zombies al ejecutar el mandato anterior? Explique su respuesta. d.) ¿Qué ocurriría si se ejecutara bucle_procesos 100? Explique la respuesta y modifique el programa para que se solucione el problema existente. e.) Modifique el programa anterior para que todos los procesos generados puedan compartir el archivo denominado pepe.txt. Explique su solución. Ejercicio 2 (3 puntos) Sean las dos instrucciones máquina siguientes: LD R7, A # Carga en el registro R7 el contenido de la posición de memoria A SUB B,R7, C # Resta C a R7 y lo almacena en B. B y C direcciones de memoria Asumiendo que se ejecutan en un computador con memoria virtual y que cada instrucción y cada operando ocupa una palabra de memoria, conteste a las siguientes preguntas: a.) ¿Cuántos marcos de página serían necesarios para ejecutar estas instrucciones teniendo en cuenta un modelo de proceso en el que texto y datos están en distintos segmentos? Explique su respuesta. b.) ¿Cuántos fallos de página se podrían producir como máximo debidos a la ejecución de las dos instrucciones anteriores? Explique su respuesta. c.) ¿Qué cambiaría si se usara direccionamiento relativo directo para A, B y C (sumando las direcciones a un registro)? ¿Y si se usara direccionamiento indirecto? Ejercicio 3 (3 puntos) El siguiente programa intenta implementar el siguiente mandato: dividir f1 f2 f3 Este mandato lee el archivo f1 y crea dos archivos (f2 y f3). En el archivo f2 se escriben los bytes situados en las posiciones pares de f1 y en el archivo f3 los bytes situados en las posiciones impares. Así, si el contenido de f1 es 12121212121212 · El contenido de f2 será 1111111 · El contenido de f3 será 2222222 void main (int argc, char *argv[]) { int fd1, fd2, fd3; char c; int size; int i; fd1= open(argv[1], O_RDONLY); fd2= creat(argv[2], 0640); fd3= creat(argv[3], 0640); size = lseek(fd1, 0, SEEK_END); lseek(fd1, 0, SEEK_SET); if (fork() == 0) { for ( i = 0; i < size; i = i + 2) { lseek(fd1, i, SEEK_SET); read(fd1, &c, 1); write(fd2, &c, 1); } } else { for ( i = 1; i < size; i = i + 2) { lseek(fd1, i, SEEK_SET); read(fd1, &c, 1); write(fd3, &c, 1); } } close(fd1); close(fd2); close(fd3); exit(0); } Se pide: a) Suponiendo que el programa es correcto, modifique el programa para que haga un correcto tratamiento de todas las llamadas al sistema. b) ¿Por qué el programa anterior no consigue el funcionamiento esperado para el mandato dividir? Razone su respuesta. c) Suponiendo que la implementación sigue utilizando dos procesos, proponga dos modificaciones que resuelvan el problema del apartado b. __MACOSX/coleccion-examenes/2002/septiembre2002/._exasep2002.doc coleccion-examenes/2002/septiembre2002/Icon __MACOSX/coleccion-examenes/2002/septiembre2002/._Icon __MACOSX/coleccion-examenes/2002/._septiembre2002 __MACOSX/coleccion-examenes/._2002 coleccion-examenes/2003/exa-junio2003.doc UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INFORMÁTICA Examen de SISTEMAS OPERATIVOS. INGENIERÍA EN INFORMÁTICA. 3 de junio de 2003 Fecha de publicación de las notas: 9-junio-2003 Fecha de revisión: 12-junio-2003 a las 11:30 (laboratorio 2.2B08) Para la realización del presente examen se dispondrá de 2 horas y media No se pueden utilizar libros ni apuntes Teoría 1. 1 punto Exponga brevemente las relaciones entre grado de multiprogramación y memoria principal en los casos de sistemas sin memoria virtual y sistemas con memoria virtual. Teoría 2. 1 punto En una máquina que se utiliza como servidor web se ha detectado que el grado de utilización del procesador es del 98%. ¿Qué medidas recomendaría para aumentar el rendimiento global del sistema? Problema 1. 2,5 puntos En un determinado sistema operativo los procesos se ejecutan en función de su prioridad. Cuando varios procesos tienen la misma prioridad se utiliza una política FIFO. En la siguiente tabla se especifica para cada proceso, su prioridad, su tiempo de llegada, el tiempo que necesitan para ejecutarse. PROCESOS PRIORIDAD T. DE LLEGADA T DE EJECUCIÓN P1 2 0 500 P2 3 200 300 P3 1 300 400 P4 3 500 1000 P5 2 700 600 Se desea calcular: a) El tiempo que cada proceso se mantiene en espera desde su llegada al sistema hasta que finaliza. b) El tiempo de retorno de cada proceso (tiempo transcurrido desde que el proceso llega hasta que finaliza su ejecución). c) El tiempo medio de espera y el tiempo medio de retorno. Realice estos cálculos para las dos situaciones siguientes: 1. Planificación sin expulsión. 2. Planificación con expulsión. Problema 2. 2,5 puntos Una memoria virtual dispone de 9 marcos para programas. En ese momento se está ejecutando el proceso P1, que tiene concedidos 3 marcos y piden memoria los procesos P2 y P3 de 100 Kb y 50 Kb respectivamente. Se realiza un reparto de los marcos libres de forma proporcional al tamaño de los procesos y ambos entran en ejecución. Cuando el proceso P3 demanda por primera vez la página 3 el proceso P1 termina y sus marcos se reparten tren los procesos P2 y P3 de forma proporcional a sus tamaños. a) Determine cuantos marcos de página corresponden a cada proceso en cada instante. b) Determine cuantos fallos de página se producen en el proceso P3 si la secuencia de petición de páginas es la siguiente: 1,2,1,5,2,3,7,6,5,4,3,7,5,6,4,3,2,1,5,4,2,7 Compare los resultados de este apartado para las políticas FIFO y LRU. Problema 3. 3 puntos Sea un programa que ejecuta sobre una máquina UNIX y que realiza las siguientes operaciones sobre un determinado fichero: int fd; ... fd = creat( "shared”, 0755 ); ... fork(); fork(); ... /* Padre */ write( fd, "Soy P\n”, 6 ); write( fd, "Adiós\n”, 6 ); exit(1); /* Hijo 1 */ write( fd, "Soy H1\n”, 7 ); lseek( fdm 1024, SEEK_CUR ); /* Desde posición actual */ exit(1); /* Hijo 2 */ write( fd, "Soy H2\n”, 7 ); exit(1); Conteste a las siguientes preguntas: a) ¿Cuál sería el tamaño final del fichero? ¿Sería distinto si el lseek se realizara en último lugar? b) ¿Cuál sería el contenido final del fichero (examine las diferentes posibilidades)? c) ¿Qué estructuras de datos permiten relacionar los descriptores de fichero de los procesos con los nodos-i? Dibuje claramente estas estructuras reflejando los tres procesos y el fichero del ejemplo. coleccion-examenes/2003/Icon __MACOSX/coleccion-examenes/2003/._Icon coleccion-examenes/2003/sol-junio2003.doc UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INFORMÁTICA Examen de SISTEMAS OPERATIVOS. INGENIERÍA EN INFORMÁTICA. 3 de junio de 2003 Fecha de publicación de las notas: 9-junio-2003 Fecha de revisión: 12-junio-2003 a las 11:30 (laboratorio 2.2B08) Para la realización del presente examen se dispondrá de 2 horas y media. No se pueden utilizar libros ni apuntes. Debe contestar cada ejercicio en hojas separadas, numeradas de forma independiente. Teoría 1. [1 punto] Exponga brevemente las relaciones entre grado de multiprogramación y memoria principal en los casos de sistemas sin memoria virtual y sistemas con memoria virtual. Sección 3.2.3 del libro de texto (página 82) Teoría 2. [1 punto] En una máquina que se utiliza como servidor web se ha detectado que el grado de utilización del procesador es del 98%. ¿Qué medidas recomendaría para aumentar el rendimiento global del sistema? En presencia de memoria virtual un rendimiento del procesador cercano al 100% indica que no se está produciendo hiperpaginación. De hecho, el sistema podría albergar más procesos en memoria, por lo que un incremento de memoria no incrementaría el rendimiento del sistema. La medida más aconsejable es sustituir el procesador por otro de mayor velocidad o bien incrementar el número de procesadores (si es posible). Problema 1. [2,5 puntos] En un determinado sistema operativo los procesos se ejecutan en función de su prioridad. Cuando varios procesos tienen la misma prioridad se utiliza una política FIFO. En la siguiente tabla se especifica para cada proceso, su prioridad, su tiempo de llegada, el tiempo que necesitan para ejecutarse. PROCESOS PRIORIDAD T. DE LLEGADA T DE EJECUCIÓN P1 2 0 500 P2 3 200 300 P3 1 300 400 P4 3 500 1000 P5 2 700 600 Se desea calcular: a) El tiempo que cada proceso se mantiene en espera desde su llegada al sistema hasta que finaliza. b) El tiempo de retorno de cada proceso (tiempo transcurrido desde que el proceso llega hasta que finaliza su ejecución). c) El tiempo medio de espera y el tiempo medio de retorno. Realice estos cálculos para las dos situaciones siguientes: 1. Planificación sin expulsión. 2. Planificación con expulsión. En el caso de planificación sin expulsión una vez que un proceso adquiere la CPU no la libera hasta que no ha finalizado su ejecución. La traza de la ejecución sería: T P1 P2 P3 P4 P5 Cons. Pend. Cons. Pend. Cons. Pend. Cons. Pend. Cons. Pend. 0 0 500 0 0 0 0 0 0 0 0 200 200 300 0 300 0 0 0 0 0 0 300 300 200 0 300 0 400 0 0 0 0 500 500 0 0 300 0 400 0 1000 0 0 700 500 0 0 300 200 200 0 1000 0 600 900 500 0 0 300 400 0 0 1000 0 600 1500 500 0 0 300 400 0 0 1000 600 0 1800 500 0 300 0 400 0 0 1000 600 0 2800 500 0 300 0 400 0 1000 0 600 0 Para determinar el tiempo de retorno habrá que restar el momento en que el proceso ha terminado del momento en el que el proceso se ha iniciado: inicio fin retorno T T T - = Para determinar el tiempo de espera habrá que deducir del tiempo de retorno el tiempo que efectivamente el proceso ha pasado en ejecución: ejecucion retorno espera T T T - = Proceso Tiempo de retorno Tiempo de espera P1 500 – 0 = 500 500 – 500 = 0 P2 1800 – 200 = 1600 1600 – 300 = 1300 P3 900 – 300 = 600 600 – 400 = 200 P4 2800 – 500 = 2300 2300 – 1000 = 1300 P5 1500 – 700 = 800 800 – 600 = 200 Media 5800/5 = 1160 3000/5 = 600 En el caso de planificación con expulsión un proceso liberará la CPU si llega a la cola de procesos otro proceso con mayor prioridad. La traza de ejecución sería: T P1 P2 P3 P4 P5 Cons. Pend. Cons. Pend. Cons. Pend. Cons. Pend. Cons. Pend. 0 0 500 0 0 0 0 0 0 0 0 200 200 300 0 300 0 0 0 0 0 0 300 300 200 0 300 0 400 0 0 0 0 500 300 200 0 300 200 200 0 1000 0 0 700 300 200 0 300 400 0 0 1000 0 600 900 500 0 0 300 400 0 0 1000 0 600 1500 500 0 0 300 400 0 0 1000 600 0 1800 500 0 300 0 400 0 0 1000 600 0 2800 500 0 300 0 400 0 1000 0 600 0 Los tiempos de retorno y de espera para cada proceso serán: Proceso Tiempo de retorno Tiempo de espera P1 900 – 0 = 900 900 – 500 = 400 P2 1800 – 200 = 1600 1600 – 300 = 1300 P3 700 – 300 = 400 400 – 400 = 0 P4 2800 – 500 = 2300 2300 – 1000 = 1300 P5 1500 – 700 = 800 800 – 600 = 200 Media 6000/5 = 1200 3200 / 5 = 640 Problema 2. [2,5 puntos] Una memoria virtual dispone de 9 marcos para programas. En ese momento se está ejecutando el proceso P1, que tiene concedidos 3 marcos y piden memoria los procesos P2 y P3 de 100 Kb y 50 Kb respectivamente. Se realiza un reparto de los marcos libres de forma proporcional al tamaño de los procesos y ambos entran en ejecución. Cuando el proceso P3 demanda por primera vez la página 3 el proceso P1 termina y sus marcos se reparten tren los procesos P2 y P3 de forma proporcional a sus tamaños. a) Determine cuantos marcos de página corresponden a cada proceso en cada instante. b) Determine cuantos fallos de página se producen en el proceso P3 si la secuencia de petición de páginas es la siguiente: 1,2,1,5,2,3,7,6,5,4,3,7,5,6,4,3,2,1,5,4,2,7 Compare los resultados de este apartado para las políticas FIFO y LRU. a) Cuando los procesos P2 y P3 piden memoria el número de marcos libres es 6 pues 3 marcos están asignados al proceso P1. Como el reparto es proporcional al tamaño de los procesos, se tendrá Proceso Tamaño Factor Marcos asignados P2 100 100/150 = 0,67 0,67 * 6 = 4,02 = 4 P3 50 50/150 = 0,33 0,33 * 6 = 1,98 = 2 Cuando el proceso P1 termina se reparten sus 3 marcos entre los procesos P2 y P3. Proceso Factor Nuevos Marcos Total Marcos P2 0,67 0,67 * 3 = 2,01 = 2 6 P3 0,33 0,33 * 3 = 0,99 = 1 3 b) La secuencia de peticiones del proceso P3 se puede dividir en dos partes. La primera parte está formada por la secuencia de peticiones anteriores a la primera petición de la página 3, ya que durante este periodo P3 tiene asignados 2 marcos de página. La segunda parte está formada por el resto de la secuencia y durante este tiempo el proceso P3 tiene asignados 3 marcos de página. Si se aplica la política FIFO se tiene: Referencia 1 2 1 5 2 M1 1 1 1 5 5 M2 - 2 2 2 2 Fallo * * * Y cuando se adquiere el tercer fallo de página: Referencia 3 7 6 5 4 3 7 5 6 4 3 M1 5 5 6 6 6 3 3 3 6 6 6 M2 2 7 7 7 4 4 4 5 5 5 3 M3 3 3 3 5 5 5 7 7 7 4 4 Fallo * * * * * * * * * * * Referencia 2 1 5 4 2 7 M1 2 2 2 4 4 4 M2 3 3 5 5 5 7 M3 4 1 1 1 2 2 Fallo * * * * * * Así el número de fallos con política FIFO es de 20. Si se aplica LRU: Referencia 1 2 1 5 2 M1 1+ 1 1+ 1 2+ M2 - 2+ 2 5+ 5 Fallo * * * * Y cuando se adquiere el tercer fallo de página: Referencia 3 7 6 5 4 3 7 5 6 4 3 M1 2 2 6+ 6 6 3+ 3 3 6+ 6 6 M2 5 7+ 7 7 4+ 4 4 5+ 5 5 3+ M3 3+ 3 3 5+ 5 5 7+ 7 7 4+ 4 Fallo * * * * * * * * * * * Referencia 2 1 5 4 2 7 M1 2+ 2 2 4+ 4 4 M2 3 3 5+ 5 5 7+ M3 4 1+ 1 1 2 2 Fallo * * * * * * Así el número de fallos con política LRU es de 21. Problema 3. [3 puntos] Sea un programa que ejecuta sobre una máquina UNIX y que realiza las siguientes operaciones sobre un determinado fichero: int fd; ... fd = creat( "shared”, 0755 ); ... fork(); fork(); ... /* Padre */ write( fd, "Soy P\n”, 6 ); write( fd, "Adiós\n”, 6 ); exit(1); /* Hijo 1 */ write( fd, "Soy H1\n”, 7 ); lseek( fd, 1024, SEEK_CUR ); /* Desde posición actual */ exit(1); /* Hijo 2 */ write( fd, "Soy H2\n”, 7 ); exit(1); Conteste a las siguientes preguntas: a) ¿Cuál sería el tamaño final del fichero? ¿Sería distinto si el lseek se realizara en último lugar? b) ¿Cuál sería el contenido final del fichero (examine las diferentes posibilidades)? c) ¿Qué estructuras de datos permiten relacionar los descriptores de fichero de los procesos con los nodos-i? Dibuje claramente estas estructuras reflejando los tres procesos y el fichero del ejemplo. a) El tamaño del fichero depende del orden relativo de ejecución de las operaciones entre los distintos procesos. Tamaños posibles son: 26, 1024 Si el lseek se realiza en último lugar el tamaño sería 26 porque lseek solamente cambia el valor del puntero, pero el tamaño del archivo no se modifica hasta que no se realiza una escritura. b) Existen diversas posibilidades en cuanto al contenido del archivo. Las cinco operaciones sobre el archivo se pueden ejecutar en cualquier orden que cumpla las siguientes restricciones. La sentencia: write( fd, "Soy P\n”, 6 ); debe ejecutarse antes que la sentencia: write( fd, "Adiós\n”, 6 ); Además, la sentencia: write( fd, "Soy H1\n”, 7 ); debe ejecutarse antes que la sentencia: lseek( fd 1024, SEEK_CUR ); /* Desde posición actual */ Como ejemplo se muestran a continuación dos posibilidades. Posibilidad 1: Soy P Adiós Soy H2 Soy H1 <eof> Posibilidad 2: Soy P Adiós Soy H1 <1024 bytes a 0> Soy H2 <eof> c) Dentro del BCP (bloque de control de procesos) cada proceso mantiene una tabla con los descriptores de los archivos abiertos. Cada entrada apunta a una entrada de la tabla de archivos donde se almacena el puntero al nodo-i y la posición dentro del archivo. Tabla de archivos abiertos. Padre 0 1 2 3 4 fd Tabla de archivos abiertos. H2 0 1 2 3 4 fd Tabla de archivos abiertos. H1 0 1 2 3 4 fd Tabla intermedia de nodos-i y posiciones Tabla de nodos-i Nodo-i Posición _1116065270.unknown _1116080554.unknown _1116065177.unknown coleccion-examenes/2003/sol-sep-2003.doc UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INFORMÁTICA Examen de SISTEMAS OPERATIVOS. INGENIERÍA EN INFORMÁTICA. 11 de septiembre de 2003. 9:30. Fecha de publicación de las notas: 19-septiembre-2003 Fecha de revisión: 22-septiembre-2003 a las 15:30 (laboratorio 2.2B08) Para la realización del presente examen se dispondrá de 2 horas y media No se pueden utilizar libros ni apuntes Teoría 1. (1 punto). Describa el ciclo de vida de un proceso y los estados que puede atravesar durante el mismo. Dibuje el grafo de los mismos. Teoría 2. (1 punto). Describa la estructura de un archivo en UNIX. Problema 1. (2 puntos) Escriba un programa en C que cree un proceso padre que genere 10 hijos y espere por todos. Cuando todos los hijos hayan terminado, el padre debe terminar la ejecución. Todos los procesos hijo son iguales: arrancan y se duermen una cantidad de tiempo aleatoria entre 1 y 10 segundos. Nota: La función rand() devuelve un número aleatorio entre 0 y el entero mayor. Úsela para calcular el tiempo a dormir. #include <stdio.h> void hijo(int t) { sleep(t); } int main() { const int MAX_PROC = 10; int i, pid, estado, tiempo; int pids[MAX_PROC]; for (i=0;i<MAX_PROC;i++) { tiempo = rand() % 10 + 1; pid = fork(); switch (pid) { case -1: /* error en fork */ fprintf(stderr, "Error en la creación de proceso hijo\n"); exit(-1); case 0: /* proceso hijo */ hijo(tiempo); printf("proceso %d finalizado\n", i); exit(0); default: /* proceso padre */ pids[i] = pid; break; } } for (i=0;i<MAX_PROC;i++) { waitpid(pids[i], &estado, 0); printf("Proceso %d esperado\n", i); } return 0; } Problema 2. (3 puntos) Sea un sistema de memoria virtual sin preasignación de swap y que usa la técnica del almacenamiento intermedio (buffering) de páginas. En dicho sistema se pretenden estudiar los distintos estados por los que va pasando una página de un proceso durante la ejecución del mismo, dependiendo del segmento al que pertenezca la página. Para ello vamos a considerar como estado de una página en un determinado momento, el lugar de donde la obtendría el proceso al accederla en ese instante. Se distinguen, por lo tanto, los siguientes estados: · Del fichero (F). · De la memoria principal asignada al proceso (P). · De la lista de páginas modificadas (M) (almacenamiento intermedio). · De la lista de páginas libres (L) (almacenamiento intermedio). · Del dispositivo de swap (S). Asimismo, para analizar las transiciones entre estados, se considerarán, al menos, los siguientes eventos: · Fallo de página (F). · Extracción (XT): se le quita la página al proceso pasando el marco al almacenamiento intermedio. · Expulsión (XP): se elimina la página de la memoria principal liberando el marco. · Escritura de la página al dispositivo o fichero (W) permaneciendo en el almacenamiento intermedio. Por último, las transiciones entre estados, además de estar dirigidas por estos eventos, podrán depender de condiciones tales como que la página haya sido modificada o no. Se pide dibujar, para los tipos de páginas que se plantean a continuación, el diagrama de estados que muestra todos los estados en los que puede estar una página, indicando con flechas los eventos y/o condiciones que producen las transiciones. En cada caso, se usarán los estados y eventos que sean pertinentes, y se explicarán los aspectos más relevantes de cada diagrama identificando cuando se producen operaciones de acceso al disco. a) Una página de código. b) Una página de datos con valor inicial. ¿Se podrían servir del fichero ejecutable sucesivos fallos asociados a una misma página de este tipo? c) Una página de datos sin valor inicial. Una de las situaciones que se debe considerar es el caso de una página de este tipo que se accede por primera vez con una lectura y que se expulsa sin haber realizado más accesos sobre la misma. Solución a) Las páginas de código no se modifican por lo que nunca pasarán a la lista de páginas modificadas del almacenamiento intermedio. Además, debido a ello, no se almacenarán en el dispositivo de swap sino que los fallos de página se servirán directamente del fichero ejecutable. El diagrama de estados correspondiente a una página de código sería el siguiente: Donde las transiciones se corresponden con los siguientes eventos e implican las siguientes operaciones: 1. Evento F: Se trae la página del ejecutable (F) a memoria principal (P). Se produce un acceso de lectura al fichero ejecutable. 2. Evento XT: El algoritmo de reemplazo le quita la página al proceso pasándola al almacenamiento intermedio. Puesto que las páginas de código no se modifican, pasará a la lista de páginas libres (L). 3. Evento F: Se recupera la página de la lista de páginas libres del almacenamiento intermedio (L). Gracias a la técnica del almacenamiento intermedio se ha podido servir un fallo de página sin realizar operaciones de E/S al disco. 4. Evento XP: Se elimina la página del almacenamiento intermedio liberando el marco para que pueda usarse para otra página. Se transita al estado F ya que el siguiente fallo de página deberá servirse del fichero ejecutable. b) Una página de datos con valor inicial se servirá la primera vez desde el ejecutable y posteriormente desde el dispositivo de swap , ya que las modificaciones que se produzcan sobre la página no deben reflejarse en el fichero ejecutable. En realidad, se podrían servir del ejecutable varios fallos asociados a una misma página de este tipo mientras que dicha página no haya sido modificada conservando el mismo contenido inicial. El diagrama de estados correspondiente a una página de este tipo sería el siguiente: Donde las transiciones se corresponden con los siguientes eventos e implican las siguientes operaciones: 1. Evento F: Se trae la página del ejecutable (F) a memoria principal (P). Se produce un acceso de lectura al fichero ejecutable. 2. Evento XT y la página no se ha modificado (bit M igual a 0): El algoritmo de reemplazo le quita la página al proceso pasándola a la lista de páginas libres (L). 3. Evento F: Se recupera la página de la lista de páginas libres del almacenamiento intermedio (L). 4. Evento XT y la página se ha modificado (bit M igual a 1): El algoritmo de reemplazo le quita la página al proceso pasándola a la lista de páginas modificadas (M). 5. Evento F: Se recupera la página de la lista de páginas modificadas del almacenamiento intermedio (M). 6. Evento W: Las páginas que están en la lista de modificadas se van escribiendo de forma agrupada al swap. Este evento indica que ha finalizado la operación de escritura en el disco de una determinada página y que, por lo tanto, debe pasar a la lista de páginas libres (L). Nótese que, al tratarse de un sistema sin preasignación de swap, la primera vez que se produzca esta situación, no habrá una copia en el disco para esa página por lo que en ese momento habrá que reservar espacio para la misma. 7. Evento XP y hay copia en swap de la página: Se elimina la página del almacenamiento intermedio liberando el marco para que pueda usarse para otra página. Se transita al estado S ya que el siguiente fallo de página deberá servirse de la copia en el dispositivo de swap. Nótese que en este momento no hay que escribir sobre la copia en swap ya que dicha copia se actualizó cuando esta página pasó por la lista de páginas modificadas (M). 8. Evento F: Se trae la página del dispositivo de swap (S) a memoria principal (P). Se produce un acceso de lectura a dicho dispositivo. 9. Evento XP y no hay copia en swap de la página: La no existencia de una copia de la página en swap indica que la página no se ha modificado y, por lo tanto, su contenido es idéntico al inicial por lo que el siguiente fallo de página podría servirse del ejecutable. Esta transición implica la eliminación de la página del almacenamiento intermedio y el cambio al estado F. c) Una página que pertenece a la región de datos sin valor inicial no está almacenada en el ejecutable. Únicamente aparece en la cabecera del mismo el tamaño de dicha región. Cuando se produce el primer fallo de página, se busca un marco libre y, por razones de confidencialidad de la información, se rellena con ceros. En el caso de que dicha página rellena con ceros sea expulsada sin modificarse (situación poco probable pero posible), habría que reservarla espacio de swap puesto que necesita un lugar para almacenarse al no estar incluida en el ejecutable. El diagrama resultante sería muy similar al del apartado anterior y presentaría el siguiente aspecto: Donde las transiciones se corresponden con los siguientes eventos e implican las siguientes operaciones: 1. Evento F: Se busca un marco libre en memoria principal (P) y se rellena con ceros. 2. Evento XT y la página no se ha modificado (bit M igual a 0): El algoritmo de reemplazo le quita la página al proceso pasándola a la lista de páginas libres (L). 3. Evento F: Se recupera la página de la lista de páginas libres del almacenamiento intermedio (L). 4.
Compartir