Práctica [PDF] - Universidad de Carabobo, FACYT - computacion
Práctica [PDF] - Universidad de Carabobo, FACYT - computacion
Práctica [PDF] - Universidad de Carabobo, FACYT - computacion
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Universidad</strong> <strong>de</strong> <strong>Carabobo</strong><br />
Facultad Experimental <strong>de</strong> Ciencias y Tecnología<br />
Departamento <strong>de</strong> Computación<br />
Sistemas Operativos<br />
Prep. Carlos I. Buchart I.<br />
Nombre:___________________________________<br />
Sincronizacion y Comunicacion entre Procesos<br />
Atomizacion <strong>de</strong> las operaciones: la arquitectura Intel 386, y posterior <strong>de</strong> la misma familia,<br />
pue<strong>de</strong> asegurar la atomicidad <strong>de</strong> las operaciones ejecutadas, una a una, simplemente añadiendo el<br />
prefijo lock a la instruccion <strong>de</strong>seada.<br />
lock add ax, bx<br />
Inhabilitacion <strong>de</strong> Interrupciones: el problema <strong>de</strong> la seccion critica se genera cuando dos o<br />
mas procesos <strong>de</strong>sean acce<strong>de</strong>r concurrentemente al mismo recurso. La solucion <strong>de</strong> I.I. evita que el<br />
proceso abandone el CPU durante la S.C., logrando asi la exclusion mutua. El gran inconveniente que<br />
presenta esta opcion es que <strong>de</strong>sactivar y activar las interrupciones es muy costoso en lo que<br />
respecta a tiempo <strong>de</strong> ejecución, por lo que no es una buena opcion para sistemas en tiempo real, por<br />
ejemplo. El esquema general <strong>de</strong> uso seria el siguiente:<br />
void Proceso(int id) {<br />
// Desactivar las interrupciones<br />
// S.C.<br />
// Activar las interrupciones nuevamente<br />
// S.n.C.<br />
}<br />
Test-And-Set: esta funcion verifica el estado <strong>de</strong> una variable cerrojo <strong>de</strong>volviendo verda<strong>de</strong>ro<br />
si el cerrojo estaba abierto (en 0), falso en otro caso. A<strong>de</strong>mas, al retornar, el cerrojo queda cerrado<br />
(bien sea porque ya lo estaba o porque se cerro <strong>de</strong>ntro <strong>de</strong> la funcion). Su uso es como se muestra a<br />
continuacion:<br />
int cerrojo=0;<br />
void Proceso(int id) {<br />
while(test_and_set(cerrojo));<br />
// S.C.<br />
cerrojo=0;<br />
// S.n.C.<br />
}<br />
Swap: la instruccion swap, como su nombre indica, intercambia el valor <strong>de</strong> dos variables. Al<br />
igual que con la instruccion anterior, esta otorga el acceso al primero que lo solicite una vez que el<br />
recurso haya sido liberado. Del mismo modo, ambas instrucciones swap y t&s adolescen <strong>de</strong>l<br />
problema <strong>de</strong> “inversion <strong>de</strong> prioridad”.<br />
int cerrojo=0;<br />
void Proceso(int id) {<br />
int clave=1;<br />
}<br />
do {<br />
swap(clave,cerrojo);<br />
} while(cerrojo);<br />
// S.C.<br />
swap(clave,cerrojo);<br />
// S.n.C.<br />
Semaforos: propuestos por Dijkstra en 1.965 como una solucion al problema <strong>de</strong> la seccion<br />
critica. Consta <strong>de</strong> dos instrucciones signal y wait, y una variable mutex comun. Esta variable se suele
fijar al numero <strong>de</strong> recursos disponibles, la operacion wait <strong>de</strong>crementa su valor y verifica si no es<br />
negativo (es <strong>de</strong>cir, que al solicitarse habia alguno disponible); si no lo es, continua la ejecucion, en<br />
caso contrario se pue<strong>de</strong> utilizar espera activa o se pue<strong>de</strong> bloquear el proceso e introducirlo en una<br />
cola para evitar el consumo <strong>de</strong> CPU. El signal simplemente libera un recurso y en caso <strong>de</strong> utilizar<br />
colas, libera el primer proceso <strong>de</strong> la misma.<br />
int mutex=MAX_RECURSOS;<br />
void signal(int *_mutex) {<br />
(_mutex*)++;<br />
if((*mutex)
Crea el set <strong>de</strong> semáforos para los cubiertos<br />
if((sem_id=semget(IPC_PRIVATE,NUM_FILOSOFOS,0774 | IPC_CREAT))==-1)<br />
return -3;<br />
// Crea el semáforo que evitará el interbloqueo<br />
if((sem_id2=semget(IPC_PRIVATE,1,0774 | IPC_CREAT))==-1)<br />
return -3;<br />
// Inicializa el área <strong>de</strong> memoria compartida<br />
for(i=0;ifilosofos[i]=PENSANDO;<br />
p_filosofos->pids[i]=0;<br />
semctl(sem_id,i,SETVAL,LIBRE);<br />
}<br />
semctl(sem_id2,0,SETVAL,NUM_FILOSOFOS-1);<br />
p_filosofos->semaforo_id=sem_id;<br />
p_filosofos->semaforo_id2=sem_id2;<br />
p_filosofos->memoria_id=mem_id;<br />
}<br />
return sem_id;<br />
// Liberar semáforos y memoria compartida<br />
void elimina_filosofos(void)<br />
{<br />
int i;<br />
int mem_id,sem_id;<br />
}<br />
mem_id=p_filosofos->memoria_id;<br />
shmdt((char *)p_filosofos);<br />
shmctl(mem_id,IPC_RMID,(struct shmid_ds *)NULL);<br />
for(i=0;i
interbloqueo<br />
P(p_filosofos->semaforo_id2,0);<br />
}<br />
}<br />
// Espera los dos cubiertos<br />
P(p_filosofos->semaforo_id,i);<br />
P(p_filosofos->semaforo_id,(i+1)%NUM_FILOSOFOS);<br />
p_filosofos->filosofos[i]=COMIENDO;<br />
sleep(1);<br />
// Devuelve los dos cubiertos<br />
V(p_filosofos->semaforo_id,i);<br />
V(p_filosofos->semaforo_id,(i+1)%NUM_FILOSOFOS);<br />
p_filosofos->filosofos[i]=PENSANDO;<br />
// Deja que otro trate <strong>de</strong> comer<br />
V(p_filosofos->semaforo_id2,0);<br />
// Bucle <strong>de</strong> espera <strong>de</strong>l proceso padre<br />
while(res!=27)<br />
{<br />
// Muestra información<br />
printf("Estado <strong>de</strong> los filósofos: \n");<br />
for(i=0;ipids[i],p_filosofos->filosofo[i]);<br />
res=getchar();<br />
}<br />
// Elimina los procesos hijos<br />
for(i=0;ipids[i],9);<br />
elimina_filosofos();<br />
}<br />
return 0;<br />
Bibliografía<br />
Otros problemas a resolver: productor-consumidor, lectores-escritores.<br />
STALLINGS, William – Sistemas Operativos, segunda edicion. Pag. 175-209<br />
TANENBAUM, Andrew – Sistemas Operativos, Diseño e Implementacion. Pag. 59-82<br />
SILBERCHATZS, a – Sistemas Operativos, sexta edicion. Pag. 181-204<br />
http://bernia.disca.upv.es/lxr/http/source/<br />
http://es.tldp.org/Manuales-LuCAS/DENTRO-NUCLEO-LINUX/<strong>de</strong>ntro-nucleo-linux-html/<strong>de</strong>ntro-nucleolinux-2.html<br />
http://www.icselectiongui<strong>de</strong>.com/real_time_dispatch.html<br />
http://www.co<strong>de</strong>comments.com/archive258-2004-12-343766.html<br />
http://www.linux-tutorial.info/modules.php?name=Tutorial&pageid=288<br />
CB/cb