martes, 18 de octubre de 2011

Niveles de Planificación

Se consideran tres niveles importantes de planificación, los que se detallan a continuación:


•Planificación de alto nivel: Se encarga de llevar procesos de disco a memoria y viceversa. Seleccionando los trabajos que deben admitirse en el sistema.
*También se denomina Planificación de trabajos. 
*Determina a qué trabajos se les va a permitir competir activamente por los recursos del sistema, lo cual se denomina Planificación de admisión. 
*Administrar todos los recursos del sistema excepto el CPU. 
*Mantiene las colas de procesos bloqueados y suspendidos. 
*Controla la creación de procesos. 
*Maneja el nivel de multiprogramación. 

•Planificación de nivel intermedio: En algunos casos, en especial cuando el sistema está sobrecargado, el planificador de nivel medio encuentra ventajoso retirar trabajos activos de la memoria para reducir el grado de multiprogramación, y por lo tanto, permitir que los trabajos se completen mas aprisa. Este subadministrador controla los trabajos que se intercambian hacia fuera y de regreso.
*Determina a qué procesos se les puede permitir competir por la cpu. 
*Efectúa “suspensiones” y “activaciones” (“reanudaciones”) de procesos. 
*Debe ayudar a alcanzar ciertas metas en el rendimiento total del sistema. 
*Equilibrar la administración de trabajos en el sistema con la asignación del CPU a dichos procesos. 
*Nivelar la carga del sistema (procesos activos y pasivos). 

•Planificación de bajo nivel: Se encarga de pasar de un proceso a otro en memoria principal. Determinando a cuál proceso listo se le asignará el CPU cuando éste se encuentra disponible. 
*Determina a qué proceso listo se le asigna la cpu cuando esta queda disponible y asigna la cpu al mismo, es decir que “despacha” la cpu al proceso.

Planificacion de Procesos


Cuando más de un proceso es ejecutable desde el punto de vista lógico, el Sistema Operativo debe decidir cuál de ellos debe ejecutarse en primer término.
El Planificador es la porción del Sistema Operativo que decide y el Algoritmo de Planificación es el utilizado.
Los principales “criterios” respecto de un buen algoritmo de planificación [23, Tanenbaum] son la equidad, la eficacia, el tiempo de respuesta, el tiempo de regreso y el rendimiento (ver Tabla 2.2 [23, Tanenbaum]).




Criterio Descripción
Equidad Garantizar que cada proceso obtiene su proporción justa de la cpu
Eficacia Mantener ocupada la cpu el ciento por ciento del tiempo
Tiempo de respuesta Minimizar el tiempo de respuesta para los usuarios interactivos
Tiempo de regreso Minimizar el tiempo que deben esperar los usuarios por lotes (batch) para obtener sus resultados
Rendimiento Maximizar el número de tareas procesadas por hora
Tabla 2.2: Criterios de un buen algoritmo de planificación.
 
Algunas de estas metas son contradictorias, por ejemplo, minimizar el tiempo de respuesta para los usuarios interactivos significaría no ejecutar las tareas batch.

Cada proceso es único e impredecible, es decir que pueden requerir intensivamente operaciones de Entrada / Salida o intensivamente cpu; el planificador del Sistema Operativo no tiene la certeza de cuánto tiempo transcurrirá hasta que un proceso se bloquee, ya sea por una operación de Entrada / Salida o por otra razón .
Para evitar que un proceso se apropie de la cpu un tiempo excesivo, los equipos poseen un dispositivo que provoca una interrupción en forma periódica, por ejemplo 60 hz, o sea sesenta veces por segundo.
En cada interrupción del reloj el Sistema Operativo decide si el proceso que se está ejecutando continúa o si el proceso agotó su tiempo de cpu y debe suspenderse y ceder la cpu a otro proceso.
Los principales conceptos relacionados con Planificación del Procesador son los siguiente:

  • Planificación apropiativa: es la estrategia de permitir que procesos ejecutables (desde el punto de vista lógico) sean suspendidos temporalmente.
  • Planificación no apropiativa: es la estrategia de permitir la ejecución de un proceso hasta terminar.
  • Planificación del procesador: determinar cuándo deben asignarse los procesadores y a qué procesos, lo cual es responsabilidad del Sistema Operativo.

