Programación concurrente en Linux

# Test de autoevaluación final

Se trata de un compendio de las preguntas de los test a los que habrás ido respondiendo a lo largo del curso.

Asigna una puntuación a cada pregunta dependiendo de si sabes responderla (2), no estás seguro (1), o no sabes (0).

Te sugiero que imprimas o copies las preguntas en un fichero de texto para que vayas anotando la puntuación. Copia la suma final en la hoja de calificaciones.

1. [_] ¿Qué ventajas trajo la multiprogramación con respecto a los sistemas por lotes?

2. [_] ¿Qué distingue a UNIX de un sistema propietario?

3. [_] Si la multitarea ya estaba inventada, ¿por qué los primeros sistemas operativos para teléfonos móviles eran monotarea?

4. [_] Cuando ejecutas un shell script, ¿se carga en memoria el código de algún programa?

5. [_] ¿Por qué el código obtenido al compilar un programa es notablemente mayor que la suma del código fuente de ese programa?

6. [_] ¿Cómo pueden estar cargados simultáneamente en memoria dos programas si ambos comienzan en la dirección lógica cero?

7. [_] ¿Qué técnicas permiten ejecutar un programa sin que esté cargado entero en memoria?

8. [_] ¿Por qué es más fácil proporcionar compatibilidad fuente si no se usan llamadas al sistema?

9. [_] ¿Qué aporta un estándar como POSIX con respecto a la compatibilidad?

10. [_] ¿Por qué la instrucción de cambio de modo del lenguaje máquina de todos los procesadores es una instrucción reservada?

11. [_] No siendo eventos asíncronos, ¿por qué una llamada al sistema usa el vector de interrupciones para acceder al código de la llamada, como hacen las interrupciones?

12. [_] ¿Cómo se puede deducir el tamaño del buffer que usa la biblioteca de entrada-salida de C a partir del comportamiento de un programa que usa `putc`?

13. [_] Si un programa cambia el modo de operación del terminal (por ejemplo a no eco), el siguiente programa que ejecutamos ¿hará el eco?

14. [_] ¿Puedes explicar por qué al ejecutar el código siguiente se ha escrito `1` por la salida estándar?:

        close(1);
        printf("%d\n", open("fich", O_WRONLY));

15. [_] ¿Puedes explicar el porqué de la relación entre la utilización de buffers de entrada-salida y la velocidad de ejecución de un programa?

16. [_] ¿Sabes distinguir entre los buffers de la biblioteca de entrada-salida y los buffers del sistema operativo?

17. [_] ¿Podrías explicar en términos de la técnica de escritura retardada de `write()` por qué el sistema de ficheros puede corromperse tras un apagón?

18. ¿Puedes explicar por qué si se desarrollara un soporte para almacenamiento masivo tan rápido como la RAM la técnica de escritura retardada sobre este soporte no tendría sentido?

19. [_] ¿Sabrías explicar qué hace la llamada al sistema `sync()`?

20. [_] ¿Por qué la siguiente salida de una orden `ps` es imposible?:

          PID TTY          TIME    CMD
        32698 pts/3    00:00:00  bash
        32740 pts/3    00:00:00  sleep
        32740 pts/3    00:00:00  ps

21. [_] El contenido de un fichero, ¿forma parte del contexto de un proceso que tiene abierto ese fichero?

22. [_] ¿Sabrías poner un ejemplo que mostrase como, a pesar de ser el proceso hijo una copia del padre, no comparte con este el contexto?

23. [_] ¿Por qué el siguiente código crea más de 10 procesos?:

        for (i=0; i<10; i++) fork();

24. [_] ¿Sabrías construir un programa que crease un árbol de procesos y donde un proceso pudiera conocer el identificador de su “abuelo”?

25. [_] Supón que lanzas concurrentemente la ejecución de varios programas desde el shell:

        p1 & p2 & p3

    ¿Sabrías describir la secuencia de estados por la que pasa el shell a consecuencia de esto?

26. [_] ¿Y si hubieras ejecutado `p1 ; p2 ; p3`?

27. [_] ¿Podrías describir qué consecuencias tendría para la funcionalidad de Linux el hecho de que no se hubiera previsto el estado Zombie?

28. [_] ¿Puedes dar una razón por la que es necesario que el sistema operativo distinga entre un proceso preparado para ejecución y un proceso ejecutándose?

29. [_] Actualizar el modelo de colas de PCBs que mantiene el sistema es una parte del cambio de contexto, pero ¿qué más cosas debe hacer el sistema para hacer efectivo el cambio de contexto?

30. [_] ¿Por qué las políticas de planificación para tiempo real y para tiempo compartido son contrapuestas?

31. [_] ¿Podrías poner un ejemplo de política de planificación que pueda conducir a la inanición de algunos procesos?

32. [_] ¿Por qué una política de planificación basada en round-robin, conveniente para el tiempo de respuesta, puede no serlo para la eficiencia?

33. [_] ¿Puedes nombrar al menos dos elementos del contexto privado de un hilo?

34. [_] ¿Sabrías explicar por qué un programa multihilo es más eficiente que uno multiprogramado?

35. [_] ¿Cómo obtiene un hilo el código a ejecutar?

36. [_] ¿Puedes describir con ejemplos de pseudo código la diferencia entre dos procesos bloqueados en el acceso a dos semáforos y dos procesos interbloqueados en el acceso a esos mismos semáforos?

37. [_] ¿Por qué no es posible un interbloqueo entre dos procesos que acceden concurrentemente a un único recurso?

38. [_] ¿Por qué son posibles los interbloqueos aunque se utilicen exclusivamente cerrojos de espera activa?

39. [_] ¿Por qué una, vez ocurrido un interbloqueo, deshacerlo siempre afectará a la corrección de algunos de los programas involucrados?

40. [_] Supón que restringimos la solicitud de recursos de la siguiente forma. Los recursos se ordenan según un índice. Si un proceso está usando un recurso Ri, solo puede solicitar Rk si k>i. ¿Puedes razonar por qué esta metodología permite evitar interbloqueos?