Inicio / Wikis / Tutoriales / Dentro del núcleo Linux 2.4 - Operaciones Atómicas

Dentro del núcleo Linux 2.4 - Operaciones Atómicas

(4 opiniones)
14 de Febrero de 2006
Linux

18 - Operaciones Atómicas

Hay dos tipos de operaciones atómicas: bitmaps (mapas de bits) y atomic_t. Los bitmaps son muy convenientes para mantener un concepto de unidades "asignadas" o "libres" para alguna colección grande donde cada unidad es identificada por algún número, por ejemplo tres inodos o tres bloques. Son ampliamente usados para un simple cierre, por ejemplo para suministrar acceso exclusivo para abrir un dispositivo. Un ejemplo de esto puede ser encontrado en arch/i386/kernel/microcode.c:



/*
* Bits en microcode_status. (31 bits de espacio para una futura expansión)
*/
#define MICROCODE_IS_OPEN 0 /* establece si el dispositivo está en uso */

static unsigned long microcode_status;




No hay necesidad de inicializar microcode_status a 0 ya que BSS es limpiado a cero explícitamente bajo Linux.



/*
* Forzamos a un sólo usuario a la vez aquí con open/close.
*/
static int microcode_open(struct inode *inode, struct file *file)
{
if (!capable(CAP_SYS_RAWIO))
return -EPERM;

/* uno de cada vez, por favor */
if (test_and_set_bit(MICROCODE_IS_OPEN, &microcode_status))
return -EBUSY;

MOD_INC_USE_COUNT;
return 0;
}




Las operaciones en los bitmaps son:

  • void set_bit(int nr, volatile void *addr): establece el bit nr en el bitmap apuntado por addr.
  • void clear_bit(int nr, volatile void *addr): limpia el bit nr en el bitmap apuntado por addr.
  • void change_bit(int nr, volatile void *addr): cambia el bit nr (si está establecido limpia, si está limpio establece) en en el bitmap apuntado por addr.
  • int test_and_set_bit(int nr, volatile void *addr): atómicamente establece el bit nr y devuelve el viejo valor del bit.
  • int test_and_clear_bit(int nr, volatile void *addr): atómicamente limpia el bit nr y devuelve el viejo valor del bit.
  • int test_and_change_bit(int nr, volatile void *addr): atómicamente cambia el bit nr y devuelve el viejo valor del bit.

Estas operaciones usan la macro LOCK_PREFIX, la cual en núcleos SMP evalúa la instrucción prefijo de cierre del bus y no hace nada en UP. Esto garantiza la atomicidad del acceso en el entorno SMP.

A veces las manipulaciones de bits no son convenientes, pero en cambio necesitamos realizar operaciones aritméticas - suma, resta, incremento decremento. Los casos típicos son cuentas de referencia (ej. para los inodos). Esta facilidad es suministrada por el tipo de datos atomic_t y las siguientes operaciones:

  • atomic_read(&v): lee el valor de la variable atomic_t v.
  • atomic_set(&v, i): establece el valor de la variable atomic_t v al entero i.
  • void atomic_add(int i, volatile atomic_t *v): suma un entero i al valor de la variable atómica apuntado por v.
  • void atomic_sub(int i, volatile atomic_t *v): resta el entero i del valor de la variable atómica apuntada por v.
  • int atomic_sub_and_test(int i, volatile atomic_t *v): resta el entero i del valor de la variable atómica apuntada por v; devuelve 1 si el nuevo valor es 0, devuelve 0 en otro caso.
  • void atomic_inc(volatile atomic_t *v): incrementa el valor en 1.
  • void atomic_dec(volatile atomic_t *v): decrementa el valor en 1.
  • int atomic_dec_and_test(volatile atomic_t *v): decrementa el valor; devuelve 1 si el nuevo valor es 0, devuelve 0 en otro caso.
  • int atomic_inc_and_test(volatile atomic_t *v): incrementa el valor; devuelve 1 si el nuevo valor es 0, devuelve 0 en otro caso.
  • int atomic_add_negative(int i, volatile atomic_t *v): suma el valor de i a v y devuelve 1 si el resultado es negativo. Devuelve 0 si el resultado es mayor o igual a 0. Esta operación es usada para implementar semáforos.
Valora este capítulo: (4 opiniones)
Autor y licencia de 'Dentro del núcleo Linux 2.4 - Operaciones Atómicas'
Tigran Aivazian Extraído de: http://es.tldp.org/Manuales-LuCAS/DENTRO-NUCLEO-LINUX/dentro-nucleo-linux-html/ GNU Free Documentation License
Licencia GNU Free Documentation License: http://www.es.gnu.org/licencias/fdles.html
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.

Opiniona sobre 'Dentro del núcleo Linux 2.4 - Operaciones Atómicas' (4)

Tu nombre debe tener tres caracteres como mínimo.
Es necesario que te des de alta con una cuenta de correo válida.
Es necesario que te des de alta con una cuenta de correo válida.
El contenido del título de tu opinión debe tener tres caracteres como mínimo.
Es obligatorio que selecciones una valoración del recurso.
El contenido del comentario de tu opinión debe tener tres caracteres como mínimo.

Opina sobre este tutorial



* Valoración:
* Nombre:
* Correo electrónico:
* Título:
* Comentario:

Wikis relacionados con 'Dentro del núcleo Linux 2.4 - Operaciones Atómicas'

la Administración de Operaciones es el área de la Administración de Empresas dedicada tanto a... Más »
Este documento describe cómo hacer el enmascarado (masqueradinq), proxy transparente, reenvío de puertos (port forwarding),... Más »
La fijación de precios está convirtiéndose en un modo de vida para muchos minoristas y... Más »
En este documento se presenta la información acerca de la instalación, configuración, ejecución y mantenimiento... Más »
Esta es la primerísima edición del Linux en Castellano COMO. La audiencia a la que... Más »
¿Estás seguro de que deseas eliminar este capítulo?