Métodos de Concurrencia.


La mayoría de los sistemas operativos utilizan una técnica de gestión del procesador denominada multiprogramación, o una variante de ésta llamada tiempo compartido. Los primeros sistemas operativos gestionaban el procesador mediante otra técnica llamada monoprogramación (utilizada en los monitores de batch de flujo único). En este apartado comentaremos el por qué se evolucionó de la monoprogramación a la multiprogramación. Antes de entrar en esta discusión vamos a ver cómo se realizan las operaciones de entrada/salida (E/S), es decir, las operaciones que permiten la comunicación con los dispositivos de E/S.
Realización de las operaciones de E/S
Para facilitar el uso de los dispositivos, éstos se dividen en dos componentes. La primera es la componente eléctrica, a la cual se le llama controlador del dispositivo. La segunda es la componente mecánica, y es a lo que se llama propiamente dispositivo. Esta división permite un diseño más modular del dispositivo, además de simplificar su uso, ya que la CPU casi siempre trabaja con el controlador (más fácil de usar), que hace de interfaz entre la CPU y el dispositivo.
El controlador contiene una serie de registros llamados puertos de entrada/salida. Estos registros son accesibles (pueden ser leídos y modificados) mediante la ejecución de instrucciones máquina. Las operaciones de E/S se realizan a través de la carga y lectura de estos registros. Casi todo controlador dispone de los siguientes registros:
*Registro de estado. Indica la situación actual del dispositivo. Un bit del registro, al que llamaremos bit de ocupación, indica si el dispositivo está ocupado (el bit tendrá el valor uno) realizando una operación de E/S o si está desocupado (el bit tendrá el valor cero), y, por tanto, preparado para recibir una orden.
*Registro de órdenes. En este registro se escribe la operación de E/S que se desea que realice el dispositivo. Por ejemplo, en una cinta un código de 00 puede indicar rebobinar la cinta, 01 leer de la cinta, 10 escribir en la cinta, etc. El controlador se encarga de traducir estas órdenes en órdenes comprensibles para el dispositivo.
Buffer. Un buffer es un almacén de información. El buffer del controlador se utiliza para guardar temporalmente los datos implicados en una operación de E/S. Por ejemplo, si se quiere escribir en una impresora, se carga la información a escribir desde memoria principal al buffer. Posteriormente, el controlador mandará dicha información desde el buffer a la impresora.
Pasemos ahora a introducir el concepto de monoprogramación. En un sistema de monoprogramación todos los recursos del ordenador -CPU, memoria, discos, impresoras, etc- se dedican a la ejecución de un único programa. Este modo de trabajar lleva a una baja utilización de los recursos del ordenador como se justifica a continuación. Cuando el programa en ejecución realiza una operación de E/S se introduce la orden precisa en el registro de órdenes. El controlador responde a esto traduciendo esas órdenes al dispositivo, y poniendo a uno el bit de ocupación para indicar que el dispositivo está ocupado realizando una operación de E/S. Cuando termine la operación, el controlador pone a cero este bit para indicar que la operación concluyó, y el dispositivo está desocupado. Para saber cuándo termina la E/S, el programa, después de mandar la orden, tiene que ejecutar un ciclo del siguiente estilo:

Leer el registro de estado
     Mientras (el bit de ocupación esté a uno)
           Leer el registro de estado
                                                  Fin Mientras
Figura 6.1 Utilización de los recursos con monoprogramación

