|
Apellidos: | Nombre: |
Pregunta 1 (1 punto)
NFS, o cualquier otro sistema de ficheros fiable sin estado,
es mucho más ineficiente en escrituras que en lecturas. ¿Por qué?
¿Como optimizaría un servidor de NFS para que las escrituras sean tan
eficientes como las lecturas? Use una solución hardware.
Las escrituras son más ineficientes porque se quiere garantizar la semántica de al menos una vez, incluso si se cae el servidor. Para ello, cuando la operación retorne, debemos tener garantía que los datos están en disco, o van a estarlo. Para ello normalmente se escribe en disco antes de retornar. Se puede optimizar haciendo persistente la memoria donde se alojen las peticiones de escritura; por ejemplo, poniéndole una batería que sea capaz de avisar cuando se agota y dé tiempo a volcar a disco las escrituras confirmadas y no realizadas. |
Pregunta 2 (1 punto)
¿Cuál es la diferencia fundamental entre los relojes lógicos de
Lamport y los relojes vectoriales? Dad una ventaja concreta que puede
obtenerse usando los segundos en vez de los primeros.
La diferencia fundamental es que mientras que los relojes lógicos
solo suponen un morfismo de la relación de causalidad (es decir,
, pero la implicación
inversa no es cierta), los relojes vectoriales son un isomorfismo
de la relación de causalidad y, por ello, caracterizan completamente la
computación distribuida.
Los relojes vectoriales suponen una ventaja sobre los lógicos a la hora de, por ejemplo, realizar observaciones coherentes eficaces de computaciones distribuidas. Pues permiten no solo evitar situaciones de hambruna que pueden aparecer con los relojes lógicos, sino, algo quizás más importante desde el punto de vista práctico, reducir los tiempos de espera y los tamaños medios de las colas de mensajes no estables (mensajes recibidos y aún no entregados, en espera de otros que pueden ser (o son) anteriores en el orden causal). |
Pregunta 3 (1 punto)
Dar la estructura básica de las ``credenciales'' (capabilities)
y explicar por qué en sistemas distribuidos, al contrario de lo que ocurre
en sistemas centralizados, no es posible vivir sin ellas.
Una credencial está formada por una identificación del recurso al
que se refiere, un conjunto cifrado (y, a veces, también sin cifrar)
de los derechos de acceso que contiene sobre el recurso, y un número
aleatorio grande, que es por ello (prácticamente) imposible de adivinar.
A diferencia de lo que ocurre en sistemas centralizados, en los que el kernel tiene conocimiento completo de un proceso cuando éste le realiza una petición, en sistemas distribuidos las peticiones vienen en general a través de la red con lo que, incluso cuando el peticionario es un kernel remoto, es en general no fiable. Por ello, las credenciales vistas (u otro método análogo) se hacen imprescindibles en estos sistemas. |
Pregunta 4 (1 punto)
¿Plantean algún problema los fallos de página a un planificador
de hebras realizado en el nivel de usuario?. Explicad brevemente.
Se presenta un problema similar al que ocurre cuando se realiza una operación de E/S. Pues, de nuevo, al no saber el kernel que el proceso es multihebra, le detiene completamente hasta que se restaure el fallo de página. Cuando, si en su lugar informara de este hecho al planificador en el nivel de usuario, éste bien podría planificar otra hebra del mismo proceso para ejecutar mientras se sirve el fallo de página, y así no se detendría el proceso completo. |
Pregunta 5 (1 punto)
Explique qué tipo de multienvío es necesario para hacer replicación
con réplicas activas (o máquinas de estado, o modelo totalmente síncrono),
de modo que todas ellas pasen exactamente por los mismos estados.
Atómico totalmente ordenado, ya que para que todas las réplicas pasen exactamente por los mismos estados, deben recibir los mensajes en el mismo orden, y recibirlos todos o ninguno. |
|
Apellidos: | Nombre: |
Pregunta 6 (2 puntos)
Modificar el (seudo) programa de la figura 12 del artíclo de
O. Babaoglu y K. Marzullo para que calcule y devuelva también el
estado de los canales de comunicación, no sólo el de los procesos.
En el apartado de declaraciones, se añaden:
var chi: array[1..n] of set init empty; En las dos alternativas request y response se añade al principio: if taking_snapshot[j] then chi[j] := chi[j] + m; Y la alternativa snapshot se cambia a: snapshot:
|
Pregunta 7
El siguiente programa paralelo no debería imprimir nunca nada
en un multiprocesador 1:
a:= 0; b:= 0; cobegin for i:=1 to 1000000 do begin br:= b; ar:= a; if (ar < br) then imprime("Error"); end; for j:=1 to 1000000 do begin a:= a+1; b:= b+1; end; coend;
Sin embargo, si se ejecuta en un sistema distribuido con memoria virtual compartida, puede que en algunos casos se impriman mensajes de error.
Subpregunta 7.1 (1 punto)
Para cada modelo de consistencia diga si puede dar
algún mensaje de error, justifíquelo muy brevemente
y, si en algún caso la respuesta depende de algo no explícito en el programa,
diga de qué:
No, porque todo entrelazado de operaciones de lectura y escritura de y dan que . |
No, si todas las escrituras en un proceso dependen causalmente. Ello ocasionará que las lecturas de reflejarán el incremento anterior de . Si no están relacionadas causalmente, puede haber errores. |
No, porque las escrituras se propagan en orden FIFO. |
Si, porque sólo se ven en el mismo orden las escrituras en la misma variable. |
No porque es PRAM. |
Si, a menos que y estén marcadas como variables de sincronizacion. |
Sí, porque no hay regiones críticas marcadas. |
Sí, porque no hay regiones críticas marcadas. |
Subpregunta 7.2 (1 punto)
En el caso de realizar al menos consistencia secuencial,
¿en qué caso podría haber más trasiego de páginas (thrashing)
y en qué caso menos?
Intente ordenarlos por trasiego y justifíquelo:
Cada escritura requiere una invalidación confirmada y cada lectura puede requerir una petición de página. El trasiego depende de las velocidades relativas de los procesos. Pueden llegar a producirse dos mensajes confirmados por escritura. Si el escritor mantiene la propiedad durante algún tiempo, el trasiego se reduce notablemente. |
Cada escritura requiere una actualización remota. El trasiego es similar al último caso. |
El segundo debe pedir dato y actualizarlo remotamente para cada modificación. Se producen dos mensajes confirmados por escritura. Es el caso en que más datos se trasiegan. |
El primero debe pedir el dato remotamente para cada lectura.
Es el caso más corto, junto con el segundo.
|
Resumiendo, los casos 2 y 4 son equivalentes y los de menos trasiego, seguidos de los casos 1 y 3, en ese orden. |
Pregunta 8 (1 punto)
Diseñe unos formatos de mensajes aptos para un protocolo de multienvío
atómico basado en disentimientos en un medio no fiable, que puede corromper,
perder y desordenar mensajes. Éstos pueden ser de tamaño arbitrario.
El direccionamiento es punto a punto.
No es necesario especificar los tamaños de los campos.
Diga para qué se usa cada tipo de mensaje y cada campo.
Hay mensajes de datos, de disentimiento y de asentimiento.
Todos pueden llevar a caballo (piggyback) listas de últimos de mensajes
entregados de cada origen, para que cuando un interlocutor sepa
que un mensaje se ha entregado a todos, borrarlo de su cola.
|