miércoles, 18 de noviembre de 2015

Unidad 3 Administración de memoria.

3.1 Política y filosofía.
Filosofía:
La memoria principal puede ser considerada como un arreglo lineal de localidades de almacenamiento de un byte de tamaño. Cada localidad de almacenamiento tiene asignada una dirección que la identifica.
Una de las funciones básicas que debe implementar un SO es la Administración de la Memoria para tener un control sobre los lugares donde están almacenados los procesos y datos que actualmente se están utilizando.
Sea cual sea el esquema de organización del almacenamiento que se adopte para un sistema específico, es necesario decidir qué estrategias se deben utilizar para obtener un rendimiento óptimo. Las estrategias de administración del almacenamiento determinan el comportamiento de la administración de memoria cuando se siguen ciertas políticas: 
  • ¿Cuándo se toma un nuevo programa para colocarlo en memoria? 
  • ¿Se toma el programa cuando el sistema lo solicita específicamente o intenta anticiparse a las peticiones del sistema? 
  • ¿En qué lugar del almacenamiento principal se coloca el programa por ejecutar? 
  • ¿Se colocan los programas lo más cerca unos de otros en los espacios disponibles de la memoria principal para reducir al mínimo el desperdicio de espacio, o se colocan los programas lo más rápido posible para reducir al mínimo el tiempo de ejecución? 
  • Si se necesita colocar un nuevo programa en el almacenamiento principal y éste está lleno, ¿Cuál de los otros programas se desaloja?

Políticas:
Organización de la memoria.
Forma de considerar este almacenamiento: ¿se coloca un solo programa de usuario o varios? Si se encuentran varios programas de usuario:
  • ¿se les concede la misma cantidad de espacio o particiones de diferente tamaño?
  • ¿se usa un esquema rígido de número y tamaño de particiones o un esquema dinámico y adaptable?
  • ¿se requiere que los trabajos funcionen en una partición específica o en cualquiera donde quepan?
  • ¿se requerirá o no que cada trabajo sea colocado en un bloque contiguo de memoria?
Independiente del esquema de organización hay que decidir las estrategias que se usarán para optimizar el rendimiento.

3.2 Memoria real.
Cantidad de memoria principal con que cuenta un equipo
Memoria secundaria auxiliar.- la soportada generalmente en discos.
Para que un programa pueda ser ejecutado, él y sus datos deben estar en memoria principal. Para mejorar el rendimiento del cpu se pueden repartir sus servicios entre varios programas que necesitan estar cargados simultáneamente en memoria “compartiéndola”.
La memoria real o principal se considera el recurso central, ya que tanto el cpu como los dispositivos e/s la acceden para leer o grabar.
Hay 2 parámetros relacionados con la velocidad de r/w en memoria real: 
  • Tiempo de acceso.- Tiempo que transcurre del inicio al fin de una operación r/w. 
  • Tiempo de ciclo de memoria.- Retraso que impone el hardware entre una operación y otra.
3.2.1 Administración de almacenamiento.
Direccionamiento
La memoria se puede ver como una sucesión de bytes, cada uno con su dirección y se puede acceder a ellos indicando dicha dirección.
Asignación de direcciones
¿En qué direcciones cargar los datos y programas? El programador diseña su programa sin saber dónde se cargará. Simplemente definirá una sentencia de inicio que marcará el comienzo de sus instrucciones y a partir de ella describirá el resto del programa. El compilador traducirá a lenguaje máquina y asignará a las instrucciones y variables un desplazamiento respecto a la sentencia inicial (cero relativo). Esta operación se llama asignación de direcciones relativas. Cuando el programa se enlaza, el linker lo colocará en memoria asignando el cero relativo a una dirección real y el resto de direcciones basadas en los desplazamientos (Transformación de direcciones relativas a absolutas o reales)

3.2.2 Jerarquía.
Nivel 0: Registros
Nivel 1: Memoria caché
Nivel 2: Memoria principal
Nivel 3: Disco duro (con el mecanismo de memoria virtual)
  • Registro:Memoria de alta velocidad y poca capacidad, integrada en el cpu, que permite guardar y acceder a valores muy usados, generalmente en operaciones matemáticas.Están en la cumbre de la jerarquía de memoria, y son la manera más rápida que tiene el sistema de almacenar datos. Se miden generalmente por el número de bits que almacenan; "registro de 8 bits" o "registro de 32 bits". Se implementan en un banco de registrosLos CPU’s tienen además otros registros usados con un propósito especifico, como el contador de programa. 
  • Memoria cache: tipo especial de memoria que se sitúa entre el cpu y la RAM para almacenar datos que se usan frecuentemente. Agiliza la transmisión de datos entre el CPU y la memoria principal. Es de acceso directo y mucho más rápida que la RAM.
  • Memoria principal.- Son circuitos integrados capaces de almacenar información digital, a los que tiene acceso el CPU. Poseen una menor capacidad de almacenamiento que la memoria secundaria, pero una velocidad millones de veces superior. Hay dos tipos: ROM (Read Only Memory) "Memoria de solo lectura" que almacenan códigos de programa grabados de fábrica. (BIOS)
3.2.3 Estrategia de administración de memoria.
Están dirigidas a la obtención del mejor uso posible del recurso de la memoria principal.
Se dividen en las siguientes categorías: “estrategias de búsqueda”.- establecen cuándo obtener el siguiente fragmento de programa o de datos para su inserción en la memoria principal.
o “búsqueda por demanda”.- el siguiente fragmento de programa o de datos se carga a memoria principal cuando algún programa en ejecución lo referencia.
o “búsqueda anticipada”.- puede producir un mejor rendimiento del sistema ya que no espera a que se efectúe la petición, sino que trata de anticiparse a ésta. “estrategias de colocación”.- determinan el lugar de la memoria dónde se colocará (cargará) un programa nuevo. “estrategias de reposición”.- determinan cuál fragmento de programa o datos liberar para dar lugar a los programas nuevos.

3.2.4 Asignación contigua vs no contigua.
“asignación contigua”.- cada programa ocupa un bloque contiguo de localidades de memoria.
“asignación no contigua”.- un programa se divide en varios bloques o “segmentos” que pueden almacenarse en direcciones que no tienen que ser necesariamente adyacentes, por lo que es más compleja pero más eficiente que la asignación continua.

El tamaño de los programas está limitado por la cantidad de memoria principal, pero se puede superar este límite con técnicas de “recubrimientos”, con las siguientes características (Figura 3.3 .): 
  • Si una sección particular del programa ya no es necesaria, se carga otra sección desde la memoria secundaria ocupando las áreas de memoria liberadas por la sección que ya no se necesita. 
  • La administración manual por programa del recubrimiento es complicada y dificulta el desarrollo y el mantenimiento.
Protección en los sistemas de un solo usuario
El usuario tiene un completo control sobre la totalidad de la memoria principal: 
  • La memoria se divide en porciones que contienen el S. O., el programa del usuario y una porción sin usar. 
  • El programa del usuario podría destruir áreas del S. O. que podrían: bloquear el sistema o producir salidas erróneas. 
  • El S. O. debe estar protegido contra el proceso usuario por medio de un “registro de límites o registro frontera”:
3.2.5 Multiprogramación de partición fija, partición variable, con intercambio de almacenamiento.
Multiprogramación de Partición Fija

Los sistemas de un usuario desperdician gran cantidad de recursos computacionales debido a que:
  • Cuando ocurre una petición de e/s el cpu normalmente no puede continuar el proceso hasta que concluya la operación de e/s requerida. 
  • Los periféricos de e/s frenan la ejecución de los procesos ya que comparativamente el cpu es más rápido que los dispositivos de e/s.