Obsérvese que esta forma de realizar las operaciones de E/S nos lleva a una situación en la que en un momento dado se tiene que, o bien la CPU está ejecutando instrucciones de un programa que no son de E/S, y los dispositivos de E/S están ociosos, o bien un único dispositivo de E/S está trabajando, mientras la CPU está en un ciclo comprobando si ha finalizado la operación. Esto se ilustra en la figura 6.1, donde los rectángulos rellenos a trazas representan el ciclo de comprobación. Para dar una medida de la infrautilización de los recursos que conlleva esta forma de realizar las E/S, piénsese que en el tiempo en que una impresora imprime una línea, la CPU, en lugar de ejecutar el ciclo de comprobación que aparece líneas más arriba, podría ejecutar millones de instrucciones de otro programa. A esta forma de realizar la E/S de los sistemas de monoprogramación se le llama E/S controlada por programa.



Para paliar la baja utilización de los recursos se desarrolló la multiprogramación. La multiprogramación se apoya en varios elementos del hardware: la interrupción, el DMA y el canal. En un sistema multiprogramado la memoria principal alberga a más de un programa de usuario. La CPU ejecuta instrucciones de un programa, cuando el programa en ejecución (es decir, el que ocupa la CPU) realiza una operación de E/S, emite ciertas órdenes al controlador (al igual que en los sistemas monoprogramados); pero en lugar de esperar a que termine la operación de E/S comprobando el bit de ocupación, se pasa a ejecutar otro programa. Si este nuevo programa realiza, a su vez, otra operación de E/S, se mandan las órdenes oportunas al controlador, y pasa a ejecutarse otro programa. Esto permite que varios dispositivos trabajen simultáneamente, además, en la CPU no se tienen que ejecutar ciclos de comprobación del estado de los dispositivos.
Esto se ilustra en la figura 6.2, en ella P1, P2 y P3 representan programas que residen en la memoria principal. Los rectángulos representan si el recurso está siendo utilizado, salvo para P1, P2 y P3 que representan si el programa ocupa la CPU. Al principio se está ejecutando P1, cuando inicia una operación de E/S con la impresora se cede la CPU a P2. P2 se ejecuta hasta que comienza una operación con el scanner, entonces se cede la CPU a P3, éste se ejecuta hasta que utiliza la impresora, momento en el cual se reanuda P1. Obsérvese que en este ejemplo la CPU siempre está activa. No obstante, podría suceder que todos los programas que residen en la memoria inicien una operación de E/S y en un momento dado todos estén esperando la finalización de su operación, esto conllevaría la no utilización de la CPU hasta que acabe la operación de E/S de cualquiera de los programas.


Figura 6.2 Utilización de los recursos con multiprogramación

