- Sistema Operativo
- Funciones principales
- Problemas que debe evitar
- Componentes
- Servicios
- Elementos Básicos de una computadora
- Es software
- Necesita un procesador y memoria para ejecutarse
- Dos Perspectivas
- De arriba hacia abajo
- De abajo hacia arriba
- Gestiona el HW
- Controla la ejecución de los procesos
- Interfaz entre aplicaciones y HW
- Actúa como intermediario entre un usuario de una computadora y el HW de la misma
- Abstracción con respecto a la arquitectura
- Arquitectura conjunto de instrucciones, organización de memoria, E/S, estructura de bus
- El SO oculta el HW y presenta a los programas como abstracciones más simples de manejar.
- Los programas de aplicación son los clientes del SO.
- Comparación: uso de escritorio y uso de comandos de texto
- Comodidad, amigabilidad (friendliness)
- Visión del SO como un administrador de recursos
- Administra los recursos de HW de uno o más procesos
- Provee un conjunto de servicios a los usuarios del sistema
- Maneja la memoria secundaria y dispositivos de I/O.
- Ejecución simultánea de procesos
- Multiplexación en tiempo (CPU) y en espacio (memoria)
- Comodidad Hacer mas fácil el uso del hardware (PC, servidor, switch, router, controlador específico)
- Eficiencia Hacer un uso más eficiente de los recursos del sistema
- Evolución Permitir la introducción de nuevas funciones al sistema sin interferir con funciones anteriores
- Brindar abstracciones de alto nivel a los procesos de usuario
- Administrar eficientemente el uso de la CPU
- Administrar eficientemente el uso de la memoria
- Brindar asistencia al proceso de E/S por parte de los procesos
- Que un proceso se apropie de la CPU
- Que un proceso intente ejecutar instrucciones privilegiadas (Ej: E/S)
- Que un proceso intente acceder a una posición de memoria fuera de su espacio permitido.
- Proteger los espacios de direcciones
Para ello debe
- Gestionar/controlar el uso de la CPU
- Detectar intentos de ejecución de instrucciones privilegiadas
- Detectar accesos ilegales a memoria
- Proteger el vector de interrupciones
- Así como las RAI (Rutinas de atención de interrupciones)
- Kernel
- Shell GUI / CUI o CLI
- Herramientas Editores, Compiladores, Librerías, etc.
Es una Porción de código
que se encuentra en memoria principal y se encarga de la administración de los recursos
Implementa servicios esenciales:
- Manejo de memoria
- Manejo de la CPU
- Administración de procesos
- Comunicación y Concurrencia
- Gestión de la E/S
Sobre el Kernel del Sistema Operativo
- Es un conjunto de módulos de software
- Se ejecuta en el procesador como cualquier otro proceso
- Entonces:
- ¿El kernel es un proceso? Y de ser así ¿Quien lo controla?
- Diferentes enfoques de diseño
Enfoque 1 – El Kernel como entidad independiente
- El Kernel se ejecuta fuera de todo proceso
- Es una arquitectura utilizada por los primeros SO
- Cuando un proceso es “interrumpido” o realiza una System Call, el contexto del proceso se salva y el control se pasa al Kernel del sistema operativo.
- El Kernel tiene su propia región de memoria
- El Kernel tiene su propio Stack
- Finalizada su actividad, le devuelve el control al proceso (o a otro diferente)
- Importante:
- El Kernel NO es un proceso. EL concepto de proceso solo se asocia a programas de usuario
- Se ejecuta como una entidad independiente en modo privilegiado
Enfoque 2 – El Kernel dentro del Proceso
- El Código del Kernel se encuentra dentro del espacio de direcciones de cada proceso.
- El Kernel se ejecuta en el MISMO contexto que algún proceso de usuario
- El Kernel se puede ver como una colección de rutinas que el proceso utiliza
- Dentro de un proceso se encuentra el código del programa (user) y el código de los módulos de SW del SO
- Cada proceso tiene su propio stack (uno en modo usuario y otro en modo kernel)
- El proceso es el que se Ejecuta en Modo Usuario y el kernel del SO se ejecuta en Modo Kernel (cambio de modo)
- El código del Kernel es compartido por todos los procesos
- En administración de memoria veremos el “como”
- Cada interrupción (incluyendo las de System Call) es atendida en el contexto del proceso que se encontraba en ejecución
- Pero en modo Kernel!!! (se pasa a este modo sin necesidad de hacer un cambio de contexto completo)
- Si el SO determina que el proceso debe seguir ejecutándose luego de atender la interrupción, cambia a modo usuario y devuelve el control. Es mas económico y performante
- Administración y planificación del procesador
- Multiplexacióon de la carga de trabajo
- Imparcialidad, justicia en la ejecución (Fairness)
- Que no haya bloqueos
- Manejo de Prioridades
- Administración de Memoria
- Administración de memoria eficientemente
- Memoria física vs memoria virtual. Jerarquías de memoria
- Protección de programas que compiten o se ejecutan concurrentemente
- Administración del almacenamiento (Sistema de archivos)
- Acceso a medios de almacenamiento externos
- Administración de dispositivos
- Ocultamiento de dependencias de HW
- Administración de accesos simultáneos
- Detección de errores y respuestas
- Errores de HW internos y Externos
- Errores de Memoria/CPU
- Errores de Dispositivos
- Errores de SW
- Errores Aritméticos
- Acceso no permitido a direcciones de memoria
- Incapacidad del SO para conceder una solicitud de una aplicación
- Errores de HW internos y Externos
- Interacción del Usuario (Shell)
- Contabilidad
- Recoger estadísticas del uso
- Monitorear parámetros de rendimiento
- Anticipar necesidades de mejoras futuras
- Dar elementos si es necesario facturar tiempo de procesamiento
Define limitaciones en el conjunto de instrucciones que se puede ejecutar en cada modo
- El bit en la CPU indica el modo actual
- Las instrucciones privilegiadas deben ejecutarse en modo Supervisor o Kernel
- Necesitan acceder a estructuras del kernel, o ejecutar código que no es del proceso
- En modo Usuario, el proceso puede acceder sólo a su espacio de direcciones, es decir a las direcciones “propias”.
- El kernel del SO se ejecuta en modo supervisor
- El resto del SO y los programas de usuario se ejecutan en modo usuario (subconjunto de instrucciones permitidas)
Datos de Color
- Procesador Intel 8088 no tenía modo dual de operación ni protección por hardware.
- En MsDos las aplicaciones pueden acceder directamente a las funciones básicas de E/S para escribir directamente en pantalla o en disco.
Tener en cuenta que
- Cuando se arranque el sistema, arranca con el bit en modo supervisor.
- Cada vez que comienza a ejecutarse un proceso de usuario, este bit se DEBE PONER en modo usuario.
- Mediante una Instrucción especial.
- Cuando hay un trap o una interrupción, el bit de modo se pone en modo Kernel.
- Única forma de pasar a Modo Kernel
- No es el proceso de usuario quien hace el cambio explicitamente.
Como Actua
Cuando el proceso de usuario intenta por sí mismo ejecutar instrucciones que pueden causar problemas (las llamadas instrucciones privilegiadas), el HW lo detecta como una operación ilegal y produce un trap al SO.
En windows
- En WIN2000 el modo núcleo ejecuta los servicios ejecutivos. El modo usuario ejecuta los procesos de usuario.
- Cuando un programa se bloquea en modo usuario, a lo sumo se escribe un suceso en el registro de sucesos. Si el bloqueo se produce estando en modo supervisor se genera la BSOD (pantalla azul de la muerte).
Modo kernel
- Gestión de procesos: Creación y terminación , planificación, intercambio, sincronización y soporte para la comunicación entre procesos
- Gestión de memoria: Reserva de espacio de direcciones para los procesos, Swapping, Gestión y páginas de segmentos
- Gestión E/S: Gestión de buffers, reserva de canales de E/S y de dispositivos de los procesos
- Funciones de soporte: Gestión de interrupciones, auditoría, monitoreo
Modo usuario
- Debug de procesos, definición de protocolos de comunicación gestión de aplicaciones (compilador, editor, aplicaciones de usuario
- En este modo se llevan a cabo todas las tareas que no requieran accesos privilegiados
- En este modo no se puede interactuar con el hardware
- El proceso trabaja en su propio espacio de direcciones
Se debe evitar que un proceso se apropie de la CPU
Se deben definir límites de memoria a los que puede acceder cada proceso (registros base y límite)
- Delimitar el espacio de direcciones del proceso
- Poner limites a las direcciones que puede utilizar un proceso
- Por ejemplo: Uso de un registro base y un registro límite
- El kernel carga estos registros por medio de instrucciones privilegiadas. Esta acción sólo puede realizarse en modo Kernel
La memoria principal aloja al SO y a los procesos de usuario
- El kernel debe proteger para que los procesos de usuario no puedan acceder donde no les corresponde
- El kernel debe proteger el espacio de direcciones de un proceso del acceso de otros procesos.
- Las instrucciones de E/S se definen como privilegiadas.
- Deben ejecutarse en Modo Kernel
- Se deberían gestionar en el kernel del sistema operativo
- Los procesos de usuario realizan E/S a través de llamadas al SO (es un servicio del SO)
- Uso de interrupción por clock para evitar que un proceso se apropie de la CPU
- Se implementa normalmente a través de un clock y un contador.
- El kernel le da valor al contador que se decrementa con cada tick de reloj y al llegar a cero puede expulsar al proceso para ejecutar otro.
- Las instrucciones que modifican el funcionamiento del reloj son privilegiadas.
- Se le asigna al contador el valor que se quiere que se ejecute un proceso.
- Se la usa también para el cálculo de la hora actual, basándose en cantidad de interrupciones ocurridas cada tanto tiempo y desde una fecha y hora determinada.
- Es la forma en que los programas de usuario acceden a los servicios del SO.
- Los parámetros asociados a las llamadas pueden pasarse de varias maneras: por registros, bloques o tablas en memoria ó la pila.
- count=read(file, buffer, nbytes);
- Se ejecutan en modo kernel o supervisor
Categorias
- Control de Procesos
- Manejo de archivos
- Manejo de dispositivos
- Mantenimiento de información del sistema
- Comunicaciones
Ejemplo
- Para activar iniciar la system call se indica:
- El número de syscall que se quiere ejecutar
- Los parámetros de esa syscall
- Luego se emite una interrupción para pasar a modo Kernel y gestionar la systemcall
- El manejador de interrupciones (syscall handler) evalúa la system call deseada y la ejecuta
Mas ejemplos
- Registros que pueden ser usados por las aplicaciones
- Pueden ser referenciados por lenguaje de máquina
- Disponible para programas/aplicaciones
- Tipos de registros
- Datos
- Direcciones
- Index
- Segment pointer
- Stack pointer
- Para control operativo del procesador
- Usados por rutinas privilegiadas del SO para controlar la ejecución de procesos
- Contiene la dirección de la proxima instrucción a ser ejecutada
- Contiene la instrucción a ser ejecutada
- La instrucción referenciada por el PC se almacena en el IR y se ejecuta
- Categorías de instrucciones
- Procesador - Memoria (Transfiere datos entre procesador y memoria)
- Procesador - E/S (Transfiere datos a/o desde periféricos)
- Procesamiento de Datos (Operaciones aritméticas o lógicas sobre datos)
- Control (Alterar secuencia de ejecución)
- Contiene códigos de resultado de operaciones
- habilita/deshabilita Interrupciones
- Indica el modo de ejecución (Supervisor/usuario)
Dos pasos
- El procesador busca (fetch) la instrucción en la memoria
- (PC) → IR
- El PC se incrementa después de cada fetch para apuntar a la próxima instrucción
- PC = PC + 4
- Interrumpen el secuenciamiento del procesador durante la ejecución de un proceso
- Dispositivos de E/S más lentos que el procesador (Procesador debe esperar al dispositivo)
Flujo de control SIN interrupciones | Flujo de control CON interrupciones |
---|---|
- Programa (o rutina) que determina la naturaleza de una interrupción y realiza lo necesario para atenderla
- Por ejemplo, para un dispositivo particular de E/S
- Generalemente es parte del SO
Suspende la secuencia normal de ejecución
Ciclo de interrupción
- El procesador chequea la existencia de interrupciones.
- Si no existen interrupciones, la próxima instrucción del programa es ejecutada
- Si hay pendiente alguna interrupción, se suspende la ejecución del progama actual y se ejecuta la rutina de manejo de interrupciones
Simple Interrupt Processing
Multiples Interrupciones
Deshabilitar las interrupciones mientras una interrupción está siendo procesada.
Baja utilización de la CPU
Dispositivos de E/S mucho mas lentos con respecto a la CPU
Ante instrucción de E/S, el procesador permanece ocioso. Cuando se completa la E/S, se continua con la ejecución del programa que se estaba ejecutando
- La operación de los sistemas batch se vio beneficiada del spooling de las tareas, al solapar la E/S de una tarea de la ejecución de otra
- Al estar las tareas cargadas en disco, ya no era necesario ejecutarlas en el orden en el que fueron cargadas (job scheduling)
- El SO mantiene varias tareas en memoria al mismo tiempo.
- La secuencia de programas es de acuerdo a prioridad u orden de llegada
- Cuando el proceso necesita realizar una operación de E/S, la CPU en lugar de permanecer ociosa, es utilizada para otro proceso.
- Después que se completa la atención de la interrupción, el control puede o no retornar al programa que se estaba ejecutando al momento de la interrupción
Tiempo Compartido
- Utiliza la multiprogramación para manejar múltiples trabajos interactivos
- El tiempo del procesador es compartido entre múltiples trabajos.
- Múltiples usuarios podrían acceder simultáneamente al sistema utilizando terminales
- Los procesos usan la CPU por un periodo máximo de tiempo, luego del cual se le da la CPU a otro proceso
Definicion
- Es un programa en ejecución
- Para nosotros serán sinónimos: tarea, job y proceso
Programa | Proceso |
---|---|
Es estatico | Es dinamico |
No tiene program counter | Tiene Program Counter |
Existe desde que se edita hasta que se borra | Su ciclo de vida comprende desde que se solicita ejecutar hastas que termina |
El modelo de proceso
- Multiprogramación de 4 procesos
- Modelo conceptual de 4 procesos secuenciales e independientes.
- Solo un proceso se encontrara activo en cualquier instante. (Si tenemos una sola CPU)
Proceso: Entidad de abstracción
Un proceso (para poder ejecutarse) incluye como mínimo:
- Sección de Código (texto)
- Sección de Datos (variables globales)
- Stack(s) (datos temporarios: parámetros , variables temporales y direcciones de retorno)
- Un proceso cuenta con 1 o mas stacks
- En general: modo Usuario y modo Kernel
- Se crean automáticamente y su medida se ajusta en run-time.
- Está formado por stack frames que son pushed (al llamar a una rutina) y popped (cuando se retorna de ella)
- El stack frame tiene los parámetros de la rutina(variables locales), y datos necesarios para recuperar el stack frame anterior (el contador de programa y el valor del stack pointer en el momento del llamado)
- Identificación del proceso, y del proceso padre
- Identificación del usuario que lo “disparó”
- Si hay estructura de grupos, grupo que lo disparó
- En ambientes multiusuario, desde que terminal y quien lo ejecuto
- Estructura de datos asociada al proceso (abstracción)
- Existe una por proceso.
- Es lo primero que se crea cuando se crea un proceso y lo último que se borra cuando termina
- Contiene la información asociada con cada proceso:
- PID, PPID, etc
- Valores de los registros de la CPU (PC, AC, etc)
- Planificación (estado, prioridad, tiempo consumido, etc)
- Ubicación (representación) en memoria
- Accounting
- Entrada salida (estado, pendientes, etc)
- Es el conjunto de direcciones de memoria que ocupa el proceso
- stack, text y datos
- No incluye su PCB o tablas asociadas
- Un proceso en modo usuario puede acceder sólo a su espacio de direcciones;
- En modo kernel, se puede acceder a estructuras internas (PCB del proceso por ejemplo) o a espacios de direcciones de otros procesos.
Espacio de direcciones del proceso + PCB
- Incluye toda la información que el SO necesita para administrar el proceso, y la CPU para ejecutarlo correctamente.
- Son parte del contexto, los registros de cpu, inclusive el contador de programa, prioridad del proceso, si tiene E/S pendientes, etc.
- Se produce cuando la CPU cambia de un proceso a otro.
- Se debe resguardar el contexto del proceso saliente, que pasa a espera y retornará después a la CPU.
- Se debe cargar el contexto del nuevo proceso y comenzar desde la instrucción siguiente a la última ejecutada en dicho contexto.
- Es tiempo no productivo de CPU
- El tiempo que consume depende del soporte de HW
En su ciclo de vida, un proceso pasa por diferentes estados.
- Nuevo (new)
- Listo para ejecutar (ready)
- Ejecutándose (running)
- En espera (waiting)
- Terminado (terminated)
Procesos alternan ráfagas de CPU y de I/O
- CPU-bound (Mayor parte del tiempo utilizando la CPU)
- I/O-bound (I/O = E/S) (Mayor parte del tiempo esperando por I/O)
- La velocidad de la CPU es mucho mas rápida que la de los dispositivos de E/S
- Pensar: Necesidad de atender rápidamente procesos I/O-bound para mantener el dispositivo ocupado y aprovechar la CPU para procesos CPU-bound
- Para realizar la planificación, el SO utiliza la PCB de cada proceso como una abstracción del mismo
- Las PCB se enlazan en Colas siguiendo un orden determinado
- Ejemplos
- Cola de trabajos o procesos (Contiene todas las PCB de procesos en el sistema)
- Cola de procesos listos (PCB de procesos residentes en memoria principal esperando para ejecutarse)
- Cola de dispositivos (PCB de procesos esperando por un dispositivo de I/O)
- Planificación: (Necesidad de determinar cual de todos los procesos que están listos para ejecutarse, se ejecutará a continuación en un ambiente multiprogramado)
- Algoritmo de Planificación (Algoritmo utilizado para realizar la planificación del sistema)
- Según el ambiente es posible requerir algoritmos de planificación diferentes, con diferentes metas:
- Equidad: Otorgar una parte justa de la CPU a cada proceso
- Balance: Mantener ocupadas todas las partes del sistema
- Ejemplos:
- Procesos por lotes (batch)
- Procesos Interactivos
- Procesos en Tiempo Real
- No existen usuarios que esperen una respuesta en una terminal.
- Se pueden utilizar algoritmos no apropiativos
- Metas propias de este tipo de algoritmos:
- Rendimiento: Maximizar el número de trabajos por hora
- Tiempo de Retorno: Minimizar los tiempos entre el comienzo y la finalización
- El Tiempo es espera se puede ver afectado
- Uso de la CPU: Mantener la CPU ocupada la
- Ejemplos de Algoritmos:
- FCFS – First Come First Served
- SJF – Shortest Job First
- No solo interacción con los usuarios
- Un servidor, necesita de varios procesos para dar respuesta a diferentes requerimientos
- Son necesarios algoritmos apropiativos para evitar que un proceso acapare la CPU
- Metas propias de este tipo de algoritmos:
- Tiempo de Respuesta: Responder a peticiones con rapidez
- Proporcionalidad: Cumplir con expectativas de los usuarios
- Si el usuario le pone STOP al reproductor de música, que la música deje de ser reproducida en un tiempo considerablemente corto.
Módulos de la planificación
- Son módulos (SW) del Kernel que realizan distintas tareas asociadas a la planificación.
- Se ejecutan ante determinados eventos que así lo requieren:
- Creación/Terminación de procesos
- Eventos de Sincronización o de E/S
- Finalización de lapso de tiempo
- Etc
- Scheduler de long term
- Scheduler de short term
- Scheduler de medium term
- Su nombre proviene de la frecuencia de ejecución.
- Otros módulos: Dispatcher y Loader
- Pueden no existir como módulos separados de los schedulers vistos, pero la función debe cumplirse.
- Dispatcher hace cambio de contexto, cambio de modo de ejecución...”despacha” el proceso elegido por el Short Term (es decir, “salta” a la instrucción a ejecutar).
- Loader carga en memoria el proceso elegido por el long term
- Existen situaciones en las que es necesario que la planificación de uno o varios procesos se comporte de manera diferente
- El algoritmo de planificación debe estar parametrizado, de manera que los procesos/usuarios pueden indicar los parámetros para modificar la planificación
- El Kernel implementa el mecanismo
- El usuario/proceso/administrador utiliza los parámetros para determinar la Política
- Ejemplo:
- Un algoritmo de planificación por prioridades y una System Call que permite modificar la prioridad de un proceso (man nice)
- Un proceso puede determinar las prioridades de los procesos que el crea, según la importancia de los mismos.
- Controla el grado de multiprogramación, es decir, la cantidad de procesos en memoria.
- Puede no existir este scheduler y absorber esta tarea el de short term.
- Si es necesario, reduce el grado de multiprogramación
- Saca temporalmente de memoria los procesos que sea necesario para mantener el equilibrio del sistema.
- Términos asociados: swap out (sacar de memoria), swap in (volver a memoria).
- Decide a cuál de los procesos en la cola de listos se elige para que use la CPU.
- Términos asociados: apropiativo, no apropiativo, algoritmo de scheduling
- Un usuario “dispara” el proceso. Un proceso es creado por otro proceso: su proceso padre.
- En este estado se crean las estructuras asociadas, y el proceso queda en la cola de procesos, normalmente en espera de ser cargado en memoria
- Luego que el scheduller de largo plazo eligió al proceso para cargarlo en memoria, el proceso queda en estado listo
- El proceso sólo necesita que se le asigne CPU
- Está en la cola de procesos listos (ready queue)
- El scheduler de corto plazo lo eligió para asignarle CPU
- Tendrá la CPU hasta que se termine el período de tiempo asignado (quantum o time slice), termine o hasta que necesite realizar alguna operación de E/S
El proceso necesita que se cumpla el evento esperado para continuar. El evento puede ser la terminación de una E/S solicitada, o la llegada de una señal por parte de otro proceso. Sigue en memoria, pero no tiene la CPU. Al cumplirse el evento, pasará al estado de listo.
- New-Ready Por elección del scheduler de largo plazo (carga en memoria)
- Ready-Running Por elección del scheduler de corto plazo (asignación de CPU)
- Running-Waiting el proceso “se pone a dormir”, esperando por un evento.
- Waiting-Ready Terminó la espera y compite nuevamente por la CPU.
- Cuando el proceso termina su quantum (franja de tiempo) sin haber necesitado ser interrumpirlo por un evento, pasa al estado de ready, para competir por CPU, pues no está esperando por ningún evento...
- Se trata de un caso distinto a los anteriores, porque el procesos es expulado de la CPU contra su voluntad
- Esta situación se da en algoritmos apropiativos
1)
Ejecución en modo usuario2)
Ejecución en modo kernel3)
El proceso está listo para ser ejecutado cuando sea elegido.4)
Proceso en espera en memoria principal.5)
Proceso listo, pero el swapper debe llevar al proceso a memoria ppal antes que el kernel lo pueda elegir para ejecutar6)
Proceso en espera en memoria secundaria.7)
Proceso retornando desde el modo kernel al user. Pero el kernel se apropia, hace un context switch para darle la CPU a otro proceso.8)
Proceso recientemente creado y en transición: existe, pero aun no está listo para ejecutar, ni está dormido.9)
El proceso ejecutó la system call exit y está en estado zombie. Ya no existe más, pero se registran datos sobre su uso, codigo resultante del exit. Es el estado final.
-
La apropiación esta relaciona al recurso CPU
-
En los algoritmos Apropiativos (preemtive) existen situaciones que hacen que el proceso en ejecución sea expulsado, por el planificador de corto plazo, de la CPU
-
En los algoritmos No Apropiativos (nonpreemptive) los procesos se ejecutan hasta que el mismo (por su propia cuenta) abandone la CPU
-
Apropiativos
- Round Robin
- SRTF
- Prioridades Apropiativo
-
No Apropiativos
- FCFC
- SJF
- Prioridades No apropiativo
El proceso deja el estado de ejecución solo cuando:
- Termina (Syscall Exit)
- Se bloquea voluntariamente (SysCall wait, sleep, etc)
- Solicita una operación de E/S (Syscall Read, Write, etc)
En los algoritmos No Apropiativo (nonpreemptive) los procesos se ejecutan hasta que el mismo (por su propia cuenta) abandone la CPU
- Se bloquea por E/S o finaliza
- No hay decisiones de planificación durante las interrupciones de reloj
El proceso puede ser expulsado de la CPU según la planificación implementada
- Se le termina su quantum (Algoritmo round robin)
- Llega a la cola de listos un proceso de mayor prioridad (Algoritmo prioridades apropiativo)
- Llega a la cola de listos un proceso con menor tiempo restante (Algoritmo SRTF)
En los algoritmos Apropiativos (preemtive) existen situaciones que hacen que el proceso en ejecución sea expulsado de la CPU
- Un proceso es creado por otro proceso
- Un proceso padre tiene uno o más procesos hijos.
- Se forma un árbol de procesos
- En UNIX:
- system call fork() crea nuevo proceso
- system call execve(), generalmente usada después del fork, carga un nuevo programa en el espacio de direcciones.
- En Windows:
- system call CreateProcess() crea un nuevo proceso y carga el programa para ejecución
- Crear la PCB
- Asignar PID (Process IDentification) único
- Asignarle memoria para regiones (Stack, Text y Datos)
- Crear estructuras de datos asociadas (Fork (copiar el contexto, regiones de datos, text y stack))
Con respecto a la Ejecución:
- El padre puede continuar ejecutándose concurrentemente con su hijo
- El padre puede esperar a que el proceso hijo (o los procesos hijos) terminen para continuar la ejecución.
Con respecto al Espacio de Direcciones:
- El hijo es un duplicado del proceso padre (caso Unix)
- Se crea el proceso y se le carga adentro el programa (caso Windows)
- Ante un (exit), se retorna el control al sistema operativo
- El proceso padre puede esperar recibir un código de retorno (via wait). Generalmente se lo usa cuando se requier que el padre espere a los hijos.
- Proceso padre puede terminar la ejecución de sus hijos (kill)
- La tarea asignada al hijo se terminó
- Cuando el padre termina su ejecución
- Habitualmente no se permite a los hijos continuar, pero existe la opción.
- Terminación en cascada
Exec Code
encuentre el programa ejecutable verifique el permiso de ejecución lea y verifique los argumentos de copia del encabezado, del entorno al kernel libere el espacio de direcciones antiguo asigne nuevos argumentos de copia del espacio de direcciones, del entorno a la pila Restablezca las señales inicialice los registros
- Independiente el proceso no afecta ni puede ser afectado por la ejecución de otros procesos. No comparte ningún tipo de dato.
- Cooperativo afecta o es afectado por la ejecución de otros procesos en el sistema.
- Para compartir información (por ejemplo, un archivo)
- Para acelerar el cómputo (separar una tarea en sub-tareas que cooperan ejecutándose paralelamente)
- Para planificar tareas de manera tal que se puedan ejecutar en paralelo.
- La organización y administración de la “memoria principal es uno de los factores más importantes en el diseño de los S. O.
- Los programas y datos deben estar en el almacenamiento principal para:
- Poderlos ejecutar.
- Referenciarlos directamente
- El SO debe:
- Llevar un registro de las partes de memoria que se están utilizando y de aquellas que no.
- Asignae espacio en memoria principal a los procesos cuando estos la necesitan.
- Libera espacio de memoria asignada a procesos que han terminado.
- Lograr que el programador se abstraiga de la alocación de los programas
- Brindar seguridad entre los procesos para que unos no accedan a secciones privadas de otros
- Brindar la posibilidad de acceso compartido a determinadas secciones de la memoria (librerías, código en común, etc.)
- Garantizar la performance del sistema
- Se espera de un S.O. un uso eficiente de la memoria con el fin de alojar el mayor número de procesos
- División Lógica de la Memoria Física para alojar múltiples procesos
- Garantizando protección
- Depende del mecanismo provisto por el HW
- Asignación eficientemente
- Contener el mayor numero de procesos para garantizar el mayor uso de la CPU por los mismos
- Reubicación
- El programador no debe ocuparse de conocer donde será colocado en la Memoria RAM
- Mientras un proceso se ejecuta, puede ser sacado y traído a la memoria (swap) y, posiblemente, colocarse en diferentes direcciones.
- Las referencias a la memoria se deben “traducir” según ubicación actual del proceso.
- Protección
- Los procesos NO deben referenciar – acceder - a direcciones de memoria de otros procesos
- Salvo que tengan permiso
- Los procesos NO deben referenciar – acceder - a direcciones de memoria de otros procesos
- El chequeo se debe realizar durante la ejecución:
- NO es posible anticipar todas las referencias a memoria que un proceso puede realizar.
- Compartición
- Permitir que varios procesos accedan a la misma porción de memoria.
- Ej: Rutinas comunes, librerías, espacios explícitamente compartidos, etc.
- Permitir que varios procesos accedan a la misma porción de memoria.
- Permite un mejor uso – aprovechamiento - de la memoria RAM, evitando copias innecesarias (repetidas) de instrucciones
- Rango de direcciones (a memoria) posibles que un proceso puede utilizar para direccionar sus instrucciones y datos.
- El tamaño depende de la Arquitectura del
Procesador
- 32 bits: 0 .. 2^32 - 1
- 64 bits: 0 .. 2^64 – 1
- Es independiente de la ubicación “real” del proceso en la Memoria RAM
- Lógicas
- Referencia a una localidad de memoria independiente de la asignación actual de los datos en la memoria.
- Representa una dirección en el “Espacio de Direcciones del Proceso”
- Físicas
- Referencia una localidad en la Memoria Física (RAM)
- Dirección absoluta
- En caso de usar direcciones Lógicas, es necesaria algún tipo de conversión a direcciones Físicas
- Referencia una localidad en la Memoria Física (RAM)
Una forma simple de hacer esto es utilizando registros auxiliares
- Registro Base
- Dirección de comienzo del Espacio de Direcciones del proceso en la RAM
- Registro Limite
- Dirección final del proceso o medida del proceso
- Tamaño de su Espacio de Direcciones
- Ambos valores se fijan cuando el espacio de direcciones del proceso es cargado a memoria.
- Varían entre procesos (Context Switch)
- Si la CPU trabaja con direcciones lógicas, para acceder a memoria principal, se deben transformar en direcciones físicas.
- Resolución de direcciones (address-binding): transformar la dirección lógica en la dirección física correspondiente
- Resolución en momento de compilación (Archivos .com de DOS) y en tiempo de carga
- Direcciones Lógicas y Físicas son idénticas
- Para reubicar un proceso es necesario recompilarlo o recargarlo.
- Resolución en tiempo de ejecución
- Direcciones Lógicas y Físicas son diferentes
- Direcciones Lógicas son llamadas “Direcciones Virtuales”
- La reubicación se puede realizar fácilmente
- El mapeo entre “Virtuales” y “Físicas” es realizado por hardware
- Memory Management Unit (MMU)
- Dispositivo de Hardware que mapea direcciones virtuales a físicas
- Es parte del Procesador
- Re-programar el MMU es una operación privilegiada
- solo puede ser realizada en Kernel Mode
- El valor en el “registro de realocación” es sumado a cada dirección generada por el proceso de usuario al momento de acceder a la memoria.
- Los procesos nunca usan direcciones físicas
- Particiones Fijas: El primer esquema implementado
- La memoria se divide en particiones o regiones de tamaño Fijo (pueden ser todas del mismo tamaño o no)
- Alojan un proceso cada una
- Cada proceso se coloca de acuerdo a algún criterio (First Fit, Best Fit, Worst Fit, Next Fit) en alguna partición
- Particiones dinámicas: La evolución del esquema anterior
- Las particiones varían en tamaño y en número
- Alojan un proceso cada una
- Cada partición se genera en forma dinámica del tamaño justo que necesita el proceso
¿Qué problemas se generan en cada caso?
La fragmentación se produce cuando una localidad de memoria no puede ser utilizada por no encontrarse en forma contigua
- Se produce en el esquema de particiones Fijas
- Es la porción de la partición que queda sin utilizar
- Se produce en el esquema de particiones dinámicas
- Son huecos que van quedando en la memoria a medida que los procesos finalizan
- Al no encontrarse en forma contigua puede darse el caso de que tengamos memoria libre para alocar un proceso, pero que no la podamos utilizar
- Para solucionar el problema se puede acudir a la compactación, pero es muy costosa
- El esquema de Registro Base + Limite presenta
problemas:
- Necesidad de almacenar el Espacio de Direcciones de forma continua en la Memoria Física
- Los primeros SO definían particiones fijas de memoria, luego evolucionaron a particiones dinámicas
- Fragmentación
- Mantener “partes” del proceso que no son necesarias
- Los esquemas de particiones fijas y dinámicas no se usan hoy en día
- Solución:
- Paginación
- Segmentación
- Memoria Física es dividida lógicamente en pequeños trozos de igual tamaño Marcos
- Memoria Lógica (espacio de direcciones) es dividido en trozos de igual tamaño que los marcos -> Paginas
- El SO debe mantener una tabla de paginas por cada proceso, donde cada entrada contiene (entre otras) el Marco en la que se coloca cada pagina.
- La dirección lógica se interpreta como:
- un numero de pagina y un desplazamiento dentro de la misma.
- Esquema que se asemeja a la “visión del usuario”. El programa se divide en partes/secciones
- Un programa es una colección de segmentos. Un segmento es una unidad lógica como:
- Programa Principal, Procedimientos y Funciones, variables locales y globales, stack, etc.
- Puede causar Fragmentación
- Todos los segmentos de un programa pueden no tener el mismo tamaño (código, datos, rutinas).
- Las direcciones Lógicas consisten en 2 partes:
- Selector de Segmento
- Desplazamiento dentro del segmento
- Tabla de Segmentos
- Permite mapear la dirección lógica en física. Cada entrada contiene:
- Base: Dirección física de comienzo del segmento
- Limit: Longitud del Segmento
- Permite mapear la dirección lógica en física. Cada entrada contiene:
- Segment-table base register (STBR): apunta a la ubicación de la tabla de segmentos.
- Segment-table length register (STLR) : cantidad de segmentos de un programa
- La paginación
- Transparente al programador
- Elimina Fragmentación externa.
- Segmentación
- Es visible al programador
- Facilita modularidad, estructuras de datos grandes y da mejor soporte a la compartición y protección
- Segmentación Paginada: Cada segmento es dividido en paginas de tamaño fijo.
- Con paginación vimos que el espacio de direcciones de un proceso no necesariamente debe estar “contiguo” en la memoria para poder ejecutarse
- El hardware traduce direcciones lógicas a direcciones físicas utilizando las tablas de páginas que el SO administra
- Podemos pensar también que, no todo el espacio de direcciones del proceso se necesito en todo momento:
- Rutinas o Librerías que se ejecutan una única vez (o nunca)
- Partes del programa que no vuelven a ejecutarse
- Regiones de memoria alocadas dinámicamente y luego liberadas
- Etc.
- No hay necesidad que la totalidad la imagen del proceso sea cargada en memoria
- El SO puede traer a memoria las “piezas” de un proceso a medida que éste las necesita.
- Definiremos como “Conjunto Residente” a la porción del espacio de direcciones del proceso que se encuentra en memoria.
- Alguna bibliografía lo llama “Working Set”
- Con el apoyo del HW:
- Se detecta cuando se necesita una porción del proceso que no está en su Conjunto Residente
- Se debe cargar en memoria dicha porción para continuar con la ejecución.
- Más procesos pueden ser mantenidos en memoria.
- Sólo son cargadas algunas secciones de cada proceso.
- Con más procesos en memoria principal es más probable que existan más procesos Ready
- Un proceso puede ser mas grande que la memoria Principal
- El usuario no se debe preocupar por el tamaño de sus programas
- La limitación la impone el HW y el bus de direcciones
- El hardware debe soportar paginación por demanda (y/o segmentación por demanda)
- Un dispositivo de memoria secundaria (disco) que dé el apoyo para almacenar las secciones del proceso que no están en Memoria Principal (área de intercambio)
- El SO debe ser capaz de manejar el movimiento de las páginas (o segmentos) entre la memoria principal y la secundaria.
- Cada proceso tiene su tabla de páginas
- Cada entrada en la tabla referencia al frame o marco en el que se encuentra la página en la memoria principal
- Cada entrada en la tabla de páginas tiene bits de control (entre otros):
- Bit V: Indica si la página está en memoria
- Bit M: Indica si la página fue modificada. Si se modificó, en algún momento, se deben reflejar los cambios en Memoria Secundaria
- Ocurre cuando el proceso intenta usar una dirección que está en una página que no se encuentra en la memoria principal. Bit V=0 (también marcado con i = inválido)
- La página no se encuentra en su conjunto residente
- El HW detecta la situación y genera un trap al S.O.
- El S.O. Podrá colocar al proceso en estado de “Blocked” (espera) mientras gestiona que la página que se necesite se cargue.
- El S.O. busca un “Frame o Marco Libre” en la memoria y genera una operación de E/S al disco para copiar en dicho Frame la página del proceso que se necesita utilizar.
- El SO puede asignarle la CPU a otro proceso mientras se completa la E/S
- La E/S se realizará y avisará mediante interrupción su finalización.
- Cuando la operación de E/S finaliza, se notifica al SO y este:
- Actualiza la tabla de páginas del proceso
- Coloca el Bit V en 1 en la página en cuestión
- Coloca la dirección base del Frame donde se colocó la página
- El proceso que generó el Fallo de Página vuelve a estado de Ready (listo)
- Cuando el proceso se ejecute, se volverá a ejecutar la instrucción que antes generó el fallo de página
- Actualiza la tabla de páginas del proceso
- Si los page faults son excesivos, la performance del sistema decae
- Tasa de Page Faults 0 p 1
- Si p = 0 no hay page faults
- Si p = 1, cada a memoria genera un page fault
- Effective Access Time (EAT)
EAT = (1 – p) x memory access
+ p x (page_fault_overhead +
[swap_page_out] +
swap_page_in +
restart_overhead)
Podría ocurrir que no haya marcos disponibles, con lo cual habrá que descargar uno para lograr espacio para la nueva página entrante
- Cada proceso tiene su tabla de páginas
- El tamaño de la tabla de páginas depende del espacio de direcciones del proceso.
- Puede alcanzar un tamaño considerable
- Formas de organizar:
- Tabla de 1 nivel: Tabla única lineal
- Tabla de 2 niveles (o más, multinivel)
- Tabla invertida: Hashing
- La forma de organizarla depende del HW subyacente
- Direcciones de 32bits
- Ejemplo
- Cantidad de Page Table Entries (PTEs) máximas que puede tener un proceso = 220
- El tamaño de cada página es de 4KB
- El tamaño de cada PTE es de 4 bytes
- Cantidad de PTEs que entran en un marco: 4KB/4B = 210
- Tamaño de tabla de páginas
- Cantidad de marcos necesarios para todas las PTEs de la tabla de páginas de un proceso = 220/210 = 210
- Tamaño tabla de páginas del proceso:210 * 4bytes = 4MB por proceso
- Más de 16.000GB por proceso!!!
- El propósito de la tabla de páginas multinivel es dividir la tabla de páginas lineal en múltiples tablas de páginas
- Cada tabla de páginas suele tener el mismo tamaño pero se busca que tengan un menor número de páginas por tabla
- La idea general es que cada tabla sea más pequeña
- Se busca que la tabla de páginas no ocupe demasida memoria RAM
- Además solo se carga una parcialidad de la tabla de páginas (solo lo que se necesite resolver)
- Existe un esquema de direccionamientos indirectos
- Utilizada en Arquitecturas donde el espacio de direcciones es muy grande
- Las tablas de paginas ocuparían muchos niveles y la traducción sería costosa
- Por esta razón se adopta esta técnica
- Por ejemplo, si el espacio de direcciones es de 264 bytes, con páginas de 4 KB, necesitamos una tabla de páginas con 252 entradas
- Si cada entrada es de 8 bytes, la tabla es de más de 30 millones de Gigabyes (30 PB)
- Hay una entrada por cada marco de página en la memoria real. Es la visión inversa a la que veníamos viendo
- Hay una sola tabla para todo el sistema
- El espacio de direcciones de la tabla se refiera al espacio físico de la RAM, en vez del espacio de direcciones virtuales de un proceso
- Usada en PowerPC, UltraSPARC, y IA-64
- El número de página es transformado en un valor de HASH
- El HASH se usa como índice de la tabla invertida para encontrar el marco asociado
- Se define un mecanismo de encadenamiento para solucinar colisiones (cuando el hash da igual para 2 direcciones virtuales)
- Sólo se mantienen los PTEs de páginas presentes en memoria física
- La tabla invertida es organizada como tabla hash en memoria principal
- Se busca indexadamente por número de página virtual
- Si está presente en tabla, se extrae el marco de página y sus protecciones
- Si no está presente en tabla, corresponde a un fallo de página
- La tabla invertida es organizada como tabla hash en memoria principal
- Pequeño
- Menor Fragmentación Interna.
- Más paginas requeridas por proceso -> Tablas de páginas mas grandes.
- Más paginas pueden residir en memoria
- Grande
- Mayor Fragmentación interna
- La memoria secundaria esta diseñada para transferir grandes bloques de datos más eficientemente Mas rápido mover páginas hacia la memoria principal.
- Relación con la E/S
- Vel. De transferencia: 2 Mb/s
- Latencia: 8 ms
- Búsqueda: 20 ms
- Pagina de 512 bytes
- 1 pagina → total: 28,2 ms
- Solo 0,2 ms de transferencia (1%)
- 2 paginas → 56,4 ms
- Pagina de 1024 bytes
- total: 28,4 ms
- Solo 0,4 ms de transferencia
- ¿Cuántas paginas de un proceso se pueden encontrar en memoria?
- Tamaño del Conjunto Residente
- Asignación Dinámica
- El número de marcos para cada proceso varía
- Asignación Fija
- Número fijo de marcos para cada proceso
- Asignación equitativa – Ejemplo: si tengo 100 frames y 5 procesos, 20 frames para cada proceso
- Asignación Proporcional: Se asigna acorde al tamaño del proceso
- Qué sucede si ocurre un fallo de página y todos los marcos están ocupados -> “Se debe seleccionar una página víctima”
- ¿Cual sería Reemplazo Optimo?
- Que la página a ser removida no sea referenciada en un futuro próximo
- La mayoría de los reemplazos predicen el comportamiento futuro mirando el comportamiento pasado.
- Reemplazo Global
- El fallo de página de un proceso puede reemplazar la página de cualquier proceso.
- El SO no controla la tasa de page-faults de cada proceso
- Puede tomar frames de otro proceso aumentando la cantidad de frames asignados a él.
- Un proceso de alta prioridad podría tomar los frames de un proceso de menor prioridad
- Reemplazo Local
- El fallo de página de un proceso solo puede reemplazar sus propias páginas – De su Conjunto Residente
- No cambia la cantidad de frames asignados
- El SO puede determinar cual es la tasa de page-faults de cada proceso
- Un proceso puede tener frames asignados que no usa, y no pueden ser usados por otros procesos.
- OPTIMO Es solo teórico
- FIFO Es el más sencillo
- LRU (Least Recently Used): Requiere soporte del hardware para mantener timestamps de acceso a las páginas. Favorece a las páginas mas recientemente accedidas
- 2da. Chance Un avance del FIFO tradicional que beneficia a las páginas mas referenciadas
- NRU (Non Recently Used):Utiliza bits R y M
- Favorece a las páginas que fueron usadas recientemente