Soluciones del segundo parcial, curso 1997/98

Pregunta 1. Cuestiones.

¿Por qué el UNIX estándar no puede considerarse un sistema de tiempo real?

Un sistema de tiempo real "estricto" permite establecer y cumplir plazos de finalización para los procesos que ejecuta; UNIX planifica los procesos según un round-robin con prioridades, que no asegura que ningún proceso termine en un plazo prefijado. Tampoco UNIX es un sistema de tiempo real en el sentido de permitir que ciertos procesos tengan tiempos de respuesta muy breves; UNIX emplea técnicas, como la memoria virtual, que imponen retrasos imprevisibles a todos los procesos sin distinción.

¿Qué estructura interna usa NTFS para almacenar directorios?

Un directorio es un tipo especial de archivo; su contenido se almacena como los datos del archivo, e internamente se emplea un árbol B+ para codificar la lista de archivos contenidos, ordenada por nombre.

¿Qué significan "uid efectivo" y el bit "setuid" en UNIX?

Ambos elementos tienen relación con la gestión de usuarios. El uid efectivo es el identificador de usuario a nombre del cual se está ejecutando un proceso, y puede ser diferente del usuario que lo lanzó a ejecución (que se denomina uid real). Normalmente, cuando se ejecuta un archivo, el proceso resultante corre con los mismos niveles de privilegio que el usuario que ordenó la ejecución. Además de este comportamiento normal, UNIX utiliza un bit llamado setuid, asociado a todo archivo ejecutable, que si está habilitado provoca que el proceso se ejecute con los niveles de privilegio del propietario del archivo ejecutable (que no tiene por qué coincidir con el usuario que ordena la ejecución).

Así pues, si un archivo ejecutable tiene habilitado el bit setuid, su ejecución provocará que el uid real y el uid efectivo sean distintos. Cualquier usuario con permiso de ejecución sobre un archivo con setuid podrá ejecutar código como si fuera otro usuario (el propietario del archivo). Este modelo de trabajo permite que los usuarios puedan realizar operaciones privilegiadas de forma restringida y controlada.

En UNIX, ¿cuál es la diferencia entre un enlace simbólico (symbolic link) y uno "duro" (hard link)?

En ambos casos, los enlaces se emplean para que un mismo objeto (archivo) tenga varios nombres. Pero tienen grandes diferencias semánticas y de implementación:

Pregunta 2. Necesidad o conveniencia de que los bloques de datos estén contiguos en un s.f. con asignación indexada.

No es necesario que los bloques de datos de un archivo estén contiguos, por la propia naturaleza d la asignación indexada. Todo archivo dispone de una tabla de índices, que contiene precisamente los números de los bloques que lo componen, uno por uno. Esta estructura no impone ninguna contigüidad, los bloques pueden residir en cualquier lugar del disco.

Sin embargo, factores de rendimiento hacen conveniente que los bloques de datos estén contiguos, aunque se emplee asignación indexada. Si los bloques de un archivo están físicamente contiguos, cuando se realice un acceso secuencial, las cabezas del disco realizarán el mínimo de movimientos, con lo cual la velocidad de acceso aumenta respecto a una ubicación dispersa. Además, aumenta el tiempo medio de acceso si se emplea una estrategia de caché de pistas o cilindros (leer siempre todos los bloques de un cilindro, no sectores individuales): es más probable que se lean siempre varios bloques de un mismo cilindro -que estarían todos en memoria- y así el número de órdenes al disco tiende a disminuir.

Dado que el acceso secuencial es muy frecuente, la contigüidad de los bloques es, por tanto, deseable por motivos de eficiencia.

Pregunta 3. Principios de mínimo privilegio y de mínimo mecanismo común.

Aclarando la definición de estos principios, se trata de dar algún ejemplo esclarecedor de ambos. Recuerden que el p. de mínimo privilegio propugna que a cada usuario (sujeto) del sistema se le debe conceder el mínimo conjunto de privilegios o recursos necesarios para desempeñar correctamente sus tareas. El p. de mínimo mecanismo común aboga por que los usuarios compartan la menor cantidad de objetos posible. Los ejemplos, a la imaginación de ustedes.