Cuando un dispositivo acaba una operación de E/S debe de poder comunicárselo al programa que espera su finalización, para que así, el programa pueda proseguir su ejecución. Para indicar el fin de la operación el controlador manda una interrupción a la CPU. Una interrupción no es más que una señal eléctrica que provoca que el contador del programa y la PSW del programa en ejecución se salven en un lugar seguro de memoria, para, a continuación, cargar el contador de programa con una dirección fija de memoria donde reside un programa del sistema operativo que gestiona la interrupción. Este programa ejecutará cierto código para indicar al programa que esperaba la finalización de la operación de E/S que ésta ya terminó. Una vez que este programa del sistema operativo acaba su trabajo ejecuta una instrucción de retorno de interrupción, la cual restaura el contador de programa y la PSW del programa interrumpido, prosiguiéndose así su ejecución sin que éste sea consciente de que ha sido interrumpido. A esta forma de realizar la E/S se le llama E/S controlada por interrupción.
Analicemos ahora el DMA y el canal. Cuando un dispositivo realiza una operación de E/S, por ejemplo, una lectura de una cinta, la información leída pasa al buffer del controlador. Después, el programa que inició la lectura ejecuta ciertas instrucciones para copiar esta información desde el buffer hacia la memoria principal. La copia se realiza mediante un ciclo, copiando en cada iteración del ciclo un byte o una palabra desde el buffer del controlador a la memoria principal. En un controlador que disponga de DMA (acrónimo de Direct Memory Access, acceso directo a memoria) la copia del buffer a memoria la realiza el propio controlador; para ello, el programa ha de indicarle al controlador la dirección de memoria de inicio de la copia y el número de bytes a copiar, esto lo hace en el momento de darle la orden de E/S, metiendo esta información en algunos registros del controlador. Pasemos ahora a ver lo que es un canal, un canal es un pequeño procesador de E/S (es decir, un ordenador que sólo entiende instrucciones de E/S), su utilidad es proporcionar DMA a varios dispositivos, resultando más económico que tener un controlador DMA por dispositivo.
Después de la aparición de la multiprogramación surgieron los ordenadores de acceso múltiple o multiusuario. En ellos cada usuario dispone de un terminal, es decir, un teclado y una pantalla conectados al ordenador. Los usuarios ejecutan programas interactivos. Un programa interactivo es aquel que se comunica con el usuario por medio de un terminal, el usuario le suministra información al programa mediante el teclado, y recibe información del programa a través de la pantalla. Los programas de los usuarios comparten los recursos (CPU, memoria, discos, impresoras, etc) del ordenador. Estos sistemas hacen uso de una variante de la multiprogramación llamada tiempo compartido

Multiprocesador

Multiprocesamiento o multiproceso es tradicionalmente conocido como el uso de múltiples procesos concurrentes en un sistema en lugar de un único proceso en un instante determinado. Como la multitarea que permite a múltiples procesos compartir una única CPU, múltiples CPUs pueden ser utilizados para ejecutar múltiples hilos dentro de un único proceso.

El multiproceso para tareas generales es, a menudo, bastante difícil de conseguir debido a que puede haber varios programas manejando datos internos (conocido como estado o contexto) a la vez. Los programas típicamente se escriben asumiendo que sus datos son incorruptibles. Sin embargo, si otra copia del programa se ejecuta en otro procesador, las dos copias pueden interferir entre sí intentando ambas leer o escribir su estado al mismo tiempo. Para evitar este problema se usa una variedad de técnicas de programación incluyendo semáforos y otras comprobaciones y bloqueos que permiten a una sola copia del programa cambiar de forma exclusiva ciertos valores.

Las computadoras que tienen mas de un CPU son llamadas multiproceso. Un sistema operativo multiproceso coordina las operaciones de la computadoras multiprocesadoras. Ya que cada CPU en una computadora de multiproceso puede estar ejecutando una instrucci ón, el otro procesador queda liberado para procesar otras instrucciones simultáneamente. Al usar una computadora con capacidades de multiproceso incrementamos su velocidad de respuesta y procesos. Casi todas las computadoras que tienen capacidad de mu ltiproceso ofrecen una gran ventaja. 

Los primeros Sistemas Operativos Multiproceso realizaban lo que se conoce como: Multiproceso asimétrico: Una CPU principal retiene el control global de la computadora, así como el de los otros procesadores. Esto fue un primer paso hacia el multiproceso pero no fue la dirección ideal a seguir ya que la CPU principal podía conv ertirse en un cuello de botella. Multiproceso simétrico: En un sistema multiproceso simétrico, no existe una CPU controladora única. La barrera a vencer al implementar el multiproceso simétrico es que los SO tienen que ser rediseñados o diseñados desde el principio para trabajar en u n ambiente multiproceso. Las extensiones de Unix, que soportan multiproceso asimétrico ya están disponibles y las extensiones simétricas se están haciendo disponibles. Windows NT de Microsoft soporta multiproceso simétrico.

 
Multicomputadora con base de en Buses:

