05.03.2015 Views

Práctica [PDF] - Universidad de Carabobo, FACYT - computacion

Práctica [PDF] - Universidad de Carabobo, FACYT - computacion

Práctica [PDF] - Universidad de Carabobo, FACYT - computacion

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!