Pregunta 4. Manejo de señales en UNIX.

Un proceso en UNIX maneja una señal declarando previamente cómo se va a comportar cuando reciba una señal de cierto tipo. A esto se le llama manejar una señal. Para ello se emplea la llamada al sistema signal(tipo_señal,acción). En la llamada signal se especifica en el primer parámetro qué señal se pretende manejar; en el segundo parámetro se indica qué acción corresponde cuando la señal llegue al proceso. Hay tres posibles acciones: ignorar la señal, finalizar el proceso o ejecutar una función definida por el usuario. En este último caso, se pasa como parámetro a signal un puntero a la función manejadora.

Para emplear las funciones de manejo de señales, hay que incluir la cabecera <signal.h>

Si un tipo de señal está manejado mediante una función, cuando llegue una señal de ese tipo, se interrumpe la actividad actual del proceso y se ejecuta la función manejadora. Cuando ésta retorna, se reanuda el flujo del proceso a partir del punto en el que se interrumpió.

Este esquema general tiene algunas excepciones. Ciertas señales críticas no pueden ignorarse ni manejarse mediante funciones, siempre abortan al proceso (por ejemplo, SIGKILL).

 

Ejemplo en C:

 

#include <signal.h> /* declaraciones para manejar señales */

#include <stdio.h>

 

/* función manejadora */

void aviso()

{

printf("Recibí una señal\n");

}

 

main()

{

/* ejecuto la función ‘aviso’ si se producen ciertas excepciones */

signal(SIGSEGV,aviso);

signal(SIGFPE,aviso);

 

/* ignoro el Ctrl-C */

signal(SIGINT,SIG_IGN);

 

/* aborto si un hijo se muere */

signal(SIGCHLD,SIG_QUIT);

 

for (;;)

{ ...ejecuto código... }

}

Pregunta 5. Tasa de aciertos mínima de una TLB.

El enunciado indica una memoria paginada en dos niveles. Esto significa que, sin ayuda de la TLB, cada acceso a un dato requiere tres accesos a memoria principal: tabla primer nivel, tabla segundo nivel, dato. Si suponemos que la TLB almacena pares página lógica/marco físico, cuando hay acierto en TLB, sólo hay que realizar un acceso a memoria principal. En ambos casos hay que consumir un tiempo para revisar la TLB. Si además consideramos despreciables los restantes tiempos invertidos, se tiene:

tiempo de acceso a memoria principal: Tm=60 ns

tiempo de acceso a la TLB: Tl=5 ns

probabilidad de acierto de la TLB: p

tiempo medio de acceso: T < 75 ns

acceso con fallo de TLB: Ta = Tl + 3*Tm

acceso con acierto de TLB: Tb = Tl + Tm

tiempo medio de acceso: T = (1-p)*Ta + p*Tb

 

Sustituyendo, se obtiene:

T = (1-p)*(Tl+3*Tm)+p*(Tl+Tm) = Tl+3*Tm-p*2*Tm = 185ns - 120ns*p < 75 ns

p > 110/120

p > 91,7%

La tasa de aciertos de la TLB, por tanto, ha de ser superior al 91,7%.

Pregunta 6. Finalidad de los bits de validez, referencia y modificación.

Todos estos bits se utilizan en técnicas de memoria virtual, en especial la paginación por demanda; cada página virtual posee su propio bit de validez, referencia o modificación.

El bit de validez sirve para indicar si una página se encuentra presente en memoria; en caso contrario, puede estar en disco o simplemente no pertenecer al rango legal de direcciones del proceso. El hardware de traducción de direcciones usa el bit de validez para generar un fallo de página en caso de que la página no esté presente.

El bit de referencia se utiliza para implementar políticas de reemplazo de páginas. Las páginas accedidas en un pasado reciente tienen este bit activado; tal información permite construir algoritmos similares al LRU, como el de la segunda oportunidad.