Es un esquema sin memoria compartida [25, Tanenbaum].
Cada cpu tiene una conexión directa con su propia memoria local.
Un problema importante es la forma en que las cpu se comuniquen entre sí.
El tráfico es solo entre una cpu y otra; el volumen de tráfico será varios órdenes de magnitud menor que si se utilizara la red de interconexión para el tráfico cpu - memoria.
Topológicamente es un esquema similar al del multiprocesador basado en un bus.
Consiste generalmente en una colección de estaciones de trabajo en una LAN (red de área local) (ver Figura 7.5 [25, Tanenbaum]). 


Multicomputadoras con Conmutador:

Cada cpu tiene acceso directo y exclusivo a su propia memoria particular [25, Tanenbaum].
Existen diversas topologías, las más comunes son la retícula y el hipercubo.
Las principales características de las retículas son:
  • Son fáciles de comprender.
  • Se basan en las tarjetas de circuitos impresos.
  • Se adecúan a problemas con una naturaleza bidimensional inherente (teoría de gráficas, visión artificial, etc.) (ver Figura 7.6 [25, Tanenbaum]). 

Las principales características del hipercubo son:
  • Es un cubo “n” - dimensional.
  • En un hipercubo de dimensión 4:
    • Se puede considerar como dos cubos ordinarios, cada uno de ellos con 8 vértices y 12 aristas.
    • Cada vértice es un cubo.
    • Cada arista es una conexión entre 2 cpu.
    • Se conectan los vértices correspondientes de cada uno de los cubos.
  • En un hipercubo de dimensión 5:
    • Se deberían añadir dos cubos conectados entre sí y conectar las aristas correspondientes en las dos mitades, y así sucesivamente.
  • En un hipercubo de “n” dimensiones:
    • Cada cpu tiene “n” conexiones con otras cpu.
    • La complejidad del cableado aumenta en proporción logarítmica con el tamaño.
    • Solo se conectan los procesadores vecinos más cercanos:
      • Muchos mensajes deben realizar varios saltos antes de llegar a su destino.
      • La trayectoria más grande crece en forma logarítmica con el tamaño:
        • En la retícula crece como la raíz cuadrada del número de cpu.
    • Con la tecnología actual ya se pueden producir hipercubos de 16.384 cpu (ver Figura 7.7 [25, Tanenbaum]).

Problemas de Sincronizacion y Concurrencia


Sincronizacion :


----- Simular con semáforos la operación de una máquina expendedora de un sólo producto. Llevar la
cuenta de los productos que quedan en la máquina y la cantidad de dinero depositada por el
cliente. Utilizar dos procesos: uno que recibe dinero y lleva el registro de la cantidad pagada, y
otro que entrega el producto y el cambio una vez que se introduce la cantidad suficiente y se
presiona el botón de la máquina. Si no se ha introducido suficiente dinero o ya no quedan
productos, la máquina no entregará el producto y devolverá la cantidad depositada.

----El Problema del Barbero Dormilón. Una barbería tiene una sala de espera con n sillas, y otra sala
donde se encuentra el sillón de afeitado. Si no hay clientes a los que servir, el barbero se echa a
dormir en el sillón. Si entra un cliente en la barbería y todas las sillas están ocupadas, el cliente se
va. Si el barbero está ocupado afeitando, el cliente se sienta en una de las sillas disponibles. Si el
barbero está dormido, el cliente despierta al barbero.
Escribir un programa en BACI que coordine al barbero y los clientes mediante semáforos.

Concurrencia

Los filósofos

 Cinco filósofos orientales dedican su existencia a meditar y comer, alternativamente. Los filósofos están sentados en torno a una mesa circular con cinco sillas, cada una de un filósofo. En el centro de la mesa hay un cuenco de arroz. En la mesa hay cinco palillos, uno a cada lado de cada filósofo (uno a su izquierda y otro a su derecha). Para comer, un filósofo necesita usar los dos palillos que tiene a cada lado. Si otro filósofo ha cogido uno de los palillos, deberá esperar a que lo deje en la mesa.