Los sistemas de “multiprogramación” permiten que varios procesos usuarios compitan al mismo tiempo por los recursos del sistema: 
  • Un trabajo en espera de e / s cederá el cpu a otro trabajo que esté listo para efectuar cómputos. 
  • Existe paralelismo entre el procesamiento y la e/s. 
  • Se incrementa el uso del cpu y la capacidad global de ejecución del sistema. 
  • Es necesario que varios trabajos residan a la vez en la memoria principal.
3.3 Organización de memoria virtual.
“Memoria virtual.- capacidad de direccionar un espacio de memoria mucho mayor que el disponible en la memoria primaria.
Los métodos más comunes de implementación son mediante: 
  • Técnicas de “paginación”.
  • Técnicas de “segmentación”. 
  • Combinación de ambas.
Las direcciones generadas por los programas en su ejecución no son necesariamente, las contenidas en la memoria primaria (real), ya que las direcciones virtuales suelen seleccionarse dentro de un número mucho mayor de direcciones que las disponibles dentro de la memoria primaria.

3.3.1 Evolución de las organizaciones de almacenamiento. 
  • Real: Sistemas dedicados a un usuario. 
  • Real: Sistemas de multiprogramación en memoria real:
  • Multiprogramación en partición fija:
  • Absoluta.
  • Relocalizable (reubicable).
  • Multiprogramación en partición variable. Virtual: Multiprogramación en memoria virtual:
  • Paginación pura.
  • Segmentación pura.
  • Combinación paginación / segmentación.
3.3.2 Paginación.
La necesidad de asignar memoria en cantidades contiguas para cada programa es el mayor inconveniente para un buen aprovechamiento de la misma. La paginación es una técnica de gestión que permite asignar la memoria de forma discontinua. La memoria física se divide en trozos de tamaño fijo llamados frames y la lógica en bloques de igual tamaño llamados páginas. El sistema operativo mantiene una tabla de páginas donde relaciona cada página cargada en memoria con el frame que la contenga o sea su dirección inicial en memoria real.

Administración de la memoria.
La paginación es una forma de reasignar direcciones dinámicamente. El sistema analiza cada nuevo trabajo que se disponga a entrar para conocer el número de páginas que ocupa y buscará en su lista de frames libres un número igual de ellos. Si existen, cargará en ellos las páginas del programa y construirá la correspondiente tabla de páginas actualizando la lista de frames libres. Cada trabajo en memoria tendrá su propia tabla de páginas apuntadas por el pcb. Así se logra evitar la fragmentación externa ya que cualquier frame libre es asignable a un trabajo que lo necesite. Seguirá existiendo fragmentación interna porque generalmente los trabajos no ocupan el total de la página. Esta fragmentación se reduce si la página tiene un tamaño pequeño, pero se necesita una tabla de páginas mayor.

Rendimiento. Memoria Caché. Registros asociativos.
Para agilizar la conversión de direcciones el sistema mantiene en memoria la tabla de páginas de los trabajos activos y usa un registro especial llamado registro base, para indicar la dirección de la tabla de páginas del proceso en ejecución. Así cuando se conmute de un trabajo a otro se restaura la dirección de la tabla de páginas correspondiente.
Para transformar cada dirección lógica (p,d) generada por el cpu en su dirección real, el sistema accede en primer lugar a la tabla de página correspondiente (registro base + p) y después a la dirección real (frame + d). Así cada dirección provoca dos accesos a memoria y se duplican los tiempos de ejecución. Se mejora el uso de la memoria pero los procesos son más largos.
Para resolver esto se recurre a memorias pequeñas de muy alta velocidad (muy caras) donde se puedan mantener las entradas a las tablas de páginas más usadas. Esta memoria (caché) es similar a la principal pero con menor tiempo de acceso y con eso se reduce el retraso producido por la paginación.

Páginas compartidas.
La paginación permite que varios procesos compartan páginas en memoria. Esto es bueno para los sistemas de tiempo compartido. Imaginemos un sistema con 20 usuarios que usan un editor de textos, en el sistema se cargará una sola vez el programa correspondiente y éste será usado por todos ellos aunque los datos sean propios de cada uno. Cada usuario contendrá en su tabla de páginas las entradas correspondientes al editor, apuntando todas ellas a los mismos frames y a distintos para los datos.
Es común usar páginas compartidas, su contenido debe permanecer inalterado y tener código reentrante (durante la ejecución no se altera ningún valor interno).
Si el contenido de las páginas compartidas no debe modificarse, deben protegerse contra todo intento de escritura. Se necesita un sistema de protección de páginas en memoria que controle las direcciones a las que se puede acceder y el modo en que se hace dicho acceso. Para ello se añaden a las entradas de la tabla de páginas una serie de bits de protección (dirección de la pagina), el esquema de protección se complementa con otro bit por entrada de la tabla de páginas llamado bit de validez (modo r o w).

3.3.3 Segmentación.
La segmentación es una técnica distinta de gestión de memoria que pretende acercarse más al punto de vista del usuario.
Los programas se desarrollan, generalmente, en torno a un programa principal desde el que se bifurca a otras partes (rutinas) o se accede a zonas de datos (tablas, pilas, etc.).
Desde este punto de vista, un programa es un conjunto de componentes lógicos de tamaño variable o un conjunto de segmentos, es decir, el espacio lógico de direcciones se considera como un conjunto de segmentos, cada uno definido por su tamaño y un número.

3.3.4 Sistemas de paginación-segmentación.
Tanto la paginación como la segmentación, tienen ventajas e inconvenientes, y parece lógico intentar combinar ambas técnicas para aprovechar sus características positivas.
En todo sistema se define, por su arquitectura, un espacio máximo de direcciones lógicas, tamaño máximo de cualquier programa que quiera ejecutarse, e implica un número de páginas. Por esto, algunos sistemas usan una técnica de paginación segmentada consistente en segmentar la tabla de páginas adecuándola al tamaño del programa. Para ello, mantiene una tabla de segmentos cuyas entradas indican la dirección de inicio de cada tabla de páginas y su tamaño. Se usa un hardware especial.
Otros sistemas optan por paginar los segmentos, es decir, usan segmentos cuyo tamaño es un número entero de páginas. Esta técnica se denomina segmentación paginada.
La tabla de segmentos de la segmentación pura cambia de contenido y sus entradas ya no apuntan al inicio del segmento correspondiente indicando su tamaño, sino que apuntan a una tabla de páginas del segmento indicando su longitud.
De esta forma se evita la fragmentación externa propia de la segmentación, pues cualquier hueco será de una página como mínimo, y por tanto usable para cualquier segmento que lo necesite.

3.4 Administración de memoria virtual.
Los sistemas de gestión de la memoria vistos hasta ahora están sujetos a la exigencia de que un programa, para ejecutarse, debe de estar cargado en memoria principal en su totalidad. Sin embargo, no todas las partes del programa se ejecutan a la vez.
El programador diseña rutinas que sólo se ejecutan en determinadas circunstancias. Por ejemplo, las rutinas de error. Así, no parece necesario que todo el programa esté cargado en memoria para poder ser procesado.
La memoria virtual es una técnica de gestión que, combinando hardware y software, permite la ejecución de programas parcialmente cargados en memoria real.
Esta forma de trabajar aporta ventajas importantes: 
  • Si los programas se pueden ejecutar por partes, la memoria lógica puede ser mayor que la real disponible. 
  • Puesto que cada programa ocupa menos memoria real, se puede elevar el índice de multiprogramación, y por tanto, la eficiencia del sistema.
  • Al cargar menos cantidad de cada programa, se necesitan menos operaciones de entrada/salida para las operaciones de carga e intercambio de los mismos.
3.4.1 Estrategias de administración.
Las diferentes partes de un programa se van cargando en memoria a medida que se necesitan, y por ello, esta técnica debe considerar tres aspectos importantes:
  • Carga. Las porciones del programa se cargan cuando se necesiten (demanda) o se cargan por adelantado (anticipación). 
  • Colocación. Los sistemas de memoria virtual que utilicen segmentación deben decidir, al cargar un nuevo segmento, si lo hacen en el hueco más adecuado (best fit) o bien en el primero posible (first fit). 
  • Reemplazo. Lo normal será que toda la memoria real esté ocupada, y cuando se necesite cargar una nueva parte de un programa habrá que reemplazar alguna de las existentes. Es importante definir la selección de la parte a reemplazar.
