Funciones del Sistema Operativo
1. ¿Cuáles son las funciones principales del sistema operativo?
- Administración de procesos
- Administración de memoria primaria
- Gestión de archivos
- Gestión de almacenamiento secundario
- Gestión del sistema de protección
Procesos e Hilos
2. Explicar las diferencias que existen entre proceso e hilo (es necesario incluir la información respecto a cuáles estructuras utiliza el SO para administrar procesos convencionales y procesos ligeros):
a. Programa: Conjunto de sentencias que pueden incluir varios procesos. PROCESO: Una serie de sentencias asignadas a una tarea, una vez realizada la tarea, el programa continúa. Conceptualmente, un programa en ejecución.
b. Proceso padre e hijo:
- Compartimiento de recursos: Padre e hijo comparten todos los recursos. El hijo comparte sólo algunos recursos del padre. Padre e hijo no comparten ningún recurso.
- Espacio de direcciones: El proceso hijo ocupa un espacio de direcciones de memoria propio y diferente al del proceso padre.
- Código: El proceso hijo duplica el código del proceso padre en su propio espacio de direcciones. El hijo carga otro código en su espacio de direcciones.
- Ejecución: Los procesos padre e hijo se “ejecutan” concurrentemente. El proceso padre espera hasta que finalice el proceso hijo.
c. Proceso e hilo: Un proceso es cualquier programa en ejecución y es totalmente independiente de otros procesos. HILO: Dentro de un proceso puede haber varios hilos de ejecución (varios threads). Eso quiere decir que un proceso podría estar haciendo varias cosas «a la vez». Los hilos dentro de un proceso comparten todos la misma memoria. Eso quiere decir que si un hilo toca una variable, todos los demás hilos del mismo proceso verán el nuevo valor de la variable. Esto hace imprescindible el uso de semáforos o mutex (EXclusión MUTua, que en inglés es al revés, funciones pthread_mutex…). Un fallo en un hilo puede hacer fallar a todos los demás hilos del mismo proceso.
Estados de un Proceso
3. Diagrama 5 estados:
- Nuevo: Se crea un proceso.
- Ejecutando: El proceso tiene asignada la CPU donde se están ejecutando sus instrucciones.
- Esperando: El proceso se encuentra en espera de que suceda algún evento.
- Listo: El proceso está esperando para obtener la CPU.
- Finalizado: El proceso terminó y sale del sistema.
Scripts
4. ¿Qué es un script? ¿Para qué se utiliza? Proporcione un ejemplo de un script y describa su funcionamiento.
Un script es un conjunto de instrucciones que permiten la automatización de tareas, creando pequeñas utilidades. Se utiliza para la administración de sistemas UNIX en un archivo de procesamiento por lotes.
Creación de Procesos
5. Describa cuáles funciones pueden utilizarse para crear un proceso padre y procesos hijos (fork, system, execv). ¿Qué diferencias existen entre estas funciones? Proporcione ejemplos para cada función.
- fork: System call para crear un nuevo proceso. Crea un proceso que genera una copia de sí mismo, esta copia actúa como un proceso hijo del padre, los procesos resultantes son idénticos (copia de imagen de memoria) pero con PID diferentes.
- exec: System call que se usa después de
fork
para reemplazar el código en el espacio de memoria del nuevo proceso. Proporciona un vector de punteros a cadenas de caracteres terminadas en 0. El primer argumento por convención debe apuntar al nombre del fichero que lo está ejecutando. Inicia un nuevo programa remplazando al programa original, por tanto el PID no cambia. - system: Es una función que llama a comandos y/o funciones antiguas especificadas por una cadena que puede incluir opciones y argumentos.
Control de Procesos y Recursos
6. ¿Qué necesita el SO para ser capaz de controlar los procesos y administrar recursos para ellos?
- Tabla de procesos
- Tabla de memoria
- Tabla de archivos
- Tabla de E/S
Bloque de Control de Procesos (PCB)
7. Explique qué información almacena el bloque de control de procesos.
Es una estructura de datos que contiene información asociada a cada proceso. Entre otros, los datos que contiene un PCB son:
- Identificador del proceso
- Estado
- Contador de programa
- Registros de la CPU
- Información de planificación de CPU
- Información de administración de memoria
- Información de contabilidad
- Información de E/S
Proceso de Inicio del Computador
8. Explique en detalle cómo se lleva a cabo el proceso de inicio (autoarranque) del computador y el proceso de carga del sistema operativo.
La computadora es capaz de realizar actividades solo si cuenta con un programa permanente en ROM. Una parte del mapa de memoria está construida con ROM donde se encuentra el programa de arranque o INICIADOR ROM. Cuando se enciende la computadora o se pulsa RESET, se cargan los valores predefinidos en sus registros, es decir, se carga en el PC la dirección de iniciador ROM. Este realiza 3 funciones:
- Hace una comprobación del sistema para detectar sus características.
- Lee y almacena en memoria el programa cargador del S.O. (lee un programa almacenado en un periférico y lo carga a la memoria principal).
- Da el control a este programa.
Semáforos
9. ¿Qué es un semáforo? ¿Para qué se utiliza? Proporcione un ejemplo donde es necesario el uso de semáforos y describa el funcionamiento del programa respectivo.
Un semáforo es una variable especial protegida (o tipo abstracto de datos) que constituye el método clásico para restringir o permitir el acceso a recursos compartidos (por ejemplo, un recurso de almacenamiento del sistema o variables del código fuente) en un entorno de multiprocesamiento. Los semáforos se emplean para permitir el acceso a diferentes partes de programas (llamados secciones críticas) donde se manipulan variables o recursos que deben ser accedidos de forma especial. Según el valor con que son inicializados se permiten a más o menos procesos utilizar el recurso de forma simultánea. Los semáforos pueden ser usados para diferentes propósitos, entre ellos:
- Implementar cierres de exclusión mutua o locks.
- Barreras.
- Permitir a un máximo de N threads acceder a un recurso, inicializando el semáforo en N.
- Notificación. Inicializando el semáforo en 0 puede usarse para comunicación entre threads sobre la disponibilidad de un recurso.
Evaluación de Algoritmos de Planificación del CPU
10. ¿Cuáles características pueden ser utilizadas para evaluar la eficiencia de algoritmos de planificación del CPU? Explique el significado de cada una.
- Utilización del CPU: Que el algoritmo tenga en todo momento al procesador ocupado. La mayoría de los procesadores se limitan por E/S.
- Tiempo de espera promedio mínimo: La suma de tiempo en cola de listos tiene que ser mínima.
- Tiempo de retorno: El valor máximo de tiempo de retorno debe ser lo mínimo posible.
- Tiempo de respuesta: El tiempo en que el sistema tarda en dar una respuesta debe ser mínimo.
Algoritmos de Planificación
11. Describa el funcionamiento de algoritmos de planificación y proporcione las ventajas y desventajas de cada uno (FCFS, SJF, planificación por prioridad expropiativa y no expropiativa, RR, planificación con colas de múltiples niveles, planificación con colas de múltiples niveles y realimentación).
- FCFS (First-Come, First-Served):
- Ventajas: Sencillo de implementar.
- Desventajas: No se garantiza el tiempo de espera promedio mínimo, mientras unos procesos están en archivos otros están ociosos. Efecto convoy.
- SJF (Shortest Job First):
- Ventajas: Ya no hay efecto convoy, el mejor rendimiento se obtiene al ejecutar los procesos que están en la cola de listos cuyas ráfagas son las más cortas.
- Desventajas: No sabemos con exactitud la duración de la ráfaga del CPU por adelantado.
- R-R (Round Robin): Normalmente este algoritmo se usa en sistemas de tiempo compartido para que cada usuario tenga la impresión de que su proceso ya se está ejecutando y en este caso es aconsejable que el cuanto de tiempo sea lo suficientemente pequeño.
- Planificación con colas múltiples: Permite a un proceso pasar de una cola a otra, la idea es esperar procesos con diferentes características en cuanto a sus ráfagas de CPU. Si un proceso gasta demasiado tiempo de CPU se le pasará a una cola con menor prioridad.
- Planificación con colas de múltiples niveles y realimentación: Las colas de retroalimentación de niveles múltiples son ideales para separar procesos en categorías basadas en su necesidad de la CPU. Pero si los procesos se colocan siempre dentro de la red en la cola que ocuparon la última vez, será imposible que el sistema responda a cambios de un proceso, por ejemplo, de estar limitado por la CPU, a estar limitado por la E/S. El mecanismo de colas de retroalimentación de niveles múltiples es un buen ejemplo de mecanismo adaptativo, que responde a los cambios en el comportamiento del sistema que controla. Los mecanismos adaptativos implican, en general, una carga extra mayor que los no adaptativos, pero la sensibilidad ante los cambios en el sistema da como resultado una mejor capacidad de respuesta, y justifica el aumento en el gasto extra.
Problemas de Concurrencia
12. Describa los problemas de concurrencia que pueden presentarse durante la ejecución de procesos (exclusión mutua, interbloqueo e inanición) y proporcione ejemplos respectivos para cada caso.
- Exclusión mutua: A ningún otro proceso se le permite el acceso a recursos comunes, como variables globales.
- Interbloqueo: Es el bloqueo permanente de un conjunto de procesos o hilos de ejecución en un sistema dado que compiten por recursos del sistema o bien se comunican entre ellos. A diferencia de otros problemas de concurrencia de procesos, no existe una solución general para los interbloqueos. Todos los interbloqueos surgen de necesidades que no pueden ser satisfechas, por parte de dos o más procesos. En la vida real, un ejemplo puede ser el de dos niños que intentan jugar al arco y flecha, uno toma el arco, el otro la flecha. Ninguno puede jugar hasta que alguno libere lo que tomó.
- Inanición: La inanición se produce cuando algún proceso dentro del sistema no puede satisfacer sus necesidades de recursos debido a que otros procesos los están utilizando continuamente.
Funciones para el Manejo de Hilos
13. Describa cuáles funciones son mínimamente necesarias para: identificar un hilo, crear un hilo, lograr que el proceso principal espere hasta que el hilo termine de ejecutarse.
- Para identificar un hilo:
thread_id
- Para crear un hilo:
pthread_create
- Lograr que el proceso principal espere hasta que el hilo termine de ejecutarse:
pthread_join
Memoria Virtual
14. Explique en detalle qué es memoria virtual y por qué se aplica en los esquemas de gestión de memoria actuales.
La memoria virtual es una técnica para proporcionar la simulación de un espacio de memoria mucho mayor que la memoria física disponible. Esta «ilusión» permite que los programas se hagan sin tener en cuenta el tamaño exacto de la memoria física. La ilusión de la memoria virtual está soportada por el mecanismo de traducción de memoria, junto con una gran cantidad de almacenamiento rápido en disco duro. Así, en cualquier momento, el espacio de direcciones virtual hace un seguimiento de tal forma que una pequeña parte de él está en memoria real y el resto almacenado en el disco, y puede ser referenciado fácilmente.
Fragmentación Interna
15. ¿En cuál esquema de gestión de memoria se presenta el problema de fragmentación interna? Proporcione un ejemplo al respecto. ¿Qué esquema de gestión de memoria se aplica en SO actuales para solucionar el problema de fragmentación interna? Explique.
La fragmentación es la memoria que queda desperdiciada al usar los métodos de gestión de memoria. Se debe esperar a la finalización del proceso para que se libere el bloque completo de la memoria. Por ejemplo, si nuestro clúster es de 18KB (18.432 bytes), por más que un archivo ocupe menos, en nuestro disco ocupará 18KB. Esto sugiere una pérdida de ese espacio que dice utilizar pero no utiliza. Por eso, en nuestro ejemplo, un archivo de 3KB ocupará en nuestro disco lo mismo que uno de 10KB, o sea 18 KB. Esa pérdida de espacio se denomina fragmentación interna, y no se corrige con el desfragmentador, sino disminuyendo el tamaño de la partición.
Para solucionar el problema de la fragmentación interna, los sistemas operativos actuales utilizan la paginación y la segmentación. Estos esquemas dividen la memoria en bloques más pequeños y permiten que los procesos se carguen en espacios de memoria no contiguos, lo que reduce la cantidad de memoria desperdiciada.