🧩 Componentes del SO
Los principales módulos funcionales que componen un SO y que interactúan para proporcionar la funcionalidad completa al usuario incluyen:
- Gestión de Procesos: Creación, terminación, suspensión, reanudación, y sincronización de procesos y comunicación entre ellos (IPC).
- Gestión de Memoria Principal: Seguimiento de qué partes de la memoria están en uso, asignación y desasignación de espacio, y manejo de la paginación o segmentación.
- Gestión de Archivos: Creación, borrado, modificación y mapeo de archivos a dispositivos de almacenamiento secundario. También incluye la gestión de permisos.
- Gestión del Sistema de E/S: Oculta las peculiaridades de los dispositivos de *hardware* a los usuarios, proporcionando una interfaz uniforme para los *drivers* y el *spooling*.
- Sistema de Protección: Mecanismos para controlar el acceso de los procesos o usuarios a los recursos definidos por el SO, garantizando la seguridad y la integridad.
- Sistema de Intérprete de Comandos (Shell): Interfaz principal que permite al usuario interactuar con el SO, ejecutando comandos o programas a través de la línea de comandos o una interfaz gráfica.
⚙️ Estructuras del SO
| Modelo | Descripción Detallada | Ventajas Ampliadas | Inconvenientes Ampliados |
|---|---|---|---|
| Monolítico | Todo el código del SO se compila en un único fichero ejecutable grande que se ejecuta enteramente en modo kernel (privilegiado). Los servicios se invocan a través de llamadas de función simples. | Alta eficiencia y velocidad de ejecución, ya que las llamadas entre módulos son llamadas a funciones locales, sin *overhead* de cambio de contexto. | Un único error (*bug*) en cualquier parte del código puede corromper el estado del núcleo y provocar un fallo total del sistema. Difícil de mantener y probar. |
| Micronúcleo | El núcleo es extremadamente minimalista, conteniendo solo las funciones esenciales: primitiva de paso de mensajes (IPC), gestión de interrupciones y planificación de la CPU. Todos los demás servicios (sistemas de archivos, gestión de memoria virtual, *drivers*) se ejecutan como procesos independientes en modo usuario. | Fiabilidad y Estabilidad: El fallo de un servidor (ej. un *driver*) no derriba al núcleo. Modularidad y Extensión: Los nuevos servicios se añaden sin recompilar el núcleo. Seguridad: Menos código ejecutándose en modo privilegiado. | Rendimiento: El mayor inconveniente es la sobrecarga (*overhead*) debido al paso de mensajes (IPC) que se necesita para que los servicios se comuniquen entre sí y con el núcleo. |
| Capas | El SO se divide en N capas. La capa L solo puede solicitar servicios de la capa L-1. El *hardware* está en la capa 0 y la interfaz de usuario en la capa N. | Diseño modular y fácil depuración, ya que el fallo se localiza en la capa defectuosa. Cada capa tiene una interfaz bien definida. | Rendimiento más lento debido a que una llamada al sistema puede requerir que la solicitud pase secuencialmente a través de varias capas antes de llegar al *hardware*. |
📞 Llamadas al Sistema (*System Calls*)
- Definición: El principal mecanismo de interfaz entre los procesos de usuario y el SO. Permite a los programas de usuario solicitar servicios directamente al núcleo, como acceso a E/S o creación de nuevos procesos.
- Funcionamiento: Se implementan generalmente mediante una interrupción software (o instrucción especial) que cambia el modo de ejecución del procesador de modo usuario a modo kernel (privilegiado). Esto garantiza que el núcleo mantenga el control y pueda validar las peticiones antes de ejecutarlas. Se pasa información a través de registros de CPU o bloques en memoria.