3.4.2 Técnicas de reemplazo de páginas.
La técnica de petición de páginas permite reducir la memoria ocupada por cada programa durante su proceso.
Todos los sistemas que usan la técnica de memoria virtual sobreutilizan en mayor o menor medida la memoria física para obtener un mejor rendimiento. Para ello, deben hacerse algo más complejos:
Supongamos que uno de esos programas intenta acceder a una dirección cuya página no está en memoria. El hardware la intercepta y cede el control al sistema operativo que, después de comprobar que es una dirección legal, la trata como una falta de página. Buscará un hueco en memoria. En este punto al analizar la lista de frames libres comprueba que no hay hueco disponible y, como responsable de la gestión de la memoria, debe resolver la situación sin afectar al programa.
Una posible solución es sacar de memoria algún programa cargado y usar los frames que deja libres, pero esto lleva consigo una sobrecarga importante en la operación de intercambio (swap).
La solución adoptada, generalmente, es sustituir alguna de las páginas cargadas (reemplazar páginas). Para ello, la rutina del sistema que gestiona la interrupción de falta de página deberá trabajar de la siguiente manera: 
  • Encontrar la página solicitada en el almacenamiento secundario. 
  • Encontrar un frame libre. 
  • Si existe, usarlo. 
  • Si no existe, usar un algoritmo de reemplazamiento para seleccionar la página a reemplazar. 
  • Salvar la página reemplazada en el almacenamiento secundario, actualizando las tablas afectadas. 
  • Llevar la página solicitada al frame libre y actualizar las tablas correspondientes.
3.4.3 Paginación por demanda.
Este es el esquema de carga más común cuando se usa la técnica de memoria virtual. Su funcionamiento es similar al de un sistema de paginación con intercambio.
Ahora el algoritmo de intercambio no llevará a memoria todo el programa, sino que sólo cargará aquellas páginas que se le pidan.
Cuando el cpu genere una dirección que pertenezca a una página que no se encuentre en memoria <<falta de páginas>>, la buscará, y a continuación, la traerá a memoria desde el correspondiente dispositivo de memoria secundaria.
El tratamiento de las faltas de página introduce un retraso adicional en la ejecución de los programas y afecta por tanto al rendimiento general del sistema. El diseño del software necesario debe ser especialmente cuidadoso en este aspecto.

3.4.4 Paginación anticipada.
El S. O. intenta predecir las páginas que un proceso va a necesitar y a continuación precarga estas páginas cuando hay espacio disponible.
Mientras el proceso ejecuta sus páginas actuales, el sistema carga páginas nuevas que estarán disponibles cuando el proceso las pida, debido a ello, el tiempo de ejecución de un proceso se puede reducir.

3.4.5 Liberación de página.
Un proceso usuario puede emitir una “liberación voluntaria de página” para liberar el frame cuando ya no necesite esa página. Se puede eliminar el “desperdicio” y acelerar la ejecución.
El inconveniente es que la incorporación de mandatos de liberación de páginas dentro de los programas de usuario puede ser peligrosa y retrasar el desarrollo de aplicaciones.
“Los compiladores y S. O. deberían detectar automáticamente situaciones de liberación de página mucho antes de lo que es posible con estrategias de conjuntos de trabajo”.

3.4.6 Tamaño de página.
Decidir el tamaño adecuado no es sencillo puesto que hay que equilibrar diversos factores:
Generalmente la memoria real se divide en frames de tamaño fijo.
Los interrogantes tienen que ver con el tamaño de las páginas, si todas las páginas tendrán igual tamaño, si en caso de usar páginas de diferente tamaño las páginas mayores deben ser o no múltiplos enteros de las menores, etc.

Unidad 2 Administración de procesos y del procesador.

2.1 Concepto de proceso.




Programas.
Colección de instrucciones que el procesador interpreta y ejecuta, se almacenan en sistemas no volátiles necesitando ser cargados en memoria principal para poder ser ejecutados, se considera un ente estático.

Procesos

Programa en ejecución, el sistema operativo les asigna recursos, Se consideran un ente dinámico.
El proceso es una abstracción creada por el SO, que se compone de: 
  • Contexto de Ejecución: PC, registros del procesador y una pila para invocación de procedimientos 
  • Sección de Datos, que contiene variables globales 
  • Recursos del sistema.
Características 
  • Permite modularizar y aislar errores de programas durante su ejecución 
  • Soporta concurrencia de actividades, lo que permite un mejor aprovechamiento de los recursos 
  • Denominaremos como procesos tanto a los trabajos (jobs) en sistemas de lotes, como a las tareas (task) en sistemas de tiempo compartido.
Modelo
La diferencia entre un programa (conjunto de instrucciones) y un proceso (instrucciones ejecutándose) es obvia y crucial para entender el funcionamiento de los SO.
Imaginemos un mecánico de autos en un taller donde se reparan carros con averías complejas en las que se hace necesario consultar el manual de cada modelo, que contiene las instrucciones para reparar cada posible avería. Además, se permiten reparaciones rápidas a las que se les da mayor prioridad. Existe un almacén de refacciones y herramientas suficientes para las reparaciones. Comparando esta situación con un sistema de cómputo se pueden establecer las siguientes analogías: 
  • El mecánico sería el CPU (procesador) que realizará el trabajo. 
  • El manual de cada reparación sería el programa. 
  • Las herramientas serían los recursos disponibles 
  • Las refacciones serían los datos. 
  • La actividad de usar las herramientas para desmontar las piezas defectuosas sustituyéndolas por otras nuevas siguiendo las instrucciones del manual equivaldría al proceso.
Suponiendo que en un momento dado el mecánico está realizando una reparación compleja (de las que llevan tiempo) y aparece un carro que solicita una reparación de las rápidas (ha aparecido una interrupción). El mecánico suspende momentáneamente la reparación compleja anotando en qué situación se queda dicha reparación y qué operación estaba realizando en ese momento (guarda el estado del proceso). Asimismo, sustituye el manual que estaba realizando por el de la nueva reparación que se dispone a realizar (cambio de programa). Comienza la nueva reparación (cambio de proceso), en la que las herramientas no serán las mismas que antes (distintos recursos); las indicaciones del usuario, las refacciones (datos) y las indicaciones del manual (programa) llevarán a feliz término la reparación para que el mecánico regrese a la reparación inicial.

2.2 Estados y transiciones de los procesos


Los PCB’s se almacenan en listas, una para cada posible estado:
Los estados se pueden dividir en: Activos e inactivos
Activos los que compiten por el procesador. Tipos: 
  • Ejecución.- Cuando el proceso tiene el control del cpu 
  • Preparado (Listo).- Tienen las condiciones para ser ejecutados pero no están en ejecución por alguna causa. 
  • Bloqueado.- No pueden ejecutarse porque necesitan algún recurso no disponible

Inactivos.- No pueden competir por el cpu
Los 3 estados principales pueden no ser suficientes
Justificación:
Si todos los procesos están en bloqueados esperando un suceso y no hay memoria disponible para nuevos procesos, el procesador estará desocupado, sin uso. La Solución: procesos suspendidos:
• Permitir la ejecución de más procesos
• Ampliar la memoria principal
• Intercambio de procesos entre memoria y disco (swapping)
Surgen 2 nuevos estados de un proceso: suspendido listo: el proceso está suspendido, pero se encuentra listo para ejecutarse suspendido bloqueado: el proceso está suspendido y además está esperando que suceda un evento
• El sistema operativo puede poner en suspendido un proceso y transferirlo a disco
• El espacio liberado en la memoria principal es usado para traer otro proceso
¿Qué proceso elegir para cargar en memoria? Uno nuevo Uno previamente suspendido (debemos elegir los que se encuentran en suspendido listo y no en suspendido bloqueado)
Otras razones por las que un proceso puede pasar a estado suspendido:
• El sistema está en riesgo de fallo. El sistema suspende todos los procesos activos para poder corregir errores y volver a activarlos cuando el sistema funcione correctamente
• Un proceso sospechoso de mal funcionamiento puede ser suspendido hasta verificar su correcto funcionamiento
• El planificador puede suspender los procesos de baja prioridad en momento de carga excesiva del sistema

