Manuel Madrigal Valenzuela A01114070 Sistema operativo: Es un programa pero NO un proceso 1. Nos da API para acceder a nuestro Hw al mismo tiempo que lo protege de nosotros desarrolladores mediante la utilización de llamadas a sistema 2. Administra procesos (Sw) mediante la virtualización del Hw, dando acceso a este a los procesos de manera “concurrente”(Scheduler, Quantum) Crear (fork,exec), terminar (exit), planificar (scheduler), comunicar (pipe, signals) 3. Administra memoria, usuarios y energía/Disipación Llamada a Sistema.(Interface entre proceso y SO) Es una interrupción que habilita el modo kernel en el CPU para tener acceso al Hw y, una vez que se realice la acción requerida, pasa de nuevo por el CPU para desactivar el modo kernel y regresa el control al usuario. Modo Kernel. Es un registro en el CPU que al estar activo da acceso a todo el Hw (uso exclusivo SO). Una llamada a sistema, desde el punto de vista del usuario, se implementa mediante una interrupción, activando el bit correspondiente al modo kernel en el CPU El Sistema operativo se ejecuta en el privilegio más alto y permite a las aplicaciones solicitar servicios mediante llamadas a sistema, las cuales son iniciadas por medio de interrupciones. Son accesadas mayormente por programas por medio de una API que por uso directo de la llamada a sistema. Típicamente, un número es asociado a cada llamada a sistema. La interface mantiene una tabla indexada de acuerdo a estos números El usuario no necesita saber nada acerca de cómo es implementada la llamada a sistema Existen 3 métodos generales para pasar parámetros al SO: 1. Por medio de registros 2. Guardarlos en un bloque de memoria y pasar la dirección de este en un registro 3. Por medio del stack Tipos de llamadas a sistema: Control de procesos. Un programa corriendo debe ser capaz de detener ejecución(load, execute, end/abort, créate process, terminate process) Administración de archivos. Create/delete file, open, close, read, write, reposition, get/set Administración de dispositivos. El usuario solicita el dispositivo y al terminar lo libera. (request/release device, read, write, repostion, get/set, attach/detach devices) Administración de información. Usada para transferir información entre el programa de usuario y el SO(get/set time/date,get/set system data, get/set process/file/device attribute) Comunicación. o Message-passing. Utiliza un buzón de mensajes común para pasar mensajes entre procesos. Utiliza llamadas a sistema o Memoria compartida. Dos procesos intercambian información mediante la lectura y escritura de los datos compartidos. Procesos. Son una instancia de un programa en un determinado estado (new, ready, running, waiting/sleeping, terminated) y con cierta memoria y recursos asignados. Tiene un padre y puede tener hijos. La memoria de procesos está dividida en 4 secciones: Texto. Comprende el código de programa compilado, se lee de memoria no volátil cuando el programa es lanzado. Datos. Guarda variables estáticas y globales asignadas e inicializadas previamente a la ejecución del main Heap. Es usado para asignación dinámica de memoria y es manejado mediante llamadas a new, delete, malloc, free, etc. Stack. Espacio en el stack está reservado para variables locales al momento de ser declaradas, el espacio se libera cuando las variables van más allá del alcance. Estados de un proceso: New. El proceso está en la etapa de creación Ready. El proceso tiene todos los recursos disponibles que necesita para ejecutarse pero el CPU no está trabajando aún en las instrucciones de este proceso. Running. El CPU esta trabajando en las instrucciones de este proceso Waiting. Este proceso no puede ejecutarse por el momento debido a que esta esperando por algún recurso o la ocurrición de un evento. Terminated. El proceso se ha completado Para cada proceso existe un Bloque de Control de Procesos(PCB) que involucra información específica del proceso: Estado, PID, CPU registers y PC, Información de planificación del CPU(e.g. prioridades), Información de manejo de memoria, I/O status. Proceso síncrono. El padre espera a que el hijo termine para poder continuar Proceso asíncrono. El padre crea un hijo pero no se queda esperándolo. Zombie. Proceso que perdió su padre y ya terminó (murió). Huerfano. Proceso que perdió a su padre pero que aún se está ejecutando. Planificación de procesos. Los objetivos principales del planificador de procesos son mantener el CPU ocupado todo el tiempo y entregar tiempos de respuesta “aceptables” para todo programa. Long term Scheduler. Corre infrecuentemente, hasta que acabó un proceso, puede tomarse el tiempo de tomar decisiones inteligentes Short term scheduler. Corre muy frecuentemente y tiene que ser muy veloz para cambiar entre procesos Cada cierto tiempo (Quantum) el planificador se despierta y asigna el PC al siguiente proceso(Context Switching-Guardar y restaurar estados, registros, etc) User time. Tiempo que pasó ejecutando instrucciones que no involucran llamadas a sistema Sys time. Tiempo que el SO pasó en modo kernel Real time. User time+ sys time + tiempos muertos de espera Casi todos los procesos alternan entre dos estados (CPU burst e I/O burst) en un ciclo continuo. Proceso cambia de running a waiting Proceso termina Proceso cambia de running a ready Proceso cambia de waiting a ready Non preemptive scheduling or cooperative. Un Nuevo proceso debe ser seleccionado Preemptive scheduling. O continua ejecutando el proceso actual o selecciona uno diferente Criterios de planificación. Utilización de CPU, Throughput (número de procesos completados por unidad de tiempo), Turnarround time(tiempo requerido por un proceso particular para completarse), Waiting time(Cuanto tiempo gastan los procesos esperando su turno), response time. Algoritmos de planificadores. First Input First Output. Fácil implementación pero no se puede ejecutar el sig. Proceso hasta que termine el anterior Shortest Job First. Atiende primero a los procesos cortos y deja los procesos largos para el final. Pero no existe manera ideal de implementarlo ya que no podemos conocer que tan largo es un proceso hasta el momento de ejecución. Priority Scheduling. Asigna tiempos de acuerdo a prioridades preasignadas, los de más alta prioridad son atendidos primero. Round Robin. Asigna misma cantidad de tiempo(Quantum) a todos los procesos por igual. Multilevel Queue Scheduling. Multiples Queues separadas son establecidas, cada una de ellas implementando el algoritmo más apropiado (Round Robbin más usado). La planificación debe efectuarse también entre queues. Dos opciones comunes son “Strict priority”(ningún proceso en una queue de menor prioridad corre hasta que todas las queues de mayor prioridad estén vacías)(más utilizado) y “round robin” Multilevel Feedback-Queue Scheduling. Similar a la anterior a excepción de que los procesos pueden brincar entre queues Multiple processor Scheduling. Asymmetric multiprocessing. Un procesador es el master, controlando todas las actividades y corriendo todo el código kernel, mientras los demás ejecutan solo código de usuario. Symmetric multiprocessing. Cada procesador planifica sus propios trabajos. Inter Process Communication IPCs hace referencia al mecanismo que el SO provee a los procesos para compartir información. Pipes: Un pipeline es una secuencia de procesos encadenados por sus flujos estándar, de manera que la salida de cada proceso alimenta la entrada del siguiente. Los pipes son unidireccionales, la información fluye a través del pipe de izquierda a derecha. Un concepto importante en lo que respecta a Unix pipes es el “buffering”, donde la salida de un proceso es almacenada en un buffer hasta que un segundo proceso comienza a leer de este. Señales. Es una notificación asíncrona enviada a un proceso o a un thread específico dentro del mismo proceso para notificarle que un evento ha ocurrido. Cuando una señal es enviada, el SO interrumpe el flujo normal de ejecución del proceso destino para entregar la señal. Si el proceso ha registrado previamente un manejador de señales, esa rutina es ejecutada, de otro modo, la rutina de manejo de señales por default es ejecutada. Como las señales son asíncronas, otra señal puede ser entregada al proceso durante la ejecución de una rutina de manejo de señales, es por ello que existen métodos para bloquear y desbloquear la entrega de señales. Memoria Compartida. Es memoria que puede ser accedida de manera simultánea entre múltiples procesos, en un intento por proveer comunicación entre ellos y evadir copias redundantes. Es un método de IPC para intercambiar información entre procesos corriendo al mismo tiempo. Un proceso reserva un bloque de RAM al cual otros procesos pueden acceder. Manejo de Memoria Es la funcionalidad de un SO para manejar memoria principal y mover procesos de ida y de regreso entre memoria principal y Disco durante ejecución. Realiza un seguimiento de cada locación de memoria, decide que procesos obtienen la memoria, en qué momento y cuanta de esta. Memoria Virtual vs Memoria Física. El código tiene una dirección virtual y al momento de cargarlo en RAM se asocia una dirección física. El programa de usuario trabaja con direcciones lógicas/virtuales, nunca ve en realidad la dirección física, pues es el MMU (Memory-Management Unit) quien se encarga de mapear direcciones virtuales a direcciones físicas. Swapping. Un proceso puede ser cambiado temporalmente hacia fuera de la memoria en un almacén de respaldo, para hacer ese espacio de memoria disponible para otro proceso y después traído de vuelta a memoria para continuar ejecución. Memory Allocation (Contiguous). Memoria principal dividida en 2 particiones (SO (parte baja) y procesos de usuario (parte alta)). Existen registros para saber los límites de las particiones (segmentación). Al desocuparse algunos procesos van dejando huecos en memoria que después son reutilizados por otros procesos. First-Fit (Alocar el primer hueco lo suficientemente grande). Best-Fit (Alocar el hueco más pequeño que es lo suficientemente grande). Worst Fit (Alocar el hueco más grande). Fragmentación. Mientras los procesos son cargados y removidos en memoria, el espacio libre en memoria se va segmentando en pequeñas piezas. Hasta llegar al punto en que esos bloques de memoria sobrantes son tan pequeños que no pueden ser asignados a un proceso. External (El espacio en memoria es suficiente pero no contiguo) e Internal (El bloque de memoria asignado es más grande que el proceso dejando alguna porción de memoria inútil) Paging. Traer páginas a memoria solo cuando son necesitadas. Se lleva un registro en la tabla de páginas con un bit ( valid (1) - invalid (0) ) para saber si la página está o no en memoria, este es revisado al ser solicitada la página, y de no estar es necesario avisar al SO para que vaya por ella a DD, actualice la tabla de páginas y reinicia la instrucción. Las páginas son remplazadas en memoria cuando es necesario traer una nueva página, este remplazo se lleva a cabo con un algoritmo eficiente que no rebaje el desempeño. Esquema de traducción de direcciones. La dirección se divide en el número de página (usado como índice en la tabla de páginas) y offset de página. Por lo que en este esquema se requieren dos accesos a memoria, lo cual se puede solucionar con el uso de un hw especial tipo cache de rápida búsqueda (TLBs), el cual asocia páginas (Divisiones de memoria lógica en bloques del mismo tamaño) con frames (Divisiones de memoria física en bloques del mismo tamaño). Page Table Structure. Hierarchichal Paging (Base and Offset inside the table), Hashed Page Tables (Unique Hash Key), Inverted Page Table (An entry for every page) Page sharing. Cuando dos procesos tienen el mismo código pero diferentes datos (argumentos). Comparten la misma página de código y tienen página propia para los datos. Segmentation. Mismo principio que paging a diferencia de que en paging la memoria está divida en bloques del mismo tamaño. En segmentation se tienen procesos de diferentes tamaños guardados en memoria con una tabla que guarda la dirección del principio del proceso y el tamaño del mismo. Sistemas de Archivos Directorio. Es un tipo especial de archivo que contiene nombre y referencia (sector y pista) de otros archivos FAT. File Allocation Table es un sistema de archivos referenciado por una tabla indexada. Tiene la ventaja de que no necesariamente se encuentra en localidades contiguas, por lo que al ampliar el archivo no se ocupa mover de lugar. Cómo desventaja se fragmenta el disco poco a poco, hay que buscar constantemente en la FAT por la siguiente página, los records FAT son limitados, el tamaño de los archivos es limitado. UFS. Unix File System utiliza una tabla que contiene inodos cada uno con nombres, permisos, tipo (dir/archivo). Tiene una tabla con 4 referencias directas y una 5ta hacia un archivo que contiene 512 referencias. Tamaño no limitado de archivos. El más usado es ext 3, que es una combinación de UFS, Journaling (Principio de transacciones: Guarda en RAM y primer sector de disco periodicamente y cuando tiene tiempo guarda en DD), swapping, hibernation(Guarda RAM en un segmento de DD) Copiar archivos. Especificar directorio de origen y destino Agregar path completo Buscar secuencialmente el path iniciando desde root Crear un nuevo registro en el directorio y asociarlo a un inodo Copiar los bloques de memoria referenciados por el archivo 1 y referenciar la copia al archivo 2 Borrar archivos. Se borra la referencia al inodo, y si el inodo ya no referencía nada, este es marcado como libre. Chmod. (lectura r=4, escritura w=2,ejecución x=1) Usuario. Colección de variables de ambiente, permisos y archivos que se aplican y me identifican ante la computadora. Grupo, A través de estos se obtienen privilegios adicionales a los que ya tenía como usuario. Otros. Quienes no pertenecen a usuario ni grupo. Transacción. Todas las escrituras a disco siempre van dentro de una transacción. Estas permiten que la escritura a disco sea segura, ya que si no se escribe un dato, no se escribe ninguno, y esta debe ser enviada de nuevo. Las transacciones siempre deben ser pequeñas. Concurrencia. Es una propiedad de sistemas que consiste en cómputos que se ejecutan de manera superpuesta en el tiempo, y que podrá permitir el reparto de recursos comunes entre los cómputos superpuestos. N cantidad de usuarios o procesos que quieren acceder al mismo recurso Hilos. Un nuevo proceso (ligero) con un stack pequeño que apunta al stack original, un heap que apunta al original y código que apunta a la función específica que se desea ejecutar en el proceso original. Esto se ve reflejado en ganancia de tiempo de CPU pero puede ocasionar problemas de concurrencia. En el momento que termina el proceso original, todos los hilos mueren. Los hilos pueden interactuar con otros hilos de diferentes maneras: • Compartir acceso a dispositivos del sistema (a través del SO) • Compartir acceso a datos en su espacio de direcciones del proceso MuTex (Mutual Exclusion): Permite que el recurso compartido sea accedido a lo más por un solo hilo en cualquier momento dado. Es un tipo de variable global que solo acepta dos valores (0 y 1). Hay dos operaciones: acquire (si la variable es 1 la decrementa, si no, espera a que sea 1 para decrementarla) y release ( si esta en 0 la incrementa). Sección crítica: La(s) parte(s) del programa en que el objeto compartido es accedido. Condición de carrera: Una secuencia de instrucciones de la cual el resultado depende del orden en que es ejecutada por los hilos, dando lugar a valores inconsistentes de variables. Semáforo. Objeto (global) con un valor entero inicial que soporta dos operaciones: • P-Si el valor es mayor que cero, decrementar. De otra manera, esperar hasta que el valor sea mayor a cero para decrementar. • V- Incrementar el valor del semáforo *El balance óptimo para m recursos es n=m-1 procesos. Deadlock. Esta situación se presenta cuando los procesos están atrapados esperando en una espera circular por recursos. Starvation. Cuando un proceso espera por un recurso de manera indefinida. Data Center. Sistema de archivos distribuido, un solo rack con muchos CPUs pero un solo SO que maneja todo. Virtual CPU. Máquina remota que utiliza mi CPU. Contenedores (Dockers). Mismo concepto que VCPU pero un solo SO para varias aplicaciones, ahorrando disco. Las apps corren de manera aislada de manera que no se ven entre usuarios.