Cadenat (informàtica)

De Viquipèdia
Dreceres ràpides: navegació, cerca

En ciències de la computació, els cadenats d'exclusió mútua o "locks" (anglès) són un mecanisme de sincronització que limita l'accés a un recurs compartit per diversos processos o fils en un ambient de execució concurrent, permetent així l'exclusió mútua.

Quan un element és compartit per més d'un fil, poden ocórrer condicions de competició si aquest no és protegit adequadament. El mecanisme més simple per a la protecció és el cadenat o tanca . En general quan ha de protegir un conjunt d'elements, se li associa un cadenat. Cada procés/fil per a tenir accés a un element del conjunt, haurà de bloquejar, de manera que es converteix en el seu amo. Aquesta és l'única forma de guanyar accés. En acabar d'usar-lo, el propietari ha de desbloquejar, per permetre que un altre procés/fil pugui prendre al seu torn. És possible que mentre un procés/fil estigui accedint a un recurs (sent per tant propietari del cadenat), un altre procés/fil intenti accedir. Aquesta acció ha d'esperar fins que el cadenat es trobi lliure, per garantir l'exclusió mútua. El procés/fil sol·licitant queda llavors en espera o passa a estat de bloqueig segons l'algorisme implementat. Quan el propietari del cadenat el desbloqueja pot prendre'l algun dels processos/fils que esperaven.

Aquest mecanisme es pot veure en un exemple de la vida real. Suposem un lavabo públic, on només pot entrar una persona a la vegada. Un cop dins, s'empra un cadenat per evitar que entrin altres persones. Si una altra persona pretén fer servir el lavabo quan està ocupat, haurà de quedar esperant que la persona que va entrar abans acabi. Si més persones arribessin, formarien una cua (del tipus FIFO) i esperarien el seu torn. En informàtica, el programador no ha d'assumir aquest tipus de comportament a la cua d'espera.

El cadenat, usat d'aquesta manera, forma una secció crítica En cada procés/fil, des que és pres fins que s'allibera. En l'exemple del lavabo, dins de la secció crítica es troben les funcions que es realitzen generalment dins d'aquest tipus d'instal·lacions sanitàries. Com garanteixen l'exclusió mútua, moltes vegades se'ls anomena mutex (per mutual exclusion ).

En general hi ha un nombre de restriccions sobre els cadenats, encara que no són les mateixes en tots els sistemes. Aquestes són:

  • Només el propietari d'un cadenat pot desbloquejar
  • La readquisició d'un cadenat no està permesa

Una cosa molt important és que tots els processos/fils han d'utilitzar el mateix protocol per bloquejar i desbloquejar els cadenats en l'accés als recursos, ja que si mentre dos processos/fils utilitzen el cadenat de forma correcta, hi ha un altre que simplement accedeix a les dades protegits, no es garanteix l'exclusió mútua i poden donar-se condicions de competició i errors en els resultats.

Primitives i ús[modifica | modifica el codi]

Les funcions dels cadenats en general són tres: init () , lock () i unlock () . El cadenat es inicialitza amb la funció init () . Després cada procés/fil ha de cridar a la funció lock () abans d'accedir a les dades protegides pel cadenat. En finalitzar la seva secció crítica, el propietari del cadenat ha besbloquearlo mitjançant la funció unlock () .