2.3 Procesos ligeros (Hilos o hebras).
Un hilo de ejecución, en sistemas operativos, es similar a un proceso en que ambos representan una secuencia simple de instrucciones ejecutada en paralelo con otras secuencias. Los hilos permiten dividir un programa en dos o más tareas que corren simultáneamente, por medio de la multiprogramación. En realidad, este método permite incrementar el rendimiento de un procesador de manera considerable. En todos los sistemas de hoy en día los hilos son utilizados para simplificar la estructura de un programa que lleva a cabo diferentes funciones.
Todos los hilos de un proceso comparten los recursos del proceso. Residen en el mismo espacio de direcciones y tienen acceso a los mismos datos. Cuando un hilo modifica un dato en la memoria, los otros hilos utilizan el resultado cuando acceden al dato. Cada hilo tiene su propio estado, su propio contador, su propia pila y su propia copia de los registros de la CPU. Los valores comunes se guardan en el bloque de control de proceso (PCB), y los valores propios en el bloque de control de hilo (TCB).
Un ejemplo de la utilización de hilos es tener un hilo atento a la interfaz gráfica (iconos, botones, ventanas), mientras otro hilo hace una larga operación internamente. De esta manera el programa responde más ágilmente a la interacción con el usuario.

Diferencias entre hilos y procesos
Los hilos se distinguen de los tradicionales procesos en que los procesos son generalmente independientes, llevan bastante información de estados, e interactúan sólo a través de mecanismos de comunicación dados por el sistema. Por otra parte, muchos hilos generalmente comparten otros recursos directamente. En sistemas operativos que proveen facilidades para los hilos, es más rápido cambiar de un hilo a otro dentro del mismo proceso, que cambiar de un proceso a otro. Este fenómeno se debe a que los hilos comparten datos y espacios de direcciones, mientras que los procesos al ser independientes no lo hacen. Al cambiar de un proceso a otro el sistema operativo (mediante el dispatcher) genera lo que se conoce como overhead, que es tiempo desperdiciado por el procesador para realizar un cambio de modo (mode switch), en este caso pasar del estado de Running al estado de Waiting o Bloqueado y colocar el nuevo proceso en Running. En los hilos como pertenecen a un mismo proceso al realizar un cambio de hilo este overhead es casi despreciable.

2.4 Concurrencia y secuenciabilidad.


Concurrencia y secuenciabilidad

Multiproceso y Proceso distribuido
Los procesos son concurrentes si existen simultáneamente 2 o más y llegan al mismo tiempo a ejecutarse.
La concurrencia puede presentarse en tres contextos diferentes:
• Varias aplicaciones: (multiprogramación) para permitir que el cpu sea compartido entre varios trabajos
• Aplicaciones estructuradas: Como ampliación del diseño modular y la programación estructurada, algunas aplicaciones pueden implementarse eficazmente como un conjunto de procesos concurrentes.
• Estructura del sistema operativo: Las mismas ventajas de estructuración son aplicables a los sistemas operativos que están implementados como un conjunto de procesos.
Tipos de computadora en los que puede haber concurrencia:
• Multiprogramación con un CPU. El sistema operativo se encarga de repartir el CPU entre los procesos, intercalando su ejecución para dar una apariencia de ejecución simultánea.
• Multiprocesador. Máquina formada por más de un CPU que comparten memoria principal. Los procesos no sólo intercalan su ejecución sino también la superponer.
• Multicomputadora. Es una máquina de memoria distribuida formada por una serie de computadoras, es posible la ejecución simultánea de los procesos en los diferentes CPU’s.
La concurrencia será aparente siempre que el número de procesos sea mayor que el de procesadores disponibles y será real cuando haya un proceso por procesador (Paralelismo).
Pros:
• Facilita la programación de aplicaciones: permite que se estructuren como un conjunto de procesos que cooperan entre sí para alcanzar un objetivo común.
•Acelera los cálculos: Dividiendo una tarea en varios procesos, ejecutándolos en “paralelo”.
• Posibilita el uso interactivo a múltiples usuarios que trabajan de forma simultánea. • Permite un mejor aprovechamiento de los recursos, en especial del CPU, ya que pueden aprovechar las fases de entrada-salida de unos procesos para realizar las fases de procesamiento de otros.
Contras:
• Inanición e interrupción de procesos
• Ocurrencia de bloqueos
• Que 2 o más procesos requieran el mismo recurso

Tipos de procesos concurrentes:
Proceso independiente: El que se ejecuta sin cooperación de otros. Ejemplo: varias ventanas de una misma aplicación de forma simultánea.
Procesos cooperantes: Los que están diseñados para trabajar conjuntamente, deben comunicarse e interactuar. (Aplicaciones en red)
Tipos de interacción:
• Motivada porque los procesos comparten o compiten por el acceso a recursos. Ejemplo: dos procesos independientes compiten por el acceso a disco o para modificar una base de datos.
• Motivada porque los procesos se comunican y sincronizan entre sí para alcanzar un objetivo común. Ejemplo: compilador con varios procesos que trabajan conjuntamente para obtener un solo archivo de salida.
Aspectos de un sistema operativo para gestionar la concurrencia.
1. Debe seguir la pista de los distintos procesos activos, por medio de PBC’s 2. Debe asignar y quitar recursos a cada proceso activo:
• Tiempo de procesador. • Memoria: (virtual, swapping) • Archivos • E/S:
3. Debe proteger datos y recursos de cada proceso contra injerencias no intencionadas de otros procesos.

2.4.1 Exclusión

Regiones críticas
Parte de un programa, en la cual se intenta el acceso a recursos compartidos
Tipos de procesos
• Los procesos no conocen a los demás, son independientes, no trabajan juntos. • Los procesos conocen indirectamente a otros: no los conocen necesariamente, pero comparten algunos recursos. 
• Los procesos conocen a otros: se comunican y trabajan conjuntamente en una misma actividad.

Competencia de procesos por los recursos
Hay conflicto cuando los procesos compiten por el mismo recurso al mismo tiempo y el sistema operativo asignará el recurso a uno y el resto tendrá que esperar, el que quede esperando se retrasará, se bloqueará y en el peor de los casos nunca terminará bien
Ejemplo: Un Sistema Operativo debe asignar un identificador de proceso (PID) a dos procesos en un sistema multiprocesador. Si se realiza esta acción en dos procesadores a la vez sin control, se puede asignar el mismo PID a dos procesos distintos. Este problema se debe a que la asignación de PID es una sección crítica que debe ejecutarse en forma atómica, de forma completa e indivisible y ningún otro proceso podrá ejecutar dicho código mientras el primero no haya acabado su sección.
Debe haber sincronización que permita a los procesos cooperar entre ellos sin problemas protegiendo el código de la región crítica:
• Cada proceso debe solicitar permiso para entrar en la sección crítica mediante código.
• Cuando un proceso sale de la sección crítica debe indicarlo mediante código. Esto permitirá que otros procesos entren a ejecutar la sección crítica.

