Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Tema 4: Memoria……………………………………………………………………………………………………..
4.1 Gestión de memoria……………………………………………………………………………………………………..
4.2 Memoria virtual……………………………………………………………………………………………………..
Tema 5: Archivos……………………………………………………………………………………………………..
1
Tema 1. Conceptos generales
1.1 ¿Qué es un sistema operativo?
– Es un programa que actúa de intermediario entre los usuarios y el hardware.
– Un sistema de software cuyo fin es que un sistema informático sea operativo, es decir,
facilita el uso del sistema al usuario.
– Conjunto de programas que gestionan los recursos del sistema, optimizan su uso y resuelven
conflictos.
– Pertenece al software del sistema.
• Administrador de recursos
– Como si fuera un «gobierno del hardware».
– Concede recursos de forma segura, justa y eficiente.
– No realiza trabajo productivo.
El SO como interfaz
• Visión: una «capa» que envuelve el hardware y ofrece una «máquina abstracta» con otras
características:
– Oculta detalles incómodos del hardware.
– Amplía características no presentes en el hardware.
• La interfaz se desarrolla para Usuarios, Administradores y Desarrolladores.
2
Llamadas al sistema:
Llamada write() de UNIX. Escribe un bloque de datos en un fichero o en un dispositivo de E/S.
3
– Ganamos en portabilidad (el mismo código sirve para dispositivos diferentes).
– Adaptación a futuras clases de periféricos.
– Podemos prohibir el acceso directo a la E/S (sólo trabajar con la API del SO) más
seguridad.
Multiprogramación:
•También llamada multitarea (multitasking).
• Cuando un proceso se bloquea al esperar por la E/S, ejecutamos en la CPU instrucciones de
otro proceso.
• Los procesos entrelazan su ejecución: concurrencia.
• La CPU y la E/S trabajan a la misma vez se terminan más trabajos en menos tiempo.
• Cuestiones que surgen en un sistema multiprogramado (y que no existen en un sistema sin
multiprogramación):
– Cuando el procesador queda libre, ¿a qué proceso elegimos? planificación de CPU.
– Competencia por el consumo de la memoria.
– Protección de las zonas privadas de memoria.
– Conflictos ante el acceso simultáneo a los recursos.
– Riesgo de interbloqueo (deadlock).
Sistemas de archivos.
• Usuarios: trabajan con documentos, imágenes, programas, música, etc.
• Almacenamiento físico: trabajo con bloques de datos de tamaños fijo.
• Creamos un recurso virtual, llamado <<archivo>> que tiene nombre y contiene información.
También el concepto <<carpeta>> o <<directorio>> para organizar los archivos.
• Abstracción muy útil del almacenamiento físico.
4
Algunos tipos de sistemas.
• Procesamiento por lotes (batch processing).
• Tiempo compartido (time sharing).
• Tiempo real (real time).
• Sistemas multiusuario.
• Máquinas virtuales.
Sistemas multiusuario
• Un sistema multiusuario reconoce que hay varios perfiles de acceso, con privilegios distintos:
– Permisos de acceso a ficheros y aplicaciones.
– Cuotas de espacio o de tiempo de procesador.
– Prioridad en el acceso a los recursos.
• Ojo: multiusuario ≠ multitarea (puede haber sistemas multitarea que no son multiusuario).
Máquinas virtuales
• Emulación por software de una máquina física.
• Sobre la máquina virtual pueden ejecutarse programas implementados para la máquina
física emulada.
• Ventaja: no necesitamos el sistema original.
• Inconveniente: la emulación es más lenta.
Multiprocesadores
• Desde unos pocos hasta miles de procesadores
• Varios modelos de acceso a memoria
– UMA memoria compartida
– NUMA no compartida
5
• Varios modelos de ejecución de procesos:
– SMP multiprocesamiento simétrico, una tarea se puede ejecutar en cualquier
procesador
– AMP Multiprocesamiento asimétrico, hay especialización de tareas (ej. un procesador
ejecuta el SO y otro los procesos de usuario).
Sistemas distribuidos
• Un S.D. es un conjunto de computadores conectados en red y que se utiliza como si fuera un
único sistema con múltiples procesadores + una gran memoria compartida + un gran
almacenamiento secundario.
• No existe un «sistema distribuido universal», pero sí hay servicios con características de
sistema distribuido.
– Servicios en la nube (Dropbox, Amazon…).
– La WWW.
Interrupciones
• Cuando llega una señal de interrupción a la CPU, ésta suspende lo que está haciendo y
ejecuta una rutina de servicio de interrupción (RSI).
• Antes de ejecutar la RSI, hay que guardar el estado de la CPU, para que pueda reanudar lo
que estaba haciendo después de completar la RSI.
• ¿Cómo sabe la CPU qué dispositivo ha interrumpido?
6
– Método primitivo: preguntando a todos los dispositivos polling.
– Método avanzado: el dispositivo envía un número por el bus interrupciones
vectorizadas.
Interrupciones vectorizadas
• Vector de interrupciones. Una zona de la memoria principal contiene las direcciones de todas
las RSI.
• El dispositivo que interrumpe envía un número por el bus de datos. El número sirve de índice
en el vector de interrupciones. La CPU ejecuta la RSI correspondiente.
El SO es un software reactivo
• El SO no se activa por sí solo. Se activa cuando ocurre un evento que tiene que atender
comportamiento reactivo.
• Tipos de eventos: – Interrupciones del hardware – Llamadas al sistema – Excepciones.
• Cada tipo de evento activa una RSI diferente, indexada a través del vector de interrupciones.
Interrupciones software
• Las llamadas al sistema y las excepciones funcionan como interrupciones del software: se
gestionan igual que las interrupciones del hardware, pero las provoca la propia CPU.
• Para provocar una interrupción software, existe una instrucción de máquina específica:
– INT (Intel) – TRAP (Motorola) – SYSCALL (MIPS).
Jerarquía de memorias
7
¿Cómo gestionar la jerarquía de memorias? memoria caché
• Aplicar el principio de caché: guardar en la memoria más rápida la información que se usa
con más frecuencia.
– Ejemplo: caché de disco.
– Ejemplo: caché de páginas web.
• La caché se acaba llenando. En ese caso, hay que descartar bloques de información que ya no
se necesitan política de caché / política de reemplazo.
– Descartar el más antiguo (FIFO).
– Descartar el que hace más tiempo que se usó (LRU).
– Descartar el menos frecuentemente usado (LFU)
– Al azar.
Protección de memoria
• Idea: pareja de registros base y límite, que delimitan la zona de memoria en la que el usuario
está autorizado a trabajar.
• Cuando se está en modo usuario, se activa un circuito que verifica que la dirección de
memoria es legal.
• Los accesos indebidos no salen al bus. En vez de ello, se produce una excepción.
8
Protección de E/S
• Las operaciones de E/S deben ser privilegiadas.
• Dos modelos de acceso a la E/S:
– Con instrucciones especiales (in,out) han de ser priviligiadas.
– A través de la memoria (memory mapped) el acceso a las direcciones que usa la E/S
debe estar prohibido en modo usuario.
9
El núcleo (kernel)
• Se suele llamar núcleo al componente del SO que reside en memoria de forma permanente y
atiende las llamadas al sistema y demás eventos.
• El resto de utilidades del SO (CLI, GUI, programas del sistema…) se apoyan en los servicios del
núcleo.
• En la parte teórica de la asignatura trataremos casi exclusivamente sobre el núcleo, no
abordaremos los otros componentes.
Arranque típico de un SO
1. Cuando el equipo se enciende, la CPU inicia su ejecución en un punto fijo de la memoria.
2. Hay una ROM con una pequeña rutina de arranque.
3. La rutina localiza en qué dispositivo se encuentra el cargador del SO (boot loader) y lo carga
en memoria.
– Nota: La ROM del equipo tiene código para leer y escribir sobre los dispositivos de E/S
4. El cargador instala el núcleo y se continúa el proceso de carga de módulos, servicios, etc.
hasta que el SO queda totalmente operativo.
Arquitectura del SO
• ¿qué estructura interna tiene un SO?
• Algunas estructuras:
– Monolítico todo en un mazacote de código.
10
– En capas niveles de abstracción creciente.
• El SO se construye como una jerarquía de niveles, cada uno de los cuales aprovecha los
servicios del nivel inferior.
Sistema por capas puro (THE)
• Sistema experimental de los años 60
• Seis niveles:
– L5: aplicaciones de usuario
– L4: buffering
– L3: consola del operador
– L2: gestión de memoria paginada
– L1: planificación de procesos
– L0: hardware
11
• Ventajas:
– Se pueden construir servicios nuevos del SO sin tocar el núcleo.
– Se pueden implementar múltiples versiones para un mismo servicio (ej. varios sistemas de
ficheros).
– El SO es más fácil de portar a otras arquitecturas (sólo hay que tocar el micronúcleo).
– Más seguridad y fiabilidad (menos código en modo privilegiado).
• Inconvenientes:
– La comunicación entre módulos penaliza el rendimiento.
12
Implementación del SO
• El SO presenta características especiales
– Pieza crítica: todas las aplicaciones dependen de él.
– Es mucho más complicado de depurar y de actualizar.
• Lenguaje de programación
– En el pasado, en lenguaje ensamblador (por eficiencia).
– Ahora en lenguajes de alto nivel, sobre todo C y C++
• Desarrollo modular
– Posibilidad de desarrollar módulos cargables por separado y dinámicamente.
• Disponibilidad del código fuente
– Sistema propietario sólo tenemos los binarios ya compilados (Windows, Mac OS X,
OS/360…).
– Software libre podemos tener la fuente y compilarlo en nuestro equipo (Linux,
FreeBSD…).
Tema 2. Procesos
¿Qué es un proceso?
• Un proceso es un programa en ejecución.
• Un proceso nuevo se crea a través de una llamada al sistema (Windows: CreateProcess; Unix:
fork, execve).
• Un proceso necesita recursos para poder ejecutarse: memoria RAM, dispositivos de E/S, la
CPU, etc.
• Casi siempre el proceso tendrá que competir con otros procesos para obtener tiempo de
CPU y áreas de memoria.
• A medida que un proceso se ejecuta, cambia de estado:
– Nuevo: recién creado por el S.O.
– En ejecución: está en la CPU ejecutando instrucciones.
– Bloqueado: esperando a que ocurra algún evento (ej. una operación de E/S).
– Preparado: esperando a que le asignen un procesador.
– Terminado: no ejecutará más instrucciones y el S.O. le retirará los recursos que consume.
13
Bloque de control de proceso (BCP)
• Cada proceso debe tener una estructura de datos que almacena su estado y otra información
de control:
– Valores de los registros de la CPU.
– Estado actual (preparado, bloqueado, etc.).
– Información para el planificador (prioridad, tiempo de espera…).
– Apuntadores a los recursos de memoria, E/S, archivos etc. que tiene concedidos o abiertos.
– Información de contabilidad (tiempo consumido….).
Cola de planificación
• Conjunto de procesos en espera por la utilización de un determinado recurso
• Implementación: tabla, lista enlazada, árbol…
• El planificador inserta y extrae procesos de la cola de acuerdo con la política implementada.
Colas de procesos
• El SO organiza los BCP en colas de espera por el procesador o por los dispositivos de E/S.
(colas de planificación: cola de procesos, colas de dispositivos).
Niveles de planificación
• El planificador de corto plazo (PCP) o de bajo nivel es el que asigna y desasigna la CPU.
• En los sistemas por lotes, existe un planificador de largo plazo (PLP) o de alto nivel, que
suministra procesos a la cola de preparados.
• El PLP trata de conseguir una mezcla adecuada de trabajos intensivos en CPU y en E/S. Se
ejecuta con poca frecuencia.
• Planificador de medio plazo (PMP) (swapper). Envía al disco procesos bloqueados, para
liberar memoria principal a los otros procesos intercambio (swapping).
14
Cambio de contexto (context switch)
• Es la operación que consiste en desalojar a un proceso de la CPU y reanudar otro.
• El módulo del SO encargado de esta acción se suele llamar despachador (dispatcher).
• Hay que guardar el estado del proceso que sale en su BCP, y recuperar los registros del
proceso que entra. Cada contexto se encuentra en cada BCP.
• El cambio de contexto es tiempo perdido, así que debe ser lo más rápido posible.
• El hardware a veces ofrece mecanismos para reducir el tiempo del cambio de contexto (ej.
en x86, instrucción PUSHA/POPA = guarda/recupera en la pila todos los registros; en ARM,
instrucciones LDM/STM).
Creación de procesos
• Todo proceso se crea mediante una llamada al sistema ejecutada por otro proceso.
Ejemplos de llamadas al sistema: Windows CreateProcess(); UNIX fork(), exec().
• Al creador se le llama proceso padre y al nuevo, proceso hijo.
• Relación entre el padre y el hijo:
– ¿ejecutan el mismo código?
– ¿utilizan la misma área de memoria?
– ¿comparten archivos abiertos y otros recursos?
– cuando el padre termina, ¿el hijo muere con él?
• Cada proceso recibe un identificador único (PID en Unix y Windows).
• Los padres e hijos van formando un árbol de procesos.
15
Terminación de procesos
• Un proceso termina cuando invoca a una llamada al sistema específica, ej. exit()
• También si se genera una excepción y el S.O. decide abortarlo.
• En UNIX, cuando un proceso termina, con él mueren sus descendientes.
• Podría existir una llamada al sistema para abortar otro proceso, ej. kill()
• Esperar por la terminación de un proceso hijo: wait()
HILOS (THREADS)
Un hilo, hebra o proceso ligero es una unidad básica de ejecución, con su propio:
contador de programa, registros de CPU y pila (stack).
• Los hilos dentro de una misma aplicación comparten:
código, datos y recursos del S.O. (ficheros, E/S, etc.).
• Hilos = procesos ligeros (lightweight processes).
• Un proceso pesado contiene uno o varios hilos que comparten la misma memoria y recursos.
– Proceso pesado = aplicación
– Hilos = actividades concurrentes dentro de la aplicación.
16
Hilos a nivel de usuario / de núcleo (kernel threads / user threads)
• Algunos sistemas manejan los hilos fuera del núcleo, dentro de la propia aplicación hilos
de usuario (Java JVM clásica, POSIX threads, etc.).
• Hilos de núcleo el propio núcleo es el que soporta los hilos (Actualmente, es el caso más
frecuente).
• En un sistema con hilos de usuario, el núcleo no «sabe» que un proceso tiene concurrencia
interna si un hilo queda bloqueado, se bloquea a todo el proceso pesado.
17
– procesos intensivos en CPU (ej. cálculos numéricos).
– procesos intensivos en E/S (ej. interactivos).
19
RR: modificaciones
• Q de duración variable, en función de la carga del sistema o de la prioridad del proceso que
entra en CPU.
• Ejemplo: en Linux (algoritmo CFS), cada proceso que entra en CPU recibe una Q proporcional
al tiempo que el proceso ha estado en espera y al número de procesos en el sistema.
Multicolas
• Varias colas de preparados, cada una gestionada con una política diferente. Ejemplo:
– Cola de procesos interactivos con RR.
– Cola de procesos por lotes con FCFS.
• Las colas se reparten la CPU según alguna política:
– Por prioridad absoluta.
– Un % de tiempo para cada cola, etc.
• Multicolas con realimentación.
– Posibilidad de que un proceso se mueva de una cola a otra, p.ej. si cambia su
comportamiento.
– Ej. UNIX clásico: un proceso que lleva mucho tiempo en espera se mueve a una cola de más
prioridad.
20
Planificación de multiprocesadores
• Procesamiento asimétrico. Un procesador se encarga de planificar el trabajo de los restantes
(técnica en desuso).
• Procesamiento simétrico. Cada procesador realiza su planificación.
– cola de preparados única en memoria compartida.
– una cola por procesador.
• Afinidad al procesador. Mantener al proceso siempre en un mismo procesador, para que
aproveche los datos que puedan estar en la caché de la CPU.
• Equilibrado de carga. Tratar de que no haya procesadores muy ocupados u ociosos.
– Migración comandada (push) una tarea supervisora comprueba la carga y traslada
procesos.
– Migración solicitada (pull) un procesador ocioso puede «robar» procesos a otro más
cargado.
Tema 3. Concurrencia
¿Qué es concurrencia?
• Definición de diccionario: coincidir en el espacio o en el tiempo dos o más personas o cosas.
• En Informática, se habla de concurrencia cuando hay una existencia simultánea de varios
procesos en ejecución.
• ¡Ojo! concurrencia existencia simultánea no implica ejecución simultánea.
• El paralelismo es un caso particular de la concurrencia: cuando hay ejecución simultánea de
instrucciones en varios procesadores.
• Computación distribuida: paralelismo en sistemas distribuidos o en red.
• Programación concurrente: Cuando aprendemos a programar, aprendemos algorítmica
secuencial (no permite expresar la concurrencia).
• ¿Cómo podemos expresar la concurrencia en nuestros programas? Una API (pthreads),
Objetos concurrentes (java), Sentencias concurrentes (Ada, go).
21
• Sentencia concurrente: En este tema, expresaremos las actividades concurrentes con una
construcción llamada sentencia concurrente:
Comunicación y sincronización
• En muchos programas concurrentes, los procesos concurrentes son cooperativos y tienen
necesidad de comunicarse información.
– Si son hilos (ej. Java, C), se pueden comunicar mediante variables compartidas.
• Además, en ocasiones será necesario detener a un proceso hasta que se produzca un
determinado evento o se den ciertas condiciones sincronización.
El problema de la concurrencia es que no sabe que método se va a ejecutar primero,
obteniendo un resultado inesperado (No determinismo).
Nota: no podemos suponer nada sobre la velocidad relativa de los procesos, ni el orden de
ejecución.
22
Posible solución
• Exclusión mutua.
• Progreso: si ningún proceso está en sección crítica y hay procesos que desean entrar en su
sección crítica, sólo estos últimos participarán en la decisión y ésta se tomará en un tiempo
finito.
• Espera limitada: hay un límite para el número de veces que otros procesos pueden
adelantarse a un proceso que quiere entrar en sección crítica.
23
Segundo intento: avisadores
24
Instrucciones hardware atómicas
• Inventadas en los años 60.
• Permiten evaluar y asignar un valor a una variable de forma atómica.
– test-and-set(B): Pone B a true y devuelve el antiguo valor de B.
– SWAP(A,B): Intercambia los valores de A y B.
• Si disponemos de estas instrucciones, se simplifica muchísimo el problema de la sección
crítica.
25
• Ejemplos:
– Esperar a que ocurra un evento o que finalice otro hilo.
– Problema del búfer finito (típico al gestionar una cola de acceso a un servicio).
– Problema de los lectores y escritores (típico en bases de datos).
Lectores y escritores
• Esquema útil para gestionar el acceso a una base de datos:
– Puede haber varios lectores accediendo a la BD de forma concurrente.
– Sólo puede haber un escritor trabajando.
– No puede haber lectores y escritores al mismo tiempo.
– … y si se puede, que no haya inanición.
Herramientas de sincronización
• Basadas en memoria compartida:
– Semáforos (Dijkstra, 1965).
– Regiones críticas condicionales (Hansen, 1972).
– Monitores (Hoare, 1972) mutex, variables condición.
• No necesitan memoria compartida:
26
– Canales (Hoare, 1978).
– Buzones.
– Promesas y futuros (Friedman & Wise, 1976; Baker & Hewitt, 1977).
Mutex o cerrojo
• (mutex = “mutual exclusion”) Un objeto que sirve para adquirir en exclusiva el derecho de
acceso a un recurso.
• Dos posibles estados: libre y adquirido. Inicialmente está libre.
• Operaciones:
– lock() Adquiere el mutex. Si el mutex ya estaba adquirido, el proceso se bloquea
hasta que lo consigue adquirir.
– unlock() Libera el mutex. Si hay procesos en espera por el mutex, uno de ellos lo
adquiere y se desbloquea.
• Las operaciones garantizan ejecución atómica.
Variables condición
• Una variable condición sirve para gestionar una cola de espera por un recurso o una
condición lógica.
• La variable condicional está siempre asociada a un mutex.
• Operaciones:
– wait() bloquea al proceso y lo mete en la cola de la v.c. Mientras el proceso está
bloqueado, se libera el mutex. Cuando el proceso se desbloquea, debe volver a
adquirir el mutex.
– signal() desbloquea a un proceso de la cola; si no hay procesos en cola, no se hace
nada.
– broadcast() desbloquea a todos los procesos de la cola.
27
¿Qué ocurre tras un «signal»?
• ¿Qué ocurre cuando un proceso P realiza una operación signal sobre una variable condición
C y existe un proceso Q bloqueado en C?
– Estilo Hoare Q se reanuda inmediatamente (a P se le despoja del mutex).
– Estilo Mesa Q se desbloquea, pero espera a que P libere el mutex.
• El «estilo Mesa» es el más utilizado en los lenguajes de programación actuales.
• ¿Qué ocurre si varios procesos están bloqueados en una variable condición C y algún proceso
ejecuta C. signal?, ¿cuál de los procesos se reanuda?
– FIFO desbloqueamos al más antiguo.
– Por prioridades conveniente en sistemas de tiempo real.
– Al azar es lo que ocurre en implementaciones con espera activa.
– Desbloqueamos a todos y que ellos se peleen por el mutex (operación «broadcast»).
28
Mutex: implementación sin espera activa.
29
• Problema de los lectores y escritores
• Si los filósofos cogen los palillos sin control, se puede llegar a un estado de bloqueo mutuo
entre todos los filósofos interbloqueo.
• Posibles soluciones:
– Algoritmo asimétrico filósofos pares/impares.
– Impedir a más de cuatro filósofos entrar a pedir los palillos.
– Coger los dos palillos de forma atómica (o coges los dos, o no coges ninguno).
30