Se trata de implementar este sistema garantizando que no se producen interbloqueos. Cada filósofo será un hilo diferente.

Los fumadores

En torno a una mesa hay cuatro personas: tres fumadores y un proveedor. Cada fumador fuma cigarrillos uno detrás de otro. Para poder fumarse un cigarrillo se necesitan tres ingredientes: papel, tabaco y fósforos. Uno de los fumadores tiene papel, el otro tabaco y el otro fósforos. El proveedor tiene una cantidad infinita de los tres ingredientes.
Inicialmente, el agente coloca dos de los ingredientes en la mesa, escogidos al azar. El fumador que tiene el ingrediente que falta toma lo que hay en la mesa, lía un cigarrillo y se lo fuma. Cuando termina, se lo indica al proveedor. El proveedor entonces coloca otros dos ingredientes y el ciclo se repite una y otra vez.
Se pide construir un programa compuesto por cuatro hilos (tres fumadores y el proveedor) que estén correctamente sincronizados.
La anterior sería una modalidad muy básica del problema con la que se obtendría una calificación mínima en la práctica. Como opción adicional, se puede variar el comportamiento de los fumadores para permitir una mayor concurrencia:
  • Cuando un fumador toma lo que hay en la mesa y se pone a fumar, el proveedor inmediatamente toma dos ingredientes y los coloca en la mesa. De esta forma, mientras un fumador está fumando, se da la posibilidad de que otro fumador pueda tomar la pareja de ingredientes que hay en la mesa y así lleguemos a tener varios fumadores al mismo tiempo. (Aunque esto no ocurrirá si el proveedor coloca justo el par de ingredientes que no le sirven a los fumadores en espera, pero eso depende del azar).

La Sincronización y La Exclusión Mutua

Históricamente los lenguajes de programación concurrente y Las APIs de los sistemas operativos ofrecen un conjunto de primitivas que facilitan la interacción entre procesos de forma sencilla y eficiente.

Estas primitivas deben hacer posible:

- Sincronización: Un proceso tiene acceso al estado de flujo de control que en ese instante tiene otro proceso.

- Exclusión mutua: Garantiza que mientras que un proceso accede a un recurso o actualiza una variables compartida, ningún otro proceso accede al mismo recurso o a la variable compartida.

- Sincronización condicional: Garantiza que un recurso sólo es accedido cuando se encuentra en un determinado estado interno.

Concurrencia y Sincronizacion

La concurrencia comprende un gran número de cuestiones de diseño, incluyendo la comunicación entre procesos, comparición y competencia por los recursos, sincronización de la ejecución de varios procesos y asignación del tiempo de procesador a los procesos y es fundamental para que existan diseños como Multiprogramación, Multiproceso y Proceso distribuido
Los procesos son concurrentes si existen simultáneamente. Cuando dos o más procesos llegan al mismo tiempo a ejecutarse, se dice que se ha presentado una concurrencia de procesos. Es importante mencionar que para que dos o más procesos sean concurrentes, es necesario que tengan alguna relación entre ellos
La concurrencia puede presentarse en tres contextos diferentes:

• Varias aplicaciones: La multiprogramación se creó para permitir que el tiempo de procesador de la máquina fuese compartido dinámicamente entre varios trabajos o aplicaciones activas.

• Aplicaciones estructuradas: Como ampliación de los principios 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 programadores de sistemas y se ha comprobado que algunos sistemas operativos están implementados como un conjunto de procesos.

Existen tres modelos de computadora en los que se pueden ejecutar procesos concurrentes:
• Multiprogramación con un único procesador. El sistema operativo se encarga de ir repartiendo el tiempo del procesador entre los distintos procesos, intercalando la ejecución de los mismos para dar así una apariencia de ejecución simultánea.