2.4.2 Sincronización de procesos en S.C.
2.4.2.1 Mecanismo de semáforos. 2.4.2.2 Mecanismo de monitores.
Sincronización
Coordinación para llevar a cabo el trabajo de un grupo de procesos cooperantes asegurando el acceso a recursos compartidos. Previene y/o corrige errores debidos a estos accesos.
Para que los procesos puedan sincronizarse debe disponerse de servicios que permitan bloquear o suspender la ejecución de un proceso.
Algoritmos: Espera Activa:
Establecen la espera de entrada a la RC con un ciclo que será roto en el momento en que se cumpla una condición. El proceso no queda bloqueado y el sistema se sobrecarga. Espera con mutex: Usa una variable switch con dos operaciones atómicas:
• lock: bloqueo. Si el switch ya está bloqueado por otro proceso, el proceso que realiza la operación esperará. En caso contrario se bloquea el mutex sin poner en espera al proceso.
• unlock: Desbloquea el switch. Si existen procesos esperando, activará a uno de ellos que será el nuevo proceso que adquiera el switch. La operación unlock sobre un mutex debe ejecutarla el proceso que adquirió con anterioridad el mutex mediante lock.
(Ejemplo de cabina telefónica)
3 Alternancia.- Usa una variable de turnos (lista de espera) Espera no activa.- Establecen la espera para entrar a una RC bloqueando el proceso. Semáforos: Variable entera usada como contador de peticiones de entrada a RC compartida por todos los procesos, gestiona el tráfico de procesos. Cuando un proceso intenta entrar en una RC mientras otro accede a los recursos compartidos, se bloqueará igual que cuando un proceso accede a un recurso ocupado. Se usa en sistemas con memoria compartida. Se le puede asignar un valor inicial 1 y sólo se puede acceder utilizando dos operaciones atómicas: wait (-1) y signal (+1). El algoritmo de uso es el siguiente:
Si el semáforo es menor o igual que cero, cualquier operación wait que se realice sobre el semáforo bloqueará al proceso. Si el semáforo es positivo, cualquier proceso que ejecute una operación wait no se bloqueará.
El valor que tiene que tomar el semáforo inicialmente es 1, de esta forma solo se permite a un único proceso acceder a la sección crítica. Si el valor inicial del semáforo fuera, por ejemplo, 2, entonces dos procesos podrían ejecutar la llamada wait sin bloquearse y por tanto se permitiría que ambos ejecutaran de forma simultánea dentro de la sección crítica Monitores.- En los métodos anteriores el programador debe proporcionar de modo explícito el modo de sincronización. El monitor termina con esto, pero debe ser soportado por el lenguaje correspondiente. Encapsula el código relativo a un recurso compartido en un solo módulo, así todos los accesos estarán forzados a usar dichas funciones: mantenimiento más simple, menos errores de programa.
Los monitores son estructuras de datos utilizadas en lenguajes de programación para sincronizar dos o más procesos o hilos de ejecución que usan recursos compartidos. En el estudio y uso de los semáforos se puede ver que las llamadas a las funciones necesarias para utilizarlos quedan repartidas en el código del programa, haciendo difícil corregir errores y asegurar el buen funcionamiento de los algoritmos. Para evitar estos inconvenientes se desarrollaron los monitores. El concepto de monitor fue definido por primera vez por Charles Antony Richard Hoare en un artículo del año 1974. La estructura de los monitores se ha implementado en varios lenguajes de programación, incluido Pascal concurrente, Modula-2, Modula-3 y Java, y como biblioteca de programas.
Exclusión mutua en un monitor
Los monitores están pensados para ser usados en entornos multiproceso o multihilo, y por lo tanto muchos procesos o threads pueden llamar a la vez a un procedimiento del monitor. Los monitores garantizan que en cualquier momento, a lo sumo un thread puede estarse ejecutando dentro de un monitor. Ejecutar dentro de un monitor significa que sólo un thread estará en estado de ejecución mientras dura la llamada a un procedimiento del monitor. El monitor hace cumplir la exclusión mutua implícitamente, de modo que sólo un procedimiento esté siendo ejecutado a la vez. De esta forma, si un thread llama a un procedimiento mientras otro thread está dentro del monitor, se bloqueará y esperará en la cola de entrada hasta que el monitor quede nuevamente libre.
Para que resulten útiles en un entorno de concurrencia, los monitores deben incluir algún tipo de forma de sincronización. Por ejemplo, supóngase un thread que está dentro del monitor y necesita que se cumpla una condición para poder continuar la ejecución. En ese caso, se debe contar con un mecanismo de bloqueo del thread, a la vez que se debe liberar el monitor para ser usado por otro hilo. Más tarde, cuando la condición permita al thread bloqueado continuar ejecutando, debe poder ingresar en el monitor en el mismo lugar donde fue suspendido. Para esto los monitores poseen variables de condición que son accesibles sólo desde adentro

2.4.3 Interbloqueo (DeadLock).

Análisis
En un conjunto de procesos, cada uno está esperando un evento que sólo otro proceso del conjunto puede causar. Puesto que todos los procesos están esperando, ninguno de ellos puede causar ninguno de los eventos que podrían despertar a cualquiera de los demás miembros del conjunto, y todos los procesos continúan esperando indefinidamente.
Ejemplo: Una carretera en 2 direcciones tiene un puente que sólo deja pasar vehículos en un sentido, con las siguientes situaciones:
Un auto llega al puente y en sentido contrario no hay nadie y puede cruzar
Si el paso es controlado por un semáforo en cada lado y 100 m antes de cada uno hay detectores de autos para encender el semáforo opuesto en rojo, pude pasar que 2 autos lleguen al mismo tiempo en ambos sentidos y ambos estén detenidos por el semáforo (interbloqueo)
Si no hay semáforos, un conductor cede el paso, pero antes de que termine el otro, aparece un 3º y así sucesivamente, puede hacer que el conductor educado no cruce mientras haya carros en sentido contrario (postergación indefinida)

RECURSOS
Elemento que un programa o proceso puede usar en la computadora donde se ejecuta, y puede ser usado por un solo proceso en un momento dado.
Tipos 
Reutilizables.- El que puede ser usado con seguridad por un proceso y no se agota con el uso, son liberados para que otros los reusen: CPU, canales de E/S, memoria y estructuras de datos archivos, bases de datos y semáforos. 
Consumibles.- El que puede ser creado (producido) y destruido (consumido). No hay límite en la cantidad. Un proceso productor que no está bloqueado puede liberar cualquier número de recursos consumibles. Cuando un proceso adquiere un recurso, éste deja de existir: señales, mensajes, e información en buffers. 
Operaciones 
  • Solicitud 
  • Uso 
  • Liberación
2.4.3.1 Prevención. 2.4.3.2 Detección. 2.4.3.3 Recuperación.
Prevención
A grandes rasgos, se debe diseñar un sistema de manera que esté excluida, a priori, la posibilidad de interbloqueo. Los métodos para prevenir el interbloqueo son de dos tipos.
Indirectos.- Consisten en impedir la aparición de alguna de las tres primeras condiciones necesarias
Directos.- Consisten en evitar la aparición de la condición 4.
Exclusión Mutua.- En general, no puede anularse. Si el acceso a un recurso necesita exclusión mutua, el sistema operativo debe soportar la exclusión mutua.
Retención y Espera.- Se previene exigiendo que todos los procesos soliciten todos los recursos que necesiten a un mismo tiempo y bloqueando el proceso hasta que todos los recursos puedan concederse simultáneamente. Es ineficiente porque: Un proceso puede estar detenido durante mucho tiempo, esperando que se concedan todas sus solicitudes de recursos, cuando de hecho podría haber avanzado con sólo algunos de los recursos.
Los recursos asignados a un proceso pueden permanecer sin usarse durante mucho tiempo, tiempo durante el cual se priva del acceso a otros procesos.

