.. include:: ../../my-header_2.txt

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.


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

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

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

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

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

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

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

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

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

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

#. [_] 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?    

#. [_] ¿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``?

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

#. [_] ¿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));        

#. [_] ¿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?

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

#. [_] ¿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?

#. ¿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? 

#. [_] ¿Sabrías explicar qué hace la llamada al sistema ``sync()``?
      
#. [_] ¿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

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

#. [_] ¿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?

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

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

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

#. [_] 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?

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

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

#. [_] ¿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*?

#. [_] 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?

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

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

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

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

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

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

#. [_] ¿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? 

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

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

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

#. [_] 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 R\ :sub:`i`, solo puede solicitar R\ :sub:`k` si k>i. ¿Puedes razonar por qué esta metodología permite evitar interbloqueos? 



.. include:: ../../my-footer_2.txt
