En contraste con los algoritmos que protegen el acceso a los datos compartidos con las cerraduras, el cerradura-libre y los algoritmos esperar-libres se diseñan especialmente permitir que los hilos de rosca múltiples lean y escriban datos compartidos concurrentemente sin la corrupción de él. " Cerradura-free" refiere al hecho de que un hilo de rosca no puede trabarse para arriba: cada medida que toma trae progreso al sistema. Esto significa que ningunos primitivos de la sincronización tales como mutexes o semáforos pueden estar implicados, mientras que un hilo de rosca de la cerradura-tenencia puede prevenir progreso global si se cambia hacia fuera. " Esperar-free" refiere al hecho de que un hilo de rosca puede terminar cualquier operación en un número finito de pasos, sin importar las acciones de otros hilos de rosca. Todos los algoritmos esperar-libres son cerradura-libres, pero el revés no es necesario verdad.

Motivación

El acercamiento tradicional a la programación con hilos múltiples es utilizar las cerraduras para sincronizar el acceso a los recursos compartidos. Los primitivos de la sincronización tales como mutexes, semáforos, y secciones críticas son todos los mecanismos por los cuales un programador puede asegurarse de que ciertas secciones del código no ejecuten concurrentemente si hizo tan corrompería las estructuras de memoria compartida. Si un hilo de rosca intenta adquirir una cerradura que sea sostenida ya por otro hilo de rosca, el hilo de rosca bloqueará hasta que la cerradura esté libre.

El bloqueo de un hilo de rosca es indeseable por muchas razones. Una razón obvia es que mientras que se bloquea el hilo de rosca, no puede lograr cualquier cosa. Si el hilo de rosca bloqueado está realizando una tarea en tiempo real prioritaria o, es alto - undesirable para parar su progreso. Otros problemas son menos obvios. Ciertas interacciones entre las cerraduras pueden llevar a las condiciones de error tales como callejón sin salida, Livelock, e inversión de la prioridad. Usar las cerraduras también implica una compensación entre la fijación de grano grueso que puede reducir perceptiblemente las oportunidades para el paralelismo, y la fijación de grano fino que requiere un diseño más cuidadoso y es insectos más propensos.

El acercamiento cerradura-libre

La escritura de un programa que utilice las estructuras de datos cerradura-libres no es algo fácil simplemente de reescribir los algoritmos que usted protegería normalmente con un mutex para ser cerradura-libre. Porque los algoritmos cerradura-libres son tan difíciles de escribir, el foco de los investigadores en versiones cerradura-libres de la escritura de las estructuras de datos básicas tal como apila los sistemas de las coletas del y las tablas de elección arbitraria éstos permiten programas fácilmente a los datos de intercambio entre los hilos de rosca asincrónico.

Por ejemplo, considerar un programa de las actividades bancarias donde cada hilo de rosca representa una caja virtual . Un acercamiento cerradura-basado a hacer un depósito podría ser tener una cerradura de la caja una cuenta para hacer un depósito, de modo que dos cajas no intenten depositar en la misma cuenta simultáneamente. Para hacer el cerradura-libre de proceso, algo que diseñando un " cerradura-libre; deposit" algoritmo usted puede ser que tenga el cajero someter un " " del depósito ; petición asincrónico a un hilo de rosca centralizado que manejó todos los depósitos.

El ejemplo anterior es un poco engañoso. Hay definiciones formales del " del término; cerradura-free" qué intento para rechazar cualquier cosa que " looks" como una cerradura. La idea es que incluso si un hilo de rosca se estrella (o consigue soportado por algo como la inversión de la prioridad), el resto de los procesos puede todavía continuar de cierta manera. Tener un hilo de rosca centralizado fallaría probablemente esta definición (dependiendo de cómo usted define cosas, hace un proceso que someta los depósitos que nunca consiguen procesados hacen progreso?). Un acercamiento común a satisfacer la definición formal es ayuda recurrente. En el ejemplo del programa de las actividades bancarias, un acercamiento de ayuda recurrente permitiría que otros hilos de rosca terminaran el depósito de una haber parado o retardaran el hilo de rosca si conseguía de la manera de sus acciones. La ayuda recurrente de una manera acentúa el aspecto de la avería-tolerancia de la cerradura-libertad sobre el aspecto del funcionamiento.

Mientras que algunos pudieron decir que la definición formal hace no captura realmente la idea correcta (o debe tener un diverso nombre), es algo que se debe tener presente al demandar que un algoritmo es cerradura-libre.

Puesta en práctica

los algoritmos Cerradura-libres y esperar-libres se escriben usar primitivos atómicos que el hardware debe proporcionar. La persona notable de éstos es más " el compara e intercambia el " de ; (" a menudo notated; CAS"),

 CAS (addr, viejo, nuevo) = atómico     si *addr = viejo     entonces *addr: = nuevo;       de vuelta verdad     falso de vuelta otro     endif     endatomic 

El CAS toma tres discusiones: una dirección de memoria, un viejo valor, y un nuevo valor. Si la dirección contiene el viejo valor, se substituye por el nuevo valor, si no es sin cambios. Críticamente, el hardware garantiza que este " comparación y swap" la operación es el ejecutado atómico . El éxito de esta operación entonces se divulga de nuevo al programa. Esto permite que un algoritmo lea un valor de la memoria, lo modifique, y lo conteste solamente si ningún otro hilo de rosca lo modificó mientras tanto.

Por ejemplo, considerar una diversa puesta en práctica del programa de las actividades bancarias donde cada hilo de rosca representa una caja virtual. El cajero lee el valor actual de la cuenta (viejo valor), agrega una cantidad y utiliza el CAS para intentar poner al día el equilibrio de cuenta. Si ningún otro hilo de rosca ha modificado el equilibrio de cuenta en el período de intervención, el CAS tendrá éxito, y el equilibrio de cuenta será actualizado. Sin embargo, si ha ocurrido una modificación concurrente, el CAS fallará, y la caja revisará la actualización (primero trayendo el nuevo equilibrio de cuenta). Cada caja realizará esta operación del CAS en un lazo, revisando hasta que sean acertados. Este algoritmo es cerradura-libre pero esperar-no libre, puesto que otros hilos de rosca pueden guardar el escribir de nuevos valores y hacer que la caja fall intenta otra vez indefinidamente.

Este acercamiento puede ser extendido usar una construcción universal, debido a Herlihy (http://cs.edu/people/mph/Herlihy91/p124-herlihy.pdf), a cualquie estructura de datos. Cuál es esencialmente que la estructura de datos está puesta al día de una manera puramente funcional, después comparar y el intercambio se utiliza para hacer pivotar el indicador encima a la nueva versión de la estructura de datos. Sin embargo, esto es una construcción sobre todo teórica.

Ver también

Control de concurrencia
Callejón sin salida
Cerradura (ingeniería de programas informáticos)
Barrera de la memoria
Exclusión mutua
Sincronización no bloqueando
Trabajos m3ultiple con derecho preferente
Inversión de la prioridad
Leer-copia-actualización
Hambre del recurso
Sincronización del sitio
Memoria transaccional del software

.

  • Zenithic
  • Canada Warbler
    Random links:Taladro (tela) | Prados de Pitt, Columbia Británica | Richard Condon | Paul Cornell | Instituto de Enseñanza Superior de las montañas de Virginia

  • © 2007-2008 enciclopediaespana.com; article text available under the terms of GFDL, from en.wikipedia.org
    ="http://pagead2.googlesyndication.com/pagead/show_ads.js">