martes, 24 de octubre de 2017

3.4 ADMINISTRACIÓN DE MEMORIA VIRTUAL

ADMINISTRACIÓN MEMORIA VIRTUAL
La clave del concepto de memoria (almacenamiento) virtual esta en la disociación:

  • De las direcciones a las que hace referencia un programa.
  • De las direcciones disponibles en la memoria real (almacenamiento primario).
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.

Para obtener un rendimiento optimo, la pagina que se debe reemplazar es aquella que tardara mas tiempo en ser utilizada.

 Esta estrategia optima de reemplazo se denomina OPT o MIN.
Es una tecnica sencilla. Todas las paginas que se encuentran en el almacenamiento principal tienen la misma probabilidad de ser elegidas para el reemplazo.
 Esta estrategia podria seleccionar cualquier pagina para ser reemplazada, incluyendo la siguiente pagina la que se hara referencia. Las decisiones de reemplazo aleatorio se de paginas se pueden tomar rapidamente y con un numero significativo de marcos de pagina. Es un esquema que casi no se utiliza por su enfoque aleatorio de acertar o errar.

Cada pagina se registra en el instante que entro en el almacenamiento primario. Cuando se necesita reemplazar una pagina, se escoge la que ha permanecido en el almacenamiento durante el mayor tiempo.
Belady, Nelson y Shelder descubrieron que al utilizar el reemplazo de paginas PEPS, ciertos patrones de referencia a pagina originan mas fallas de paginas cuando aumenta el numero de marcos de pagina asignados a un proceso. Este fenomeno se denomina Anomalia PEPS o anomalia Belady. La columna de la izquierda indica el patron de referencias a paginas de un proceso. La primera tabla muestra como dicho patron a referencia de paginas hace que las paginas se carguen a memoria y se reemplacen en secuencia PEPS cuando se asignan tres marcos de paginas a proceso.

Mientras el proceso se ejecuta con sus páginas actuales, el sistema carga las demás páginas que estarán disponibles cuando las requiera el proceso.
Estrategias de Obtención
Determinan cuando se debe de transferir una pagina o un segmento de almacenamiento secundario al primario. Las estrategias de obtencion por demanda esperan a que un proceso en ejecucion haga referencia a una pagina o un segmento antes de traer la pagina o el segmento de almacenamiento primario. Los esquemas de obtencion anticipada intentan determinar por adelantado a cuales paginas o segmentos hara referencia un proceso.
Estrategias de Colocación
 Determinan en que lugar del almacenamiento primario se debe colocar una pagina o un segmento entrante. Una pagina entrante se puede colocar en cualquier marco de pagina disponible.
Estrategias de Reemplazo
Sirven para decidir cual pagina o segmento se debe desplazar para dar espacio a una pagina o segmento entrante cuando esta completamente ocupado el almacenamiento primario.}

Las rutinas de administracion de almacenamiento del Sistema operativo deben decidir que pagina del almacenamiento primario se debe desplazar para dejar espacio a una pagina entrante . 
Principio de Optimalidad
Reemplazo de Páginas aleatorio
Reemplazo de páginas de primeras entradas-primeras salidas (PEPS)
Anomalias PEPS


3.3 ORGANIZACIÓN DE LA MEMORIA VIRTUAL

MEMORIA VIRTUAL
La memoria virtual es una técnica para proporcionar la simulación de un espacio de memoria mucho mayor que la memoria física de una maquina.Esta ilusión permite que los programas se hagan sin tener en cuenta el tamaño exacto de la memoria física. 
La memoria virtual ha llegado a ser un componente esencial de la mayoría de los S.O actuales. Y como en un instante dado, en la memoria solo se tienen unos pocos fragmentos de un proceso dado, se pueden mantener mas procesos en la memoria.





