Anda di halaman 1dari 7

Examen final de Sistemas Operativos Solucin

25 de Junio de 2002. Segundo curso de Ingenieras Tcnicas de Informtica de Sistemas y de Gestin, URJC.

Problema 1 (1 puntos) Haz un script que muestre los ficheros (slo los ficheros normales) que tengan al menos 10000 octetos en el directorio actual. Puedes usar como punto de partida el comando ls -l. ste es un ejemplo de la salida del mismo.
-rw-rw-r-1 anto anto 141264 may 13 18:43 projecte_LCU.pdf 4096 may 30 20:19 proyectos 4096 dic 24 4096 feb 14646 jun 2000 prv 7 12:09 public_html 3 10:16 sep01.pdf 7 18:51 servid~1.adb drwxr-x--x 26 anto anto drwxr-x--x 14 anto anto drwxr-xr-x -rw-rw-r--rw-rw-r-9 anto anto 1 anto anto

1 anto anto 246323 may

Solucin Suponiendo que slo piden que mostremos los nombres, bastara un
ls -l | egrep ^-.*[1-9][0-9][0-9][0-9][0-9]

que imprimira las lneas que contienen al menos cinco dgitos seguidos de un espacio en blanco y comienzan por - (al exigir que tras los nmeros tengamos un espacio en blanco, eliminamos posibilidad de confusin con nombres de fichero que sean numricos). Si queremos slo los nombres podemos cortar el resto de los campos con cut o con awk, dado que todos conoceis cut, en la solucin vamos a usar awk:
ls -l | grep ^-.*[1-9][0-9][0-9][0-9][0-9] | awk -F {print $NF}

-2-

Problema 2 (2 puntos) Dado el siguiente trozo de cdigo:


Fd, R, L: Integer; A: System.Address; type Buffer is record Buf: String(1..256); Lon: Integer; end record; P: access to Buffer; begin Fd:= Creat("buffer", 8#777#); R:= Lseek(Fd, 256, SEEK_SET); A:= Mmap(0, 256, PROT_READ+PROT_WRITE, MAP_SHARED, Fd, 0); R:= Close(Fd); P:= A; if Fork = 0 then loop Read(1, P.Buf, 256, P.Lon); exit when P.Lon=0; end loop; else while P.Lon > 0 loop R:= Write(0, P.Buf, P.Lon); end loop; end if;

a) b) c)

Qu parece querer hacer el mismo? Qu errores encuentras? Qu mecanismos de Unix podras usar para coordinar el acceso de los procesos padre e hijo al Buffer? Ten en cuenta que no puedes usar los semforos que os proporcionamos para la prctica.

Solucin El cdigo parece que est pensado para copiar de la entrada a la salida estndar de tal forma que un proceso lee, el otro escribe y ambos se comunican usando un buffer de memoria compartida. Hay algunas cosas que suponen errores: 1 2 El fichero que proyectamos con el mmap se abre tras crearlo con creat y queda abierto WRONLY, con lo que no se puede hacer un mmap que incluya como permiso PROTREAD. Falta una llamada a write tras el lseek para hacer crecer el fichero hasta el tamao del buffer. El lseek no escribe nada por si solo y por tanto no cambia el tamao de buffer (que seguir teniendo 0 bytes). Hara falta escribir tras el lseek un Integer, para hacer que el fichero coincida con el tamao de la estructura de datos. El read debera hacerse del descriptor 0, que es la entrada. El write debera hacerse del descriptor 1, que es la salida. No se comprueban condiciones de error en ninguna de las llamadas. Los procesos no se sincronizan al acceder al buffer, con lo que las condiciones de carrera harn que el programa no funcione. Para coordinar el acceso al buffer se podran emplear dos pipes. Podramos crearlos antes del fork con:
pipe(canread); pipe(canwrite);

3 4 5 6

Y luego cambiar el cdigo como sigue:

-3-

write(canread(1), " ", 1); if Fork = 0 then loop Read(canread(0), temp, 1, X); Read(1, P.Buf, 256, P.Lon); Write(canwrite(1), " ", 1); exit when P.Lon=0; end loop; else while P.Lon > 0 loop Read(canwrite(0), temp, 1, X); R:= Write(0, P.Buf, P.Lon); Write(canread(1), " ", 1); end loop; end if;

De tal modo que el lector no sobreescribe el buffer hasta que el escritor termin de escribirlo, y el escritor no escribe ningn buffer hasta que dicho buffer se ha leido. Problema 3 (2 puntos) Se pide escribir un programa concurrente que conste de dos procesos concurrentes A y B sincronizados mediante semforos de tal manera que el resultado final de la ejecucin sea que los procesos escriban en la salida estandar en secuencia lo siguiente: " " " " Primero el proceso A debe escribir: Soy A Segundo el proceso B debe escribir: Soy B Tercero el proceso A debe escribir: Termino A Cuarto el proceso B debe escribir: Termino B

Solucin Podra quedar como sigue:


Acontinua: Semaphore := 0; Bcontinua: Semaphore := 0; Program A is begin Put("Soy A"); signal(Bcontinua); wait(Acontinua); Put("Termino A"); signal(Bcontinua); end; Program B is begin wait(Bcontinua); Put("Soy B"); signal(Acontinua); wait(Bcontinua); Put("Termino B"); end;