Círculo Vicioso de Espera.- Puede prevenirse definiendo una ordenación lineal de los tipos de recursos. Si a un proceso se le han asignado recursos de tipo R, entonces sólo podrá realizar peticiones posteriores sobre los recursos de los tipos siguientes a R en la ordenación. Para comprobar el funcionamiento de esta estrategia, se asocia un índice a cada tipo de recurso. En tal caso, el recurso R1, antecede a R2, en la ordenación si i < j. Suponga que dos procesos A y B se interbloquean, porque A ha adquirido R1, y solicitado R2, mientras que B ha adquirido R2; y solicitado R1. Esta situación es imposible porque implica que í < j y j < i. Puede ser ineficiente, retardando procesos y denegando accesos a recursos innecesariamente.
Detección y Recuperación
La detección no limita ni restringe como la prevención. Se concederán recursos que los procesos necesiten cuando sea posible. El sistema operativo ejecuta un algoritmo que permite detectar la condición de espera circular: Cuando un recurso se solicita o libera, se determina si contiene algún ciclo. Si se encuentra uno, se termina uno de los procesos del ciclo. Si esto no rompe el bloqueo mutuo, se termina otro proceso, continuando así hasta romper el ciclo.

Ventajas de verificación frecuente:
Pronta detección
Desventajas:
Consume un tiempo de procesador considerable.
Formas de recuperación:
1. Abandonar todos los procesos bloqueados. Esta es una de las soluciones más comunes adoptadas en un sistema operativo.
2. Retroceder cada proceso interbloqueado hasta algún punto de control definido previamente y volver a ejecutar todos los procesos. Puede repetirse el interbloqueo original e implica mecanismos de retroceso y reinicio 3. Abandonar sucesivamente los procesos bloqueados hasta que deje de haber interbloqueo. Seleccionando procesos según algún criterio. Después de abandonar cada proceso, se debe ejecutar de nuevo el algoritmo de detección para ver si todavía existe interbloqueo.
4. Apropiarse de recursos sucesivamente hasta que deje de haber interbloqueo. Seleccionando procesos según un criterio y ejecutando el algoritmo de detección después de cada apropiación. Un proceso que pierde un recurso por apropiación debe retroceder hasta un momento anterior a la adquisición de ese recurso.

2.5 Niveles, objetivos y criterios de planificación.

Niveles de planificación.
  • Planificación de largo plazo.- (Planificación de trabajos), determina a qué trabajos se les permite entrar al sistema, cuál es el próximo trabajo que se va a ejecutar. Existe en los sistemas por lotes donde la decisión se basa en las necesidades de recursos y su disponibilidad. En los sistemas de tiempo compartido tiene como misión cargar los programas que se desea ejecutar en memoria, es por tanto el encargado de crear los procesos. 
  • Planificación de mediano plazo.- (Planificación de Swapping), determina a qué proceso se le permite competir por el CPU. Suspende y/o activa temporalmente procesos para mantener una operación uniforme en el sistema y ayuda a realizar algunas funciones para optimizar el rendimiento del sistema. 
  • Planificación de corto plazo.- (Planificación de CPU), determina a qué proceso deberá asignarse el CPU (despachar). Esta operación se realiza muchas veces por segundo, por lo que el despachador debe estar permanente en memoria.
Objetivos de la planificación 
  • Justicia.- Sin favorecer o perjudicar procesos 
  • Máxima capacidad de ejecución.- Realizar los trabajos lo más rápido posible. Minimizar los cambios de procesos 
  • Máximo número de usuarios interactivos.- Simultáneos 
  • Predecibilidad.- Saber en todo momento cómo será la ejecución. 
  • Mínima sobrecarga.- A menor sobrecarga mayor velocidad. Minimizar los cambios de contexto 
  • Equilibrio en el uso de recursos.- Que estén ocupados equitativamente el mayor tiempo posible 
  • Seguridad de las prioridades.- Ejecutar más pronto los de más alta prioridad 
Muchos de estos objetivos están en conflicto unos con otros, esto hace que la planificación sea un problema complejo.

Criterios de planificación. 
  • Tiempo de respuesta.- Velocidad con que la computadora responde a una petición, depende mucho de la velocidad de los dispositivos E/S. 
  • Tiempo de servicio.- Tiempo que tarda en ejecutarse un proceso, desde su carga en memoria, espera en la lista de listos, ejecución en CPU y operaciones e/s. 
  • Tiempo de ejecución.- Tiempo de servicio menos la espera en la lista de listos, o sea, el tiempo teórico que necesitaría el proceso para ejecutarse si fuera el único. 
  • Tiempo de CPU.- Tiempo que un proceso usa el CPU sin contar el tiempo de bloqueado. Tiempo de espera.- 
  • Tiempo en que el proceso está activo pero sin ser ejecutado (listas)
2.6 Técnicas de administración del planificador.


Planificación del CPU
Ciclo de ráfaga del CPU y de E/S.
El éxito de la planificación del CPU depende de la siguiente prioridad observada de los procesos: la ejecución de un proceso consiste en un ciclo de ejecución del CPU y de E/S, y los procesos se alternan entre estos dos estados. La ejecución del proceso se hace alternando una ráfaga de CPU y una ráfaga de E/S. La última ráfaga de CPU terminará con una solicitud al sistema para que concluya la ejecución.

Planificador del CPU.
Siempre que el CPU queda inactivo, el sistema operativo debe seleccionar para su ejecución uno de sus procesos de la lista de listos. La selección es revisada por el planificador a corto plazo,

Estructura de planificación.
Las decisiones de planificación del CPU pueden efectuarse cuando un proceso cambia: 
  • De ejecución a bloqueado 
  • De ejecución a listo 
  • De bloqueado a listo 
  • Cuando termina.
Algoritmos de planificación
Los procesos que se asignan al cpu son tomados de la lista de listos. Esta lista se alimenta de 2 puntos: 
  • Cuando un usuario inicia la ejecución de un programa, el planificador a largo plazo recibe la orden de ejecución, crea el proceso y lo pasa al planificador a corto plazo.
  • Cuando un proceso deja de estar en ejecución y no hay causas de bloqueo, o deja de estar bloqueado.
Políticas de planificación: 
  • Apropiativas.- Producen un cambio de proceso con cada cambio de contexto; el proceso que usa el cpu puede ser suspendido y permitir el acceso al cpu a otro proceso. (Tiempo compartido y tiempo real) 
  • No apropiativas.- Un proceso no abandona nunca el procesador desde su comienzo hasta su fin. (Por lotes).
2.6.1 FIFO
Primero en llegar primero en ser servido (FCFS)
EL cpu ejecuta cada proceso hasta que termina, los procesos que entran a la lista de listos estarán formados en el orden en que llegan hasta que les toque turno (FIFO).
El tiempo de espera de cada proceso depende del número de procesos que están en la lista de listos al momento de su ejecución y del tiempo que cada uno tenga en uso el cpu, y es independiente de las necesidades de ejecución del propio proceso
Características: No apropiativa, Justa y Predecible.

2.6.2 SJF
Siguiente proceso el más corto (SJN)
Toma de la lista de listos el proceso que necesite menos tiempo de ejecución para realizar su trabajo. Debe saberse el tiempo de cpu que necesita cada proceso por medio de: información suministrada por el usuario, por el programa, por experiencia.
Características: No apropiativa, El tiempo de espera aumenta según la longitud de los procesos, Es poco predecible, No es justa con los procesos largos, Buen tiempo de servicio, Es difícil de implementar por los datos necesarios para la planificación.

2.6.3 RR
Round Robin (RR)
Asignación cíclica, es una mejora de FCFS. A cada proceso se le da un determinado tiempo q (quantum), si no termina, se forma en la lista de listos, el cpu es para el siguiente proceso y así hasta que termine la ejecución.
La administración de la lista de listos puede ser FIFO o por prioridades. Variando q se tienen diferentes comportamientos. Si q>tiempo de ejecución se convertiría en FCFS, si q tiende a 0, la sobrecarga sería muy grande, la mayor parte del tiempo se usaría en cambios de contexto.