Esta tecnología apareció en 1960 en la Universidad de Manchester (Inglaterra), en el sistema “Atlas”. 
Los métodos más comunes de implantación son mediante:


  • Técnicas de “paginación”.

      • Técnicas de “segmentación”.
      • Una combinación de ambas técnicas.
      La evolución en las organizaciones de almacenamiento puede resumirse como sigue:
      • Real:
      • Sistemas dedicados a un solo usuario.
      • Real:
      • Sistemas de multiprogramación en memoria real:
      • Multiprogramación en partición fija:
      • Absoluta.
      • Relocalizable (reubicadle).
      • Multiprogramación en partición variable.
      • Virtual:
      • Multiprogramación en almacenamiento virtual:
      • Paginación pura.
      • Segmentación pura.
      • Combinación paginación / segmentación.


       La segmentación permite al programador contemplar la memoria como si constara de varios espacios de direcciones o segmentos. Los segmentos pueden ser de distintos tamaños, incluso de forma dinámica. Las referencias a la memoria constan de una dirección de la forma (numero de segmento, desplazamiento). 
      La segmentación permite al programador contemplar la memoria como si constara de varios espacios de direcciones o segmentos. Los segmentos pueden ser de distintos tamaños, incluso de forma dinámica. Las referencias a la memoria constan de una dirección de la forma (numero de segmento, desplazamiento). La segmentación permite al programador contemplar la memoria como si constara de varios espacios de direcciones o segmentos. Los segmentos pueden ser de distintos tamaños, incluso de forma dinámica. Las referencias a la memoria constan de una dirección de la forma (numero de segmento, desplazamiento). 
      1. Simplifica la gestión de estructuras de datos crecientes. Si el programador no conoce a priori cuan larga puede llegar a ser una estructura de datos determinada, es necesario suponerlo a menos que se permitan tamaños de segmentos dinámicos. Con memoria virtual segmentada, a la estructura de datos se le puede asignar a su propio segmento y el S.O expandirá o reducirá el segmento cuando se necesite.
      2. Permite modificar y recopilar los programas independientemente, sin que sea necesario recopilar o volver a montar el conjunto de programas por completo.
      3. Se presta a la comparición entre procesos. Un programador puede situar un programa de utilidades o una tabla de datos en un segmento que puede ser referenciado por otros procesos.
      4. Se presta a la protección. Puesto que un segmento puede ser construido para albergar un conjunto de procedimientos y datos bien definido, el programador o el administrador del sistema podrán asignar los permisos de acceso de la forma adecuada.
      En el estudio de la segmentación simple, se llego a la conclusión de que cada proceso tiene su propia tabla de segmento y que, cuando todos los segmentos se encuentran en la memoria principal, la tabla de segmentos del proceso se crea y se carga en la memoria. Cada entrada de la tabla contiene la dirección de comienzo del segmento correspondiente de la memoria principal, así como su longitud. La misma estructura se necesitara al hablar de un esquema de memoria virtual basado en la segmentación donde las entradas de la tabla de segmentos pasan a ser mas complejas. 
      Otro bit de control necesario en la entrada de la tabla de segmentos es un bit de modificación que indique si el contenido del segmento correspondiente ha sido modificado desde que se cargo por última vez en la memoria principal. Si no ha habido cambios, no será necesario escribir en el disco el segmento cuando llegue el momento de reemplazarlo en el espacio que ocupa actualmente.

      Otro bit de control necesario en la entrada de la tabla de segmentos es un bit de modificación que indique si el contenido del segmento correspondiente ha sido modificado desde que se cargo por última vez en la memoria principal. Si no ha habido cambios, no será necesario escribir en el disco el segmento cuando llegue el momento de reemplazarlo en el espacio que ocupa actualmente.

      La memoria virtual también simplifica la carga del programa para su ejecución llamado reubicación, este procedimiento permite que el mismo programa se ejecute en cualquier posición de la memoria física. 

      Almacenamiento virtual "significa la capacidad de direccional un espacio de almacenamiento mucho mayor que el disponible en el almacenamiento primario de determinado sistema de computación” . 
      Las direcciones generadas por los programas en su ejecución no son, necesariamente, aquellas contenidas en el almacenamiento primario (memoria real), ya que las direcciones virtuales suelen seleccionarse dentro de un numero mucho mayor de direcciones que las disponibles dentro del almacenamiento primario. 
      Implicaciones de la memoria virtual 
      Esta organización ofrece al programador varias ventajas sobre un espacio de direcciones no segmentado:
      Organización 
      Puesto que solo algunos de los segmentos de un proceso estarán en la memoria principal, se necesita un bit en cada entrada de la tabla de segmentos para indicar si el segmento correspondiente esta presente en la memoria principal. Si el bit indica que el segmento esta en la memoria, la entrada incluye también la dirección de comienzo y la longitud del segmento.




      3.2 MEMORIA REAL

      La memoria real o principal es en donde son ejecutados los programas y procesos de una computadora y es el espacio real que existe en memoria para que se ejecuten los procesos. 
      Por lo general esta memoria es de mayor costo que la memoria secundaria, pero el acceso a la información contenida en ella es de mas rápido acceso. 

           
              Los términos “memoria” “almacenamiento” se consideran equivalentes. 
              Los programas y datos deben estar en el almacenamiento principal para:
      • Poderlos ejecutar.
      • Referenciarlos directamente





       Solo la memoria cache es mas rápida que la principal, pero su costo es a su vez mayor.
      Cuando no existe memoria virtual no hay diferenciación entre el espacio de direcciones y la memoria real; el espacio de direcciones que puede ser usado en los programas tiene idéntico tamaño al espacio de memoria real posible. Si se utiliza memoria virtual, el espacio de direcciones disponibles para los programas es aquel determinado por el tamaño de la memoria virtual implementada y no el espacio de direcciones provisto por la memoria real disponible (el espacio de la memoria virtual sera mayor que el de la memoria real).
      La organización y administración de la “memoria principal”“memoria primaria” “memoria real” de un sistema ha sido y es uno de los factores mas importantes en el diseño de los S. O. 

      ¿Cómo se maneja la administración de almacenamiento?

            Para que un sistema informatico sea comodo para los usuarios, el sistema operativo proporciona una ista logica y uniforme del sistema de almacenamiento de la informacion.. El sistema operativo abstrae las propiedades fisicas de los dispositivos de almacenamiento y define una unidad de almacenamiento logico, el archivo.
      El sistema operativo asigna los archivos a los soportes fisicos y accede a dichos archivos a traves de los dispositivos de almacenamiento.


      Almacenamiento del sistema de archivos


      La gestion de archivos es uno de los componentes mas visibles de un sistema operativo. Las computadores pueden almacenar la informacion en diferentes tipos de medios fisicos.Los discos magneticos, discos opticos y cintas magneticas son habituales. .
              Cada uno de estos medios tiene sus propias caracteristicas y organizacion fisica.Cada medio se controla mediante un dispositivo, tal como una unidad de disco o una cinta, que tambien tiene sus propias caracteristicas distintivas

             Estas propiedades incluyen la velocidad de acceso, la capacidad, la velocidad de transferencia de datos y el metodo de acceso (secuencial o aleatorio).
              Un archivo es una coleccion de informacion relacionada definida por su creador. Comunmente, los archivos representan programas(tanto en formato fuente como en objeto) y datos. Los archivos de datos pueden ser numericos, alfabeticos, alfanumericos o binarios. Los archivos pueden tener un formato libre(como, por ejemplo, los archivos de texto) o un formato rigido, como por ejemplo una serie de campos fijos.


      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.

      Los programas y datos necesitan estar en el almacenamiento principal para ser ejecutados o para poder hacer referencia de ellos. Los que no se necesitan de inmediato pueden guardarse en el almacenamiento secundario.

      Los recursos de memoria totales eran insuficientes para justificar algoritmos complejos, por lo que UNIX intercambiaba el contenido en memoria de los procesos.


      POLÍTICAS

      FIFO: Los procesos se despachan de acuerdo a su tiempo de llega a la cola de procesos listos, si un proceso llega al procesador sale hasta que termine. La política FIFO actualmente no se usa como el esquema principal de un sistema, pero si por ejemplo cuando se usa una política de prioridades y hay procesos con la misma prioridad, a estos se les podría aplicar FIFO.


      Round Robin: Los procesos se despachan en la forma que lo hace el FIFO, pero se les asigna una cantidad limitada de tiempo (CUANTUM) en el procesador, si no termina en ese lapso se manda al final de la lista de procesos listos.


      SJF (Shortest job first - Prioridad del trabajo mas corto): Se ejecuta primero el proceso en espera que tiene el menor tiempo estimado. SJF favorece a los procesos cortos, ya que los largos podrían llegar a rezagarse mucho tiempo e incluso nunca ejecutarse.


      SRT (Sortest remaining time scheduling – Tiempo restante más corto): En SJF una vez que un proceso comienza su ejecución continua hasta terminar. En SRT, un proceso en ejecución puede ser desposeído por uno nuevo de menor tiempo de ejecución.



      HRN: (highest response ratio next – Prioridad de la tasa de respuesta más alta): Política no apropiativa que corrige el retraso excesivo de procesos grandes que produce el SJF, para así no caer en un favoritismo excesivo por los procesos cortos, lo logra usando una formula basada en el tiempo de espera y el tiempo de servicio, con lo cual la prioridad de cada trabajo no solo esta en función del tiempo de servicio sino también del tiempo que ha esperado para ser atendido.


      UNIDAD 3: ADMINISTRACIÓN DE MEMORIA



      Analizar y aplicar las técnicas de administración de memoria y sus implicaciones en el desempeño de los sistemas operativos.

      domingo, 1 de octubre de 2017

      2.6 Técnicas De Administración del Planificador

      Cuando más de un proceso es ejecutable, el Sistema Operativo debe decidir cual de ellos debe ejecutarse en primer término. Esa parte del sistema operativo que debe de llevar a cabo esa decisión se llama planificador y el algoritmo que utiliza se llama algoritmo de planificación.

      El planificador intenta conseguir con su administración de procesos lo siguiente:

      Equidad: Garantizar que cada proceso obtenga su proporción justa de la CPU. Es decir, que ningún proceso llegue a apoderarse por completo de la CPU.
      Eficiencia: Mantener ocupada la CPU al 100 %, esto con el fin de evitar los tiempos ociosos que pueda tener el CPU.



      Rendimiento: Maximizar el número de tareas procesadas por hora, es decir, que el CPU pueda atender todos y cada una de las peticiones que le fueron hechas.
      Para garantizar que ningún proceso se ejecute un tiempo excesivo, casi todas las computadoras tienen un cronómetro electrónico o un reloj incluido, que provoca una interrupción en forma periódica. En cada interrupción del reloj, el sistema operativo logra ejecutarse y decidir si el proceso que se ejecuta en ese momento tiene permiso de continuar o si tiene el tiempo suficiente en la CPU por el momento, para después suspenderlo para que otro proceso utilice la CPU. (Stephen Degler (2003). Administración de sistemas Linux.).



      FIFO
      Mecanismo de scheduling en el cual los procesos se ordenan en una fila, en la cual se ejecutan cada uno de los procesos hasta su finalizacion secuencialmente. Es tremendamente ineficiente.
      Cuando se tiene que elegir a qué proceso asignar la CPU se escoge al que llevara más tiempo listo. El proceso se mantiene en la CPU hasta que se bloquea voluntariamente.

      Para implementar el algoritmo sólo se necesita mantener una cola con los procesos listos ordenada por tiempo de llegada. Cuando un proceso pasa de bloqueado a listo se sitúa el último de la cola.


      FIFO 
      Es el acrónimo inglés de First In, First Out (primero en entrar, primero en salir). Un sinónimo de FIFO es FCFS, acrónimo inglés de First Come First Served ( primero en llegar, primero en ser servido). Es un método utilizado en estructuras de datos, contabilidad de costes y teoría de colas.

      Guarda analogía con las personas que esperan en una cola y van siendo atendidas en el orden en que llegaron, es decir, que la primera persona que entra es la primera persona que sale.


      SJF
      El trabajo más corto primero: Llamado también SJF (Shortest Job First). Este algoritmo de planificación reduce la preferencia en favor de los procesos más largos dando más importancia a los procesos cortos, como se muestra en la figura.Esta política funciona otorgándole el procesador al proceso más corto. En general, esta política mejora el funcionamiento del sistema en términos del tiempo de respuesta, pero gran cambia demasiado cuando se trata de procesos largos.Las características de este algoritmo son las siguientes:El tiempo de espera aumenta de acuerdo con el tamaño de los procesos, pero el tiempo promedio de espera con respecto a otros algoritmos es óptimo.Es poco predecible.No es justo con los procesos largos.Tiene buen tiempo de servicio.Resulta difícil de llevarse a la práctica por los datos que necesita para realizarse la planificación.Su característica principal es que cuando se activa el planificador, éste elige el proceso de menor duración. Es decir, introduce una noción de prioridad entre procesos.La ventaja que presenta este algoritmo sobre el algoritmo FIFO es que minimiza el tiempo de finalización promedio.



      RRRound robin: Uno de los más antiguos, sencillo, justo y de uso más amplio es el round robin. Cada proceso tiene asignado un intervalo de tiempo de ejecución, llamado su quantum. Si el proceso en ejecución al final de su quantum, otro proceso se apropia de la CPU. Si el proceso esta bloqueado o a terminado antes de consumir su quantum, se altera el uso de la CPU. El Roun Robin es muy fácil de implantar. Todo lo que necesita el planificador es mantener una lista de procesos ejecutables. Cuando el quantum de un proceso se consume, se le coloca al final de la lista.


      - Planificación Round Robin.
      (a) La lista de procesos ejecutables.(b) La lista de procesos ejecutables después de agotarse el quantum B.
      El único aspecto interesante del round robin es la longitud del quantum. La alternancia entre un proceso y otro necesita cierta cantidad de tiempo para administración.

      2.5 Niveles, Objetivos y Criterios 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 más 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. O 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.

      Objetivos de la planificación

      Los objetivos de la planificación del procesador son los siguientes e involucran a los conceptos detallados seguidamente:



      Ser justa: Todos los procesos son tratados de igual manera. Ningún proceso es postergado indefinidamente.

      Maximizar la capacidad de ejecución: Maximizar el número de procesos servidos por unidad de tiempo.

      Maximizar el número de usuarios interactivos que reciban unos tiempos de respuesta aceptables: En un máximo de unos segundos.

      Ser predecible: Un trabajo dado debe ejecutarse aproximadamente en la misma cantidad de tiempo independientemente de la carga del sistema.

      Minimizar la sobrecarga: No suele considerarse un objetivo muy importante.
      Equilibrar el uso de recursos: Favorecer a los procesos que utilizarán recursos infrautilizados.

      Equilibrar respuesta y utilización: La mejor manera de garantizar buenos tiempos de respuesta es disponer de los recursos suficientes cuando se necesitan, pero la utilización total de recursos podrá ser pobre.

      Evitar la postergación indefinida: Se utiliza la estrategia del “envejecimiento” . Mientras un proceso espera por un recurso su prioridad debe aumentar, así la prioridad llegará a ser tan alta que el proceso recibirá el recurso esperado.

      Asegurar la prioridad: Los mecanismos de planificación deben favorecer a los procesos con prioridades más altas.

      Dar preferencia a los procesos que mantienen recursos claves: Un proceso de baja prioridad podría mantener un recurso clave, que puede ser requerido por un proceso de más alta prioridad.

      Dar mejor tratamiento a los procesos que muestren un “comportamiento deseable”: Un ejemplo de comportamiento deseable es una tasa baja de paginación.
      Degradarse suavemente con cargas pesadas: Un mecanismo de planificación no debe colapsar con el peso de una exigente carga del sistema. Se debe evitar una carga excesiva mediante las siguientes acciones: No permitiendo que se creen nuevos procesos cuando la carga ya es pesada. Dando servicio a la carga más pesada al proporcionar un nivel moderadamente reducido de servicio a todos los procesos.


      Criterios de planificació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.

      2.4 Concurrencia y Secuenciabilidad

      Los procesos son concurrentes si existen simultáneamente. Los procesos concurrentes pueden funcionar en forma totalmente independiente unos de otros, o pueden ser asíncronos, lo cual significa que en ocasiones requieren cierta sincronización o cooperación.

      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 como puede ser la cooperación para un determinado trabajo o el uso de información o recursos compartidos, por ejemplo: en un sistema de un procesador, la multiprogramación es una condición necesaria pero no suficiente para que exista concurrencia, ya que los procesos pueden ejecutarse de forma totalmente independiente.
      Por otro lado en un sistema de varios procesos se puede presentar la concurrencia siempre y cuando las actividades necesiten actuar entre sí ya sea para utilizar información en común o para cualquier otra cosa.
      - Beneficios de la concurrencia- Trata de evitar los tiempos muertos de la UCP- Comparte y optimiza el uso de recursos- Permite la modularidad en las diferentes etapas del proceso- Acelera los cálculos- Da mayor comodidad


      Desventajas de la concurrencia

      · Inanición e interrupción de procesos· Ocurrencia de bloqueos· Que dos o más procesos requieran el mismo recurso (no apropiativo)
      En muchos casos, los procesos se reúnen para realizar tareas en conjunto, a este tipo de relación se le llama procesos cooperativos. Para lograr la comunicación, los procesos deben sincronizarse, de no ser así pueden ocurrir problemas no deseados. La sincronización es la transmisión y recepción de señales que tiene por objeto llevar a cabo el trabajo de un grupo de procesos cooperativos. Es la coordinación y cooperación de un conjunto de procesos para asegurar la comparación de recursos de cómputo. La sincronización entre procesos es necesaria para prevenir y/o corregir errores de sincronización debidos al acceso concurrente a recursos compartidos, tales como estructuras de datos o dispositivos de E/S, de procesos contendientes.

      La sincronización entre procesos también permite intercambiar señales de tiempo (ARRANQUE/PARADA) entre procesos cooperantes para garantizar las relaciones específicas de precedencia impuestas por el problema que se resuelve. Sin una sincronización adecuada entre procesos, la actualización de variables compartidas puede inducir a errores de tiempo relacionados con la concurrencia que son con frecuencia difíciles de depurar. Una de las causas principales de este problema es que procesos concurrentes puedan observar valores temporalmente inconsistentes de una variable compartida mientras se actualizan. una aproximación para resolver este problema es realizar actualizaciones de variables compartidas de manera mutuamente exclusiva. Se pueden mejorar permitiendo que a lo más un proceso entre a la vez en la sección crítica de código en la que se actualiza una variable compartida o estructura de datos en particular.

      2.3 Procesos ligeros: hilos o hebras

      Un hilo de ejecución, hebra o subproceso es la unidad de procesamiento más pequeña que puede ser planificada por un sistema operativo.

      La creación de un nuevo hilo es una característica que permite a una aplicación realizar varias tareas a la vez (concurrentemente). Los distintos hilos de ejecución comparten una serie de recursos tales como el espacio de memoria, los archivos abiertos, situación de autenticación, etc. Esta técnica permite simplificar el diseño de una aplicación que debe llevar a cabo distintas funciones simultáneamente.

      Un hilo es simplemente una tarea que puede ser ejecutada al mismo tiempo con otra tarea.

      Los hilos de ejecución que comparten los mismos recursos, sumados a estos recursos, son en conjunto conocidos como un proceso. El hecho de que los hilos de ejecución de un mismo proceso compartan los recursos hace que cualquiera de estos hilos pueda modificar éstos. Cuando un hilo modifica un dato en la memoria, los otros hilos acceden a ese dato modificado inmediatamente.

      Lo que es propio de cada hilo es el contador de programa, la pila de ejecución y el estado de la CPU (incluyendo el valor de los registros).

      El proceso sigue en ejecución mientras al menos uno de sus hilos de ejecución siga activo. Cuando el proceso finaliza, todos sus hilos de ejecución también han terminado. Asimismo en el momento en el que todos los hilos de ejecución finalizan, el proceso no existe más y todos sus recursos son liberados.
      Algunos lenguajes de programación tienen características de diseño expresamente creadas para permitir a los programadores lidiar con hilos de ejecución (como Java o Delphi). Otros (la mayoría) desconocen la existencia de hilos de ejecución y éstos deben ser creados mediante llamadas de biblioteca especiales que dependen del sistema operativo en el que estos lenguajes están siendo utilizados (como es el caso del C y del C++).


      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 de manera más ágil a la interacción con el usuario. También pueden ser utilizados por una aplicación servidora para dar servicio a múltiples clientes.
      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 de forma directa. En muchos de los sistemas operativos que dan facilidades a 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 contexto (context switch), en este caso pasar del estado de ejecución (running) al estado de espera (waiting) y colocar el nuevo proceso en ejecución. En los hilos, como pertenecen a un mismo proceso, al realizar un cambio de hilo el tiempo perdido es casi despreciable.
      Al igual que los procesos, los hilos poseen un estado de ejecución y pueden sincronizarse entre ellos para evitar problemas de compartimiento de recursos. Generalmente, cada hilo tiene una tarea específica y determinada, como forma de aumentar la eficiencia del uso del procesador.



      Estados de un hilo
      Los principales estados de los hilos son: Ejecución, Listo y Bloqueado. No tiene sentido asociar estados de suspensión de hilos ya que es un concepto de proceso. En todo caso, si un proceso está expulsado de la memoria principal (RAM), todos sus hilos deberán estarlo ya que todos comparten el espacio de direcciones del proceso.


      Cambio de estados.
      Creación: Cuando se crea un proceso se crea un hilo para ese proceso. Luego, este hilo puede crear otros hilos dentro del mismo proceso, proporcionando un puntero de instrucción y los argumentos del nuevo hilo. El hilo tendrá su propio contexto y su propio espacio de la columna, y pasará al final de los Listos.

      Bloqueo: Cuando un hilo necesita esperar por un suceso, se bloquea (salvando sus registros de usuario, contador de programa y punteros de pila). Ahora el procesador podrá pasar a ejecutar otro hilo que esté en la final de los Listos mientras el anterior permanece bloqueado.

      Desbloqueo: Cuando el suceso por el que el hilo se bloqueó se produce, el mismo pasa a la final de los Listos.

      Terminación: Cuando un hilo finaliza se liberan tanto su contexto como sus columnas.
      Ventajas de los hilos contra procesos.

      Si bien los hilos son generados a partir de la creación de un proceso, podemos decir que un proceso es un hilo de ejecución, conocido como Monohilo. Pero las ventajas de los hilos se dan cuando hablamos de Multihilos, que es ccu8nuando un proceso tiene múltiples hilos de ejecución los cuales realizan actividades distintas, que pueden o no ser cooperativas entre sí. Los beneficios de los hilos se derivan de las implicaciones de rendimiento.
      Se tarda mucho menos tiempo en crear un hilo nuevo en un proceso existente que en crear un proceso. Algunas investigaciones llevan al resultado que esto es así en un factor de 10.
      Se tarda mucho menos en terminar un hilo que un proceso, ya que cuando se elimina un proceso se debe eliminar el BCP1 del mismo, mientras que un hilo se elimina su contexto y pila.
      Se tarda mucho menos tiempo en cambiar entre dos hilos de un mismo proceso
      Los hilos aumentan la eficiencia de la comunicación entre programas en ejecución. En la mayoría de los sistemas en la comunicación entre procesos debe intervenir el núcleo para ofrecer protección de los recursos y realizar la comunicación misma. En cambio, entre hilos pueden comunicarse entre sí sin la invocación al núcleo. Por lo tanto, si hay una aplicación que debe implementarse como un conjunto de unidades de ejecución relacionadas, es más eficiente hacerlo con una colección de hilos que con una colección de procesos separados.|                          


      Sincronización de hilos
      Todos los hilos comparten el mismo espacio de direcciones y otros recursos como pueden ser archivos abiertos. Cualquier modificación de un recurso desde un hilo afecta al entorno del resto de los hilos del mismo proceso. Por lo tanto, es necesario sincronizar la actividad de los distintos hilos para que no interfieran unos con otros o corrompan estructuras de datos.

      Una ventaja de la programación multihilo es que los programas operan con mayor velocidad en sistemas de computadores con múltiples CPUS (sistemas multiprocesador o a través de grupo de máquinas) ya que los hilos del programa se prestan verdaderamente para la ejecución concurrente. En tal caso el programador necesita ser cuidadoso para evitar condiciones de carrera (problema que sucede cuando diferentes hilos o procesos alteran datos que otros también están usando), y otros comportamientos no intuitivos. Los hilos generalmente requieren reunirse para procesar los datos en el orden correcto. Es posible que los hilos requieran de operaciones atómicas para impedir que los datos comunes sean cambiados o leídos mientras estén siendo modificados, para lo que usualmente se utilizan los semáforos. El descuido de esto puede generar interbloqueo.