• Multiprocesador. Es una maquina formada por un conjunto de procesadores que comparten memoria principal. En este tipo de arquitecturas, los procesos concurrentes no sólo pueden intercalar su ejecución sino también superponerla.

• Multicomputadora. Es una maquina de memoria distribuida, que está formada por una serie de computadoras. En este tipo de arquitecturas también es posible la ejecución simultánea de los procesos sobre los diferentes procesadores.

En general, la concurrencia será aparente siempre que el número de procesos sea mayor que el de procesadores disponibles, es decir, cuando haya más de un proceso por procesador. La concurrencia será real cuando haya un proceso por procesador. Aunque puede parecer que la intercalación y la superposición de la ejecución de procesos presentan formas de ejecución distintas, se verá que ambas pueden contemplase como ejemplos de procesos concurrentes
Existen diversas razones que motivan la ejecución de procesos concurrentes en un sistema:
• Facilita la programación de aplicaciones al permitir que éstas se estructuren como un conjunto de procesos que cooperan entre sí para alcanzar un objetivo común.

• Acelera los cálculos. Si se quiere que una tarea se ejecute con mayor rapidez, lo que se puede hacer es dividirla en procesos, cada uno de los cuales se ejecuta en paralelo con los demás.

• Posibilita el uso interactivo a múltiples usuarios que trabajan de forma simultánea.

• Permite un mejor aprovechamiento de los recursos, en especial de la CPU, ya que pueden aprovechar las fases de entrada-salida de unos procesos para realizar las fases de procesamiento de otros.

Así como existen las razones que motivan la ejecución de procesos concurrentes, también existen sus contras:
• Inanición e interrupción de procesos

• Ocurrencia de bloqueos

• Que dos o mas procesos requieran el mismo recurso (No apropiativo)

Tipos de procesos concurrentes.
Los procesos que ejecutan de forma concurrente en un sistema se pueden clasificar como:
Proceso independiente: Es aquel que ejecuta sin requerir la ayuda o cooperación de otros procesos. Un claro ejemplo de procesos independientes son los diferentes shells que se ejecutan de forma simultánea en un sistema.
Procesos son cooperantes: Son aquellos que están diseñados para trabajar conjuntamente en alguna actividad, para lo que deben ser capaces de comunicarse e interactuar entre ellos.
En ambos tipos de procesos (independientes y cooperantes), puede producirse una serie de interacciones entre ellos y pueden ser de dos tipos:
• Interacciones motivadas porque los procesos comparten o compiten por el acceso a recursos físicos o lógicos. Por ejemplo, dos procesos independientes compiten por el acceso a disco o para modificar una base de datos.

• Interacción motivada porque los procesos se comunican y sincronizan entre sí para alcanzar un objetivo común, Por ejemplo, un compilador que tiene varios procesos que trabajan conjuntamente para obtener un solo archivo de salida.

Elementos a gestionar y diseñar a causa de la concurrencia.
Se pueden enumerar los siguientes:
1. El sistema operativo debe ser capaz de seguir la pista de los distintos procesos activos. Esto lo hace por medio de PBC’s (Bloque de Control de Procesos)

2. El sistema operativo debe asignar y quitar los distintos recursos a cada proceso activo. Entre estos recursos se incluyen:
• Tiempo de procesador: Es función de la planificación.
• Memoria: La mayoría de los sistemas operativos emplean esquemas de memoria virtual.
• Archivos:
• Dispositivos de E/S:
3. El sistema operativo debe proteger los datos y los recursos físicos de cada proceso contra injerencias no intencionadas de otros procesos.

4. Los resultados de un proceso deben ser independientes de la velocidad relativa a la que se realiza la ejecución con respecto a otros procesos concurrentes.


*Instituto tecnológico de Celaya, Sistemas operativos unidad III,

Procesos Ligeros o Hebras