El bit de modificación indica si ha habido una escritura sobre la página asociada. Esta información sirve para conocer si hay que descargar el contenido de la página en disco cuando se la seleccione como víctima o en algún otro momento. Incluso este bit puede emplearse en el criterio de elección de víctimas (es menos costoso elegir como víctima a una página no modificada).

Pregunta 7. Variación de los fallos de página según la estructura de los datos.

El cambio propuesto reorganiza los datos del programa favorablemente, desde el punto de vista de la localidad. En la primera estructura, las zonas de datos más accedidas, los campos "dni", están dispuestos entre otros campos poco utilizados. Con la segunda estructura, todas estas zonas aparecen compactadas y contiguas. El número de dnis por página es mayor en la segunda estructura. Si tenemos la misma cantidad de páginas en ambos casos para guardar dnis, es obvio que caben más de ellos con la segunda estructura que con la primera: la información útil, las localidades, que caben en memoria principal son más si separamos los dnis. En otras palabras, el área activa del proceso es menor con la segunda opción, teniendo en cuenta que el área activa es el conjunto de páginas que el proceso necesita en un momento dado.

Análogamente, en el segundo caso se necesitan menos páginas diferentes para acceder a todos los dnis. Llegando al extremo, si todos los dnis cupieran en la memoria principal asignada al proceso, sólo ocasionarán fallos de página cuando se cargaran al principio de la ejecución.

En consecuencia, el área activa del proceso tiende a ser menor en la segunda estructura; es decir, el número de páginas que necesita el programa en cada momento para mantener su localidad es menor en ese caso. Ambas versiones del programa se ejecutaban en las mismas condiciones, así que si el programa ha experimentado una reducción apreciable de velocidad, puede ser porque se ha conseguido fijar una gran proporción de su área activa en memoria principal, si no toda, cosa que probablemente no ocurría en la primera versión.

 

Pregunta 8. Text file busy.

Muchas versiones recientes de UNIX, que emplean paginación por demanda, utilizan el contenido de un archivo ejecutable como reserva de sus páginas de código. De esta forma no se consume espacio de intercambio (swap) para el código de los programas en ejecución. Con este mecanismo, no se debe permitir la eliminación de un archivo ejecutable si está en ejecución, dado que se perderían las páginas de código no residentes en memoria y que podrían hacer falta en el futuro.

Pregunta 9. Razón por la que muchos sistemas de archivos trabajan con unidades de asignación mayores que el bloque físico.

Hay varios motivos por los que se emplean clusters o grupos de bloques físicos como unidades de asignación. Por ejemplo, esta medida reduce el espacio que consumen las estructuras de control, como la FAT, los bloques de índices o mapas de bits: al haber menor cantidad de unidades de asignación, la FAT o el mapa de bits tienen menos elementos y son de menor tamaño. Por el mismo motivo, para referirse a un bloque lógico harán falta menos bits y las estructuras también pueden ser más pequeñas.

Otro motivo histórico, en el caso del MS-DOS, es permitir manejar dispositivos de gran capacidad sin modificar el número de bloques lógicos direccionables. P.ej. el sistema FAT16 es capaz de manejar 64Kbloques, que habrán de ser de gran tamaño si pretendemos emplear un disco de varios gigabytes.

Una ventaja colateral se deriva de que un bloque lógico está compuesto por varios bloques físicos contiguos; así se potencia la contigüidad de la información y se tiende a aumentar la velocidad de acceso a los datos (según lo expueso en la pregunta 2).

Como gran inconveniente, destaquemos la fragmentación interna, el desperdicio de espacio que se produce cuanto más grande es la unidad de asignación.

Pregunta 10. TEST (modelo 111)

Pregunta

Opción correcta

1

b

2

b

3

b

4

c

5

d

6

c

7

a

8

c

9

d

10

d

11

c

12

b

13

a

14

c

15

b

16

b

17

a

18

c

19

b

20

b