Condiciones: 
  • q=1 
  • Si un proceso termina antes que su q, se le concede el cpu a otro proceso con q completo 
  • Al crearse un proceso se forma al final de listos 
  • Si un proceso se crea en el mismo momento que un q termina, se supone que dicho proceso se formó en listos antes que la expiración de q.
2.6.4 Queves multi-level. Colas múltiples
Cuando los procesos que van a ser ejecutados se pueden agrupar en distintos grupos, podemos asignarlos a diferentes colas, cada una con distinta planificación, para darle la que realmente necesite.
Esta política divide la cola de procesos preparados (listos) en varias colas separadas, de forma que los procesos se asignan a una cola específica según sus necesidades y tipo.
Para determinar en cada caso qué cola es la que suministrará un proceso para que acceda al cpu cuando éste deje a otro anterior, será controlada por un algoritmo de planificación entre las colas, que normalmente es apropiativo de prioridad fija.

2.6.5 Multi-level feedback queves. (Colas múltiples con retroalimentación)
Para dar un trato justo a los procesos, es necesario conocer previamente todos sus parámetros característicos: longitud, si son limitados por e/s o por cpu, memoria requerida, etc. Como estos datos no suelen ser conocidos, es difícil determinar el trato que debe recibir cada proceso. Después de analizar las políticas anteriores, es fácil concluir que se deben adoptar las siguientes cuestiones: Favorecer los procesos cortos Favorecer los procesos limitados por e/s Determinar la naturaleza del trabajo a realizar
El método de colas múltiples con retroalimentación divide los procesos en varias colas de procesos preparados (listos): cola 0, cola 1, cola 2, y así sucesivamente, de forma que las de numeración más baja tendrán una mayor prioridad.


Unidad 1 Introducción a los Sistema Operativos


1.1 Sistema Operativo.
Colección de mecanismos de software destinados a servir de interfaces entre un sistema informático y sus usuarios, el cual ofrece herramientas y facilidades para simplificar las tareas de diseño, codificación, depuración, actualización, etc.


Administra los recursos hardware y software que constituyen el sistema informático a explotar. Nació con la necesidad de llevar el control de quién utiliza los recursos software (usuario(s)). Componentes principales: manejo de procesos, entrada/salida, manejo de memoria y del sistema de archivos. Un sistema de computación consta de hardware, programas del sistema y programas de aplicación.


1.2 Funciones y características.
Las funciones básicas de un Sistema Operativo son: 
  • soporte para la ejecución de sw(software) de aplicación 
  • elemento de diagnóstico de hw(hardware) 
  • elemento de una red de computadoras 
  • elemento que optimiza el aprovechamiento de los recursos lógicos y físicos de un sistema de cómputo

1.3 Evolución histórica.
Los primeros sistemas.
En un principio sólo existía el hardware de la computadora. Las primeras computadoras eran (físicamente) grandes máquinas que se operaban desde una consola. Una sola persona programaba y operaba el equipo.

Accesos por operador
En 1955 se separaron las funciones informáticas: Programación, operación y mantenimiento. El operador se encarga del manejo de la máquina (cargar programas, obtener resultados, hacer respaldos, etc.) y el programador dejó de tener acceso a la computadora.
Los programadores daban al operador los trabajos, éste los reunía y los ejecutaba uno tras otro y recogía los resultados entregándolos a los programadores.
Otra solución: El operador agrupaba los trabajos similares en requerimientos y los ejecutaba como si fueran un bloque (todos los de cobol, todos los de fortran), así se cargaba sólo una vez el compilador.

Secuencia automática de trabajos
El trabajo del operador era muy rutinario y podía automatizarse. Se diseñó un programa que transfería automáticamente el control de un trabajo a otro, el monitor residente (1er sistema operativo). Al encender el equipo el control se daba al programa monitor, este lo pasaba al 1er trabajo, el cual al terminar regresaba el control al monitor, y así sucesivamente.

Mejora del rendimiento
Aun quedaba mucho tiempo del cpu ocioso debido a la diferencia de velocidad entre este y los dispositivos entrada/salida que eran mecánicos.

Off-Line
Aparecieron las cintas magnéticas, más rápidas que las tarjetas perforadas, pero secuenciales. Entonces se perforaban los programas en tarjetas y de ahí se pasaban a una cinta, esta cinta en bloque se pasaba a ejecución y los resultados en una nueva cinta y de ahí a la impresora. Las operaciones se hacían en dispositivos distintos lo que aumentaba la velocidad.

On line
Lector de tarjetas->CPU->Impresora

Off Line
Lector de tarjetas->Unidad de Cinta->CPU->unidad de cinta->Impresora
Se podían tener varias lectoras de tarjetas y unidades de cinta y mantener ocupado al CPU, la desventaja era que el usuario debía esperar a que se llenara la cinta para ser atendido.

Multiprogramacion

Tipos de trabajo:
Limitados por proceso: La mayor parte de su tiempo ocupan CPU

El segundo tipo dio origen a la Multiprogramación.- Modo de trabajo en el que se pueden ejecutar varios programas simultáneamente aprovechando la inactividad del CPU en una operación e/s para optimizar el uso de los recursos. Surge de la imposibilidad de que con un solo trabajo se puedan tener ocupados el cpu y los entrada/salida todo el tiempo
Da la impresión que todos los procesos están siendo atendidos a la vez pero son conmutados

Problemas:
1 El cpu debe tener reglas para ejecutar todos los trabajos
2 Se necesita administración de memoria porque será compartida por varios trabajos
3 Varios trabajos pueden necesitar el mismo recurso a la vez (concurrencia)
Surge el núcleo del sistema (Kernel): rutinas para gestión de memoria, cpu y demás recursos

1.4. Clasificación
Sistemas Operativos por Servicios
Esta clasificación es la más comúnmente usada y conocida desde el punto de vista del usuario final.



Monousuarios: un usuario a la vez, no importa el número de cpu’s, número de procesos que pueda ejecutar en un mismo instante de tiempo. PC’s.

Multiusuarios: más de un usuario a la vez, por varias terminales conectadas a la computadora o por sesiones remotas en una red de comunicaciones. No importa el número de cpu’s ni el número de procesos que cada usuario puede ejecutar simultáneamente.

Monotareas: sólo una tarea a la vez por usuario. Puede darse el caso de un sistema multiusuario y monotarea, varios usuarios al mismo tiempo pero cada uno de ellos puede estar haciendo solo una tarea a la vez.

Multitareas: realiza varias labores al mismo tiempo. interfases gráficas orientadas al uso lo cual permite un rápido intercambio entre las tareas para el usuario,

Monoprocesador: solamente un CPU, de manera que si la computadora tuviese más de uno le sería inútil. MS-DOS y MacOS.

1.5 Estructura (niveles o estratos de diseño).


Estructura monolítica.
Características:
1 Construcción del programa final a base de módulos compilados separadamente que se unen a través del encadenador (linker)
2 Buena definición de parámetros de enlace entre las distintas rutinas existentes
3 Carecen de protecciones y privilegios al entrar a rutinas
que manejan diferentes aspectos de los recursos de la computadora
4 Generalmente hechos a la medida, eficientes y rápidos en ejecución y gestión
5 Poco flexibles para soportar diferentes ambientes de trabajo o aplicaciones.




Estructura jerárquica.
Mayores necesidades de los usuarios, mayor organización del software. Se dividió el sistema operativo en pequeñas partes, cada una bien definida y con una clara interfase con el resto de elementos.
Se constituyó una estructura jerárquica, el primero de los cuales fue denominado THE (Technische Hogeschool, Eindhoven)
Capa 5 – Control de programas de usuario
Capa 4 – Gestión de Archivos
Capa 3 – Control de operaciones entrada/salida
Capa 2 – Control de la Consola de operación
Capa 1 – Gestión de memoria
Capa 0 – Planificación de CPU