-4-

Problema 4 (3 puntos) Tenemos un sistema operativo que tiene las siguientes caractersticas: " " Memoria virtual con paginacin bajo demanda. Planificacin con dos niveles de prioridad dinmica que utiliza round-robin (quantum de 100ms) dentro del mismo nivel de prioridad y recalcula la prioridad segn la siguiente regla: Si se consume el cuanto se baja la prioridad, en caso contrario se sube. Al principio de cada rfaga los procesos entran en la prioridad alta. Tabla de pginas de dos niveles, con 1024 entradas tanto en las tablas de primer nivel como en las de segundo nivel. Direcciones virtuales de 32 bits.

" "

En dicho sistema tenemos dos procesos que van a ejecutar a partir de t=0. Ambos procesos se comportan como sigue: " " " Se meten en un bucle durante 50ms, usando las pginas 2 y 4 de memoria virtual. Hacen entrada/salida durante 100ms. Se meten en un bucle durante 150ms, usando la pginas 2 y 3 de memoria virtual.

Disponemos de 4 marcos de pgina libres (adems de los empleados para guardar el sistema operativo y las tablas de pginas de los dos procesos, que nunca se liberan bajo ningn concepto). Se pide: " Dibuja un diagrama de planificacin (tiempo/procesos) donde indiques el estado de cada proceso (listo/ejecutando/bloqueado) para cada intervalo de tiempo. Has de indicar tambin en qu nivel de prioridad (alto/bajo) se encuentra cada proceso. Indica para intervalo del diagrama anterior cual es el contenido de las tablas de pginas (nmero de marco, bits de presente/ausente, R y M) de cada proceso y qu pginas estn en cada uno de los marcos. Supn que el algoritmo de reemplazamiento es FIFO.

"

Puedes suponer que el tiempo necesario para traer una pgina de disco o para expulsarla es 0, igual que el tiempo necesario para cambiar de contexto. Solucin La planificacin puede verse en la figura 1. El nico punto destacable es que hay un intervalo en que ninguno de los dos procesos est listo para ejecutar, por lo que el sistema ejecutara la tarea idle (que se omite).
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

P1

run (hi)

blk (hi)

run (hi)

rdy (lo)

run (lo)

P2

rdy (hi)

run (hi)

blk (hi)

rdy (hi)

run (hi)

rdy (lo)

run (lo)

Figura 1. Los cambios de contexto estn indicados con lneas verticales discontinuas. En la figura, rdy indica listo para ejecutar , run indica ejecutando , blk indica bloqueado , hi indica prioridad alta y lo indica prioridad baja .

En cuanto a las tablas de pginas, dado que ninguno de los procesos accede a pginas con nmero mayor a 1024, slo se usar la primera tabla de segundo nivel en ambos procesos. Inicialmente, todas las entradas de la tabla de primer nivel estarn invlidas hasta la primera referencia a memoria de los procesos considerados. Tras sta, la primera entrada de la tabla de primer nivel en ambos procesos estar marcada como presente , y contendr el nmero de marco de la primera tabla de segundo nivel del proceso considerado. Las tablas de segundo nivel de ambos procesos parten con todo invlido ( Ausente ). Indicamos a

-5-

continuacin cmo quedan estas en cada intervalo de planificacin. En cada entrada indicamos el nmero de marco ( xxxxxxx si no lo sabemos o no nos importa), el bit de presente/ausente ( P/A ), el bit R de referenciado ( ? cuando no lo sabemos), y el bit M de modificado ( ? cuando no lo sabemos). t=0 t=50
Marcos 2 de P1 P1 xxxxxxxx P ? ? ...1024... xxxxxxxx A ? ? xxxxxxxx A ? ? xxxxxxxx A ? ? 00000000 P R ? xxxxxxxx A ? ? 00000001 P R ? ...1024... xxxxxxxx A ? ? Ninguna 4 de P1 X X P2

Nada an.

t=100
Marcos 2 de P1 P1 xxxxxxxx P ? ? ...1024... xxxxxxxx A ? ? xxxxxxxx A ? ? xxxxxxxx A ? ? 00000000 P R ? xxxxxxxx A ? ? 00000001 P R ? ...1024... xxxxxxxx A ? ? 4 de P1 2 de P2 4 de P2 P2 xxxxxxxx P ? ? ...1024... xxxxxxxx A ? ? xxxxxxxx A ? ? xxxxxxxx A ? ? 00000002 P R ? xxxxxxxx A ? ? 00000003 P R ? ...1024... xxxxxxxx A ? ?

t=150 Siguen igual. t=250 P1 referencia las pginas 2 y 3. Todo depende de cuantas referencias y en qu orden se hagan. Suponemos que tenemos una referencia a la 2 y luego otra a la 3. La 2 est, pero para incluir la 3 hay que expulsar una de las que ya tenemos, segn una poltica FIFO. Luego la que expulsamos es la pgina 2 de P1.