El concepto de proceso engloba dos conceptos separados y potencialmente independientes: uno relativo a la propiedad de recursos y otro que hace referencia a la ejecución.
Unidad que posee recursos: A un proceso se le asigna un espacio de memoria y, de tanto en tanto, se le puede asignar otros recursos como dispositivos de E/S o ficheros.
Unidad a la que se le asigna el procesador: Un proceso es un flujo de ejecución (una traza) a través de uno o más programas. Esta ejecución se entremezcla con la de otros procesos. De tal forma, que un proceso tiene un estado (en ejecución, listo, etc) y una prioridad de expedición u origen. La unidad planificada y expedida por el sistema operativo es el proceso.
En la mayoría de los sistemas operativos, estas dos características son, de hecho, la esencia de un proceso. Sin embargo, son independientes, y pueden ser tratadas como tales por el sistema operativo. Esta distinción ha conducido en los sistemas operativos actuales a desarrollar la construcción conocida como thread, cuyas traducciones más frecuentes son hilo, hebra y proceso ligero. Si se tiene esta división de características, la unidad de asignación de la CPU se conoce como hilo, mientras que a la unidad que posee recursos se le llama proceso.
Dentro de un proceso puede haber uno o más hilos de control cada uno con:
· Un estado de ejecución (en ejecución, listo, bloqueado).
· Un contexto de procesador, que se salva cuando no esté ejecutándose.
· Una pila de ejecución.
· Algún almacenamiento estático para variables locales.
· Acceso a la memoria y a los recursos de ese trabajo que comparte con los otros hilos.
Los beneficios clave de los hilos se derivan de las implicaciones del rendimiento: se tarda menos tiempo en crear un nuevo hilo de un proceso que ya existe, en terminarlo, y en hacer un cambio de contexto entre hilos de un mismo proceso. Al someter a un mismo proceso a varios flujos de ejecución se mantiene una única copia en memoria del código, y no varias.
Un ejemplo de aplicación que podría hacer uso de los hilos es un servidor de ficheros de una red de área local. Cada vez que llega una solicitud de una operación sobre un fichero, se puede generar un nuevo hilo para su gestión. El servidor gestiona multitud de solicitudes, por tanto, se pueden crear y destruir muchos hilos en poco tiempo para dar servicio a estas peticiones. Si el servidor es un multiprocesador, se pueden ejecutar varios hilos de un mismo proceso simultáneamente y en diferentes procesadores.[1]

Un proceso ligero (thread o hebra) es un programa en ejecución que comparte la imagen de la memoria y otras informaciones con otros procesos ligeros.


Figura 1 Procesos ligeros

Es una unidad básica de utilización de la CPU consistente en un juego de registros y un espacio de pila. Comparte el código, los datos y los recursos con sus hebras pares

Una tarea (o proceso pesado) está formada ahora por una o más hebras

Una hebra sólo puede pertenecer a una tarea

 Figura 2 Tareas con una y varias hebras

CARACTERISTICAS


Se comparten recursos. La compartición de la memoria permite a las hebras pares comunicarse sin usar ningún mecanismo de comunicación inter-proceso del SO.

La conmutación de contexto es más rápida gracias al extenso compartir de recursos

No hay protección entre las hebras. Una hebra puede escribir en la pila de otra hebra del mismo proceso

Estado de los procesos ligeros


Un proceso ligero puede estar ejecutando, listo o bloqueado.

   
Figura 3 Estados de los Procesos ligeros


Paralelismo
Los procesos ligeros permiten paralelizar una aplicación.[2]





Figura 4 Paralelismo

[1] Milenkovic M. (1994). Sistemas Operativos. Conceptos y Diseño, 2ª Edición, McGraw-Hill.
Stallings, W. (1993).Computer Organization and Architecture, 3ª Edición. New York: Macmillan.
[2] HILOS (THREAD) (n.d.). Extraído el 24 de octubre de 2008 desde http://xue.unalmed.edu.co/~gsanchez/downloads/hilos.pdf