Otra forma es la de anillos.
Cada uno tiene una apertura por donde pueden entrar las llamadas de las capas inferiores. Las zonas más internas del sistema operativo o núcleo estarán más protegidas de accesos indeseados desde las capas más externas. Las internas serán más privilegiadas que las externas.

Cliente-servidor
El más reciente, puede ser ejecutado en la mayoría de las computadoras, para toda clase de aplicaciones, es de propósito general.
El núcleo establece la comunicación entre los clientes y los servidores. Los procesos pueden ser tanto servidores como clientes. Por ejemplo, un programa de aplicación normal es un cliente que llama al servidor correspondiente para acceder a un archivo o realizar una operación de entrada/salida sobre un dispositivo concreto. A su vez, un proceso cliente puede actuar como servidor para otro.


1.6 Núcleo.
El Núcleo.- Componente que interactúa directamente con el hardware. Contiene un conjunto de rutinas que hacen posible la ejecución de los programas y la comunicación entre ellos y el Hardware, es el que gestiona la entrada y salida del sistema, adaptándolas al hardware del sistema.

Núcleo (Kernel) y Niveles de un Sistema Operativo

Concepto de Kernel
Para que una computadora pueda arrancar y funcionar, no es necesario que tenga un núcleo para poder usarse. Los programas pueden cargarse y ejecutarse directamente en una computadora «vacía», siempre que sus autores quieran desarrollarlos sin usar ninguna abstracción del hardware ni ninguna ayuda del sistema operativo. Ésta era la forma normal de usar muchas de las primeras computadoras: para usar distintos programas se tenía que reiniciar y reconfigurar la computadora cada vez. Con el tiempo, se empezó a dejar en memoria (aún entre distintas ejecuciones) pequeños programas auxiliares, como el cargador y el depurador, o se cargaban desde memoria de sólo lectura. A medida que se fueron desarrollando, se convirtieron en los fundamentos de lo que llegarían a ser los primeros núcleos de sistema operativo.
El kernel presenta al usuario o los programas de aplicación una interfaz de programación de alto nivel, implementando la mayoría de las facilidades requeridas por éstos. Reúne el manejo de una serie de siguientes conceptos ligados al hardware de nivel más bajo:
  • Procesos (tiempo compartido, espacios de direccionamiento protegidos); 
  • Señales y Semáforos; 
  • Memoria Virtual ("swapping", paginado); 
  • Sistema de Archivos; 
  • Tubos ("pipes") y Conexiones de red.
1.6.1.Interrupciones (FLIH).
La interrupción es el mecanismo mediante el cual otros módulos pueden interrumpir una secuencia normal de procesamiento. Ejemplos: Programa: división por cero Temporizador: cuando se cumple un tiempo específico E/S: cuando hay algo que comunicar Hardware: cuando ocurre una falla.
La gestión de interrupciones la realiza el manipulador (controlador) de interrupciones (FLIH, First Level Interrupt Handler) que es la parte del sistema operativo responsable de proporcionar la respuesta adecuada a las señales procedentes tanto del exterior como del interior del sistema (interrupciones externas e internas).

       1.6.2 Despachador(Scheduler).
Se encarga de asignar los procesadores a los diferentes procesos, por lo tanto debe actuar cuando se debe comprobar si es necesario cambiar el proceso que está activo.
Esto involucra: 
  • cambio de contexto 
  • cambio a modo usuario 
  • salto a la dirección de memoria que corresponda al programa de usuario para continuar su ejecución.
Criterios de Despachador 
  • Utilización de CPU: mantener la CPU ocupada la mayor cantidad del tiempo posible
  • Productividad (Throughput): # de procesos por unidad de tiempo 
  • Tiempo de servicio (Turnaround time): tiempo necesario para la ejecución de un proceso particular 
  • Tiempo de espera (Waiting time): tiempo total que el proceso se encuentra en la fila ready
  • Tiempo de respuesta (Response time): tiempo que transcurre desde el requerimiento hasta que se produce la primera respuesta (en ambientes de tiempo compartido)
Criterios de Optimización 
  • Máxima utilización de CPU 
  • Máxima productividad 
  • Mínimo tiempo de servicio 
  • Mínimo tiempo de espera 
  • Mínimo tiempo de respuesta
       1.6.3 Primitivas de comunicación (IPC).
Es una función básica de los Sistemas operativos. Los procesos pueden comunicarse entre sí a través de compartir espacios de memoria, ya sean variables compartidas o buffers, o a través de las herramientas provistas por las rutinas de IPC (Interprocess Communication).
La IPC provee un mecanismo que permite a los procesos comunicarse y sincronizarse entre sí. Normalmente a través de un sistema de bajo nivel de paso de mensajes que ofrece la red subyacente. La comunicación se establece siguiendo una serie de reglas (protocolos de comunicación).

Sistemas Operativos


UNIDAD I
INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS

1.1. Definición y concepto Sistema Operativo
1.2. Funciones y características.

1.3. Evolución Histórica 
1.4. Clasificación
1.5. Estructura (niveles o estratos de diseño).
1.6. Núcleos
       1.6.1.Interrupciones (FLIH).
       1.6.2 Despachador(Scheduler).
       1.6.3 Primitivas de comunicación (IPC).

UNIDAD II
ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR

2.1 Concepto de proceso.
2.2 Estados y transiciones de los procesos
2.3 Procesos ligeros (Hilos o hebras).
2.4 Concurrencia y secuenciabilidad.
      2.4.1 Exclusión mutua de secciones criticas.
      2.4.2 Sincronización de procesos en S.C.
               2.4.2.1 Mecanismo de semáforos.
               2.4.2.2 Mecanismo de monitores
      2.4.3 Interbloqueo (DeadLock).
               2.4.3.1 Prevención. 
               2.4.3.2 Detección. 
               2.4.3.3 Recuperación.
2.5 Niveles, objetivos y criterios de planificación.
2.6 Técnicas de administración del planificador.
      2.6.1 FIFO
      2.6.2 SJF
      2.6.3 RR
      2.6.4 Queves multi-level. Colas múltiples
      2.6.5 Multi-level feedback queves. (Colas múltiples con retroalimentación)

UNIDAD III
ADMINISTRACION DE MEMORIA
3.1 Política y filosofía.
3.2 Memoria real.
      3.2.1 Administración de almacenamiento.
      3.2.2 Jerarquía.
      3.2.3 Estrategia de administración de memoria.
      3.2.4 Asignación contigua vs no contigua.
      3.2.5 Multiprogramación de partición fija, partición variable, con intercambio de                              almacenamiento.
3.3 Organización de memoria virtual.
      3.3.1 Evolución de las organizaciones de almacenamiento
      3.3.2 Paginación.
      3.3.3 Segmentación.
      3.3.4 Sistemas de paginación-segmentación.
3.4 Administración de memoria virtual.
      3.4.1 Estrategias de administración.
      3.4.2 Técnicas de reemplazo de páginas.
      3.4.3 Paginación por demanda
      3.4.4 Paginación anticipada. 
      3.4.5 Liberación de página.
      3.4.6 Tamaño de página.

UNIDAD IV 
ADMINISTRACION DE ENTRADA Y SALIDA

4.1 Dispositivos y manejadores de dispositivos (device drivers).
4.2 Mecanismos y funciones de los manejadores de dispositivos (device drivers).
4.3 Estructuras de datos para manejo de dispositivos.
4.4 Operaciones de Entrada /salida.

UNIDAD V
SISTEMAS DE ARCHIVOS

5.1 Concepto.
5.2 Noción de archivo real y virtual.
5.3 Componentes de un sistema de archivos.
5.4 Organización lógica y física.
      5.4.1. Discos
      5.4.2. Hardware de Discos
5.5 Mecanismos de acceso a los archivos.
5.6 Manejo de espacio en memoria secundaria.
5.7 Modelo jerárquico.
5.8 Mecanismos de recuperación en caso de falla.