Discussion:
Exclusion mutua ???
(demasiado antiguo para responder)
Cachorro
2005-12-29 13:28:18 UTC
Permalink
Hola buenas a todos.
Estoy haciendo unas prácticas, y tengo un recurso, una cola, y un algoritmo
que trabaja sobre esa cola eligiendo un elemento de ella de una forma mas o
menos rocambolesca.

Lo que intento es que cuando el algoritmo trabaja sobre esa cola poder
garantizar que ningún otro proceso, o cualquier infortunio, interfiera,
"quiero garantizar la exclusión mutua".

funcion{
//inicio seccion critica
//codigo rocambolesco
//fin seccion critica
}

Estube mirando documentación algún que otro libro y buscando por google, y
tenia pensado hacerlo mediante mutex, pero para nada me aclare :(

Así que agradecería fuentes de información y si a alguno se le ocurre alguna
forma mejor pues que no se corte :).


Un saludo Kachorro
PD Felices fiestasss!!!!!
heltena
2005-12-29 17:29:54 UTC
Permalink
Esto es una pregunta para un grupo de sistemas operativos (o de linux,
o de unix, o de windows, o de bsd, o de mac, o ...). Cada uno
implementa las secciones críticas como más le place, aunque tienes
los sistemas POSIX que es un poco estandar (y Windows no lo implementa
por sí solo).

Debes tener claro si son procesos o hilos de ejecución los que te
piden el recurso (mírate los apuntes de clase).

Si quieres hacerlo a lo bruto, abre un fichero y si no te deja es que
el otro proceso ya lo tiene abierto (ojo, debes abrirlo de manera
exclusiva). Creo que esta opción la valorará muy mal tu profesor.

Para dar una IDEA (el codigo no lo he probado, lo he escrito
on-the-fly) debería ser algo así:

Windows:
HANDLE hMutex;

if (0 != CreateMutex(&hMutex, 0, NULL))
fprintf(stderr, "Errorrrrr!!!!");

int funcion()
{
WaitForSingleObject(hMutex, INFINITE);
codigo rocambolesco
ReleaseHandle(hMutex);
return 0;
}

y en POSIX:

int mutex;

mutex = pthread_mutex_create();

int funcion()
{
pthread_mutex_lock(&mutex);
codigo rocambolesco;
pthread_mutex_unlock(&mutex);
return 0;
}
--
Igualmente!!
Helio Tejedor
p***@nospam.demon.co.uk
2005-12-29 18:13:34 UTC
Permalink
Post by Cachorro
Hola buenas a todos.
Estoy haciendo unas prácticas, y tengo un recurso, una cola, y un algoritmo
que trabaja sobre esa cola eligiendo un elemento de ella de una forma mas o
menos rocambolesca.
Lo que intento es que cuando el algoritmo trabaja sobre esa cola poder
garantizar que ningún otro proceso, o cualquier infortunio, interfiera,
"quiero garantizar la exclusión mutua".
funcion{
//inicio seccion critica
//codigo rocambolesco
//fin seccion critica
}
Empeza simple -- algún como eso:

BOOL funcion foo
{
BOOL devolucion = FALSE;
static BOOL semaforo = TRUE;

if (semaforo)
{
semaforo = FALSE;
// tu código
// ...
semaforo = devolucion = TRUE;
}
return devolucion;
}
Post by Cachorro
Estube mirando documentación algún que otro libro y buscando por google, y
tenia pensado hacerlo mediante mutex, pero para nada me aclare :(
Así que agradecería fuentes de información y si a alguno se le ocurre alguna
forma mejor pues que no se corte :).
Un saludo Kachorro
PD Felices fiestasss!!!!!
¡De acuerdo!
Pete

PD disculpame mi malo español
--
"We have not inherited the earth from our ancestors,
we have borrowed it from our descendants."
Oscar Garcia
2005-12-29 19:53:31 UTC
Permalink
Post by p***@nospam.demon.co.uk
BOOL funcion foo
{
BOOL devolucion = FALSE;
static BOOL semaforo = TRUE;
if (semaforo)
{
semaforo = FALSE;
// tu código
// ...
semaforo = devolucion = TRUE;
}
return devolucion;
}
¿Estás seguro de lo que es la exclusión mutua?

Definir una variable como estática no la convierte en un elemento
"atómico" en cuanto a tiempo de ejecución, simplemente hace que si
cambia de valor, en la siguiente llamada a la función su valor se
mantendrá igual (como una variable global, pero de ámbito privado a
esa función).

Por otro lado por poner a false o true una variable.. sin un bucle que
compruebe el estado de dicha variable, poco vamos a hacer :)

El problema de la exclusión mutua empieza entre el tiempo que
asignamos la variable a true y el que previamente hemos usado para
esperar a que estubiera en false (para poder entrar en la "zona
crítica").

Eso debemos dejarlo siempre de mano del sistema operativo que es quien
tiene el control de los procesos y quien puede garantizarnos la
entrada exclusiva a las zonas críticas tal y como ha explicado
heltena.
Post by p***@nospam.demon.co.uk
PD disculpame mi malo español
No problemo :)
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Cachorro
2005-12-31 11:40:17 UTC
Permalink
Muchas gracias por las sugerencias, al final lo implemnteare con la versión
"POSIX".

Un Saludo
Cachorro

PD Feliz año!!!!
David Asorey Álvarez
2006-01-03 10:13:47 UTC
Permalink
En "Sistemas Operativos Modernos" de A. Tanembaum te lo cuentan ;-)

Saludos.

Loading...