La concurrència és un concepte avançat en programació que permet l'execució simultània de múltiples tasques o processos. En ALGOL, la concurrència es pot gestionar mitjançant diverses tècniques i estructures de control. Aquest tema és crucial per a la creació de programes eficients i responsius, especialment en sistemes multiprocés o distribuïts.
Conceptes Clau de la Concurrència
Abans d'entrar en els detalls de la implementació de la concurrència en ALGOL, és important comprendre alguns conceptes clau:
- Procés: Un programa en execució. Pot tenir múltiples fils d'execució.
- Fil (Thread): La unitat més petita d'execució dins d'un procés.
- Sincronització: Coordinació de l'execució de múltiples fils per evitar conflictes.
- Exclusió Mútua: Garantir que només un fil accedeixi a una secció crítica del codi alhora.
- Deadlock: Una situació en què dos o més fils esperen indefinidament per recursos que estan bloquejats per altres fils.
Estructures de Control per a la Concurrència
- Creació de Fils
En ALGOL, els fils es poden crear utilitzant procediments especials. A continuació es mostra un exemple bàsic de com crear i iniciar un fil:
procedure StartThread(proc: procedure); begin ! Codi per iniciar un nou fil que executa el procediment 'proc' end; procedure Task1; begin ! Codi de la tasca 1 end; procedure Task2; begin ! Codi de la tasca 2 end; begin StartThread(Task1); StartThread(Task2); end;
- Sincronització
La sincronització és essencial per evitar conflictes quan múltiples fils accedeixen a recursos compartits. Un mètode comú és utilitzar semàfors:
semaphore S := 1; procedure CriticalSection; begin P(S); ! Wait (decrementa el semàfor) ! Codi de la secció crítica V(S); ! Signal (incrementa el semàfor) end; procedure Task; begin while true do begin CriticalSection; ! Altres operacions end; end;
- Exclusió Mútua
L'exclusió mútua es pot aconseguir utilitzant semàfors o altres mecanismes de bloqueig. Aquí es mostra un exemple utilitzant un semàfor per garantir que només un fil accedeixi a una secció crítica alhora:
semaphore mutex := 1; procedure CriticalSection; begin P(mutex); ! Wait (decrementa el semàfor) ! Codi de la secció crítica V(mutex); ! Signal (incrementa el semàfor) end;
- Evitar Deadlocks
Per evitar deadlocks, és important seguir algunes pràctiques recomanades, com ara:
- Evitar l'espera circular: Assegurar-se que els fils no esperin recursos en un cicle.
- Adquirir tots els recursos alhora: Intentar adquirir tots els recursos necessaris al mateix temps.
- Utilitzar un ordre global: Assegurar-se que tots els fils adquireixin els recursos en el mateix ordre.
Exercici Pràctic
Exercici 1: Implementació de Fils i Sincronització
Objectiu: Crear dos fils que incrementin un comptador compartit de manera segura utilitzant semàfors.
Codi Inicial:
integer counter := 0; semaphore mutex := 1; procedure IncrementCounter; begin P(mutex); counter := counter + 1; V(mutex); end; procedure Task; begin for i := 1 to 1000 do IncrementCounter; end; begin StartThread(Task); StartThread(Task); ! Esperar que els fils acabin ! Mostrar el valor final del comptador end;
Solució:
integer counter := 0; semaphore mutex := 1; procedure IncrementCounter; begin P(mutex); counter := counter + 1; V(mutex); end; procedure Task; begin for i := 1 to 1000 do IncrementCounter; end; begin StartThread(Task); StartThread(Task); ! Esperar que els fils acabin ! Mostrar el valor final del comptador ! Nota: La implementació de l'espera dels fils i la visualització del comptador ! dependrà de les capacitats específiques de l'entorn ALGOL utilitzat. end;
Resum
En aquesta secció, hem explorat els conceptes bàsics de la concurrència en ALGOL, incloent la creació de fils, la sincronització, l'exclusió mútua i l'evitació de deadlocks. A més, hem proporcionat un exercici pràctic per reforçar aquests conceptes. La comprensió i l'aplicació correcta de la concurrència són essencials per desenvolupar programes eficients i segurs en entorns multiprocés.
Curs de Programació en ALGOL
Mòdul 1: Introducció a ALGOL
Mòdul 2: Sintaxi i Estructura Bàsica
- Estructura del Programa ALGOL
- Variables i Tipus de Dades
- Entrada i Sortida Bàsica
- Operadors i Expressions
Mòdul 3: Estructures de Control
Mòdul 4: Funcions i Procediments
- Definició de Funcions
- Paràmetres de Funció i Valors de Retorn
- Funcions Recursives
- Procediments en ALGOL
Mòdul 5: Estructures de Dades
Mòdul 6: Temes Avançats
Mòdul 7: Aplicacions Pràctiques
- Mètodes Numèrics
- Implementació d'Algorismes
- Construcció d'un Compilador Simple
- Estudis de Cas i Projectes