-6Marcos 3 de P1 P1 xxxxxxxx P ? ? ...1024... xxxxxxxx A ? ? xxxxxxxx A ? ? xxxxxxxx A ? ? 00000000 A R ? 00000000 P R ? 00000001 P R ? ...1024... xxxxxxxx A ? ? 4 de P1 2 de P2 4 de P2 P2 xxxxxxxx P ? ? ...1024... xxxxxxxx A ? ? xxxxxxxx A ? ? xxxxxxxx A ? ? 00000002 P R ? xxxxxxxx A R ? 00000003 P R ? ...1024... xxxxxxxx A ? ?

t=350 P2 referencia las pginas 2 y 3. Todo depende de cuantas referencias y en qu orden se hagan. Suponemos que tenemos una referencia a la 2 y luego otra a la 3. La 2 est, pero para incluir la 3 hay que expulsar una de las que ya tenemos, segn una poltica FIFO. Luego la que expulsamos es la pgina 4 de P1.
Marcos 3 de P1 P1 xxxxxxxx P ? ? ...1024... xxxxxxxx A ? ? xxxxxxxx A ? ? xxxxxxxx A ? ? 00000000 A R ? 00000000 P R ? 00000001 A R ? ...1024... xxxxxxxx A ? ? 3 de P2 2 de P2 4 de P2 P2 xxxxxxxx P ? ? ...1024... xxxxxxxx A ? ? xxxxxxxx A ? ? xxxxxxxx A ? ? 00000002 P R ? 00000001 P R ? 00000003 P R ? ...1024... xxxxxxxx A ? ?

t=400 Si suponemos que ahora nos mantemos usando la pgina 3, no cambiara la situacin (En caso contrario tendramos que volver a traer la 2, escogiendo la siguiente pgina que entr como vctima para la expulsin). t=450 Suponiendo ahora que este proceso se mantiene usando la pgina 4, tampoco cambia nada (En caso contrario tendramos que traer la pgina 3, expulsando alguna de las que tenemos ahora mismo). Hay que decir que si los procesos hacen repetidas referencias a las pginas 3 y 4 en su ltima rfaga, tendramos que paginar bastante mas, dado que con la poltica FIFO es muy posible (como se ha visto) que expulsasemos una de las que estamos necesitando (la 3 o la 4 de alguno de los dos procesos).

-7-

Problema 5 (2 puntos) Sea un sistema de fichero tipo Unix que gestiona bloques de datos de 4K. Cada nodo-i, adems de otra informacin, contiene 10 enlaces directos a bloques de datos, un enlace de indireccin simple, un enlace de indireccin doble y un enlace de indireccin triple. Responded razonadamente a las siguientes cuestiones: a) Suponiendo que tenemos una cache de 20 bloques de datos y otra de 20 nodos-i inicialmente vacas, que el nodo-i del directorio raiz se encuentra en memoria principal, y que slo ejecuta en el sistema el siguiente proceso:
fd1=open("/usr/pablo/practica1"); fd2=open("/usr/jose/practica1"); lseek(fd1,12*4096); leidos=read(fd1,datos,5); exit(0);

Cuntos accesos a disco realiza el proceso suponiendo que la informacin de cada directorio que accede cabe en un solo bloque de datos? b) Tiene fragmentacin este tipo de sistema ficheros? De que tipo? Cul es el tamao medio de la fragmentacin de cada fichero?

Solucin Empezando por el primer open, tenemos que resolver /usr/pablo/practica1 con lo que hacemos los siguientes accesos: 1 2 3 4 5 6 Leemos el primer bloque de datos del inodo del directorio raiz. (Buscamos en la tabla usr). Leemos el inodo para usr. Leemos el primer bloque de datos de dicho inodo. (Buscamos en la tabla pablo). Leemos el inodo para pablo. Leemos el primer bloque de datos de dicho inodo. (Buscamos en la tabla practica1). Leemos el inodo para practica1). Continuando con el segundo open, resolvemos /usr/jose/practica1 teniendo en cuenta que ya tenemos en la cache de inodos el inodo para usr y en la cache de bloques el bloque de datos de ficho inodo, por lo que la primera lectura ser: 7 8 9 Leemos el inodo para jose. Leemos su primer bloque de datos. (Buscamos en la tabla practica1). Leemos el inodo para practica1). Ahora continuamos con el lseek, que no realiza acceso alguno a disco. y nos deja posicionados justo al principio del bloque 12 del primer fichero abierto (si empezamos a contar los bloques desde 0). Tras ello leemos 5 bytes, con lo que habr que leer dicho bloque: 10 11 Leemos el bloque B apuntado por el primer puntero indirecto simple del inodo que corresponde a /usr/pablo/practica1. Leemos el bloque apuntado por el tercer puntero presente en B . (el primer puntero apuntar al bloque 10 del fichero, el segundo puntero apuntar al 11, y el tercero es el que nos interesa). En cuanto a la fragmentacin, tenemos algo de fragmentacin interna dado que asignamos bloques a ficheros. La fragmentacin externa es nula dado que todos los bloques son del mismo tamao. En media, cada fichero desperdicia la mitad de su ltimo bloque, esto es, 2K por fichero.

Anda mungkin juga menyukai