Problem med læsere og redaktører

Det problem af læsere og forfattere er et klassisk problem i computer teori , som gør det muligt at modellere adgang til databaser .

Det blev anført i denne form af Edsger Dijkstra , der også er oprindelsen til problemet med filosofernes middag (problem, der især vedrører bestillingen af ​​processerne).

Problemet

Antag, at en database har læsere og forfattere, og at databasens læsere og forfattere skal programmeres.

Begrænsningerne er som følger:

Løsninger

Det er ret ligetil at have redaktøren sat på vent, mens der stadig er læsere.

Men denne løsning byder på store problemer, hvis strømmen af ​​læsere er regelmæssig: redaktøren kan være nødt til at vente en uendelig tid.

Der er derfor en anden løsning, der består i at sætte alle de læsere, der har sendt deres anmodning om adgang efter en redaktør, på hold.

Edsger Dijkstra , der formulerede dette problem, foreslår at løse det ved hjælp af semaforer .

Løsning med brug af semaforer og prioritet for læsere

Den følgende løsning løser problemet med læsere og forfattere ved at prioritere læsere. Denne løsning kræver tre semaforer og en variabel, nemlig:

Denne løsning bruger følgende fire metoder:

Begynd at læse Commencer_Lire: P(M_Lect) SI (red) ALORS pbloque=true V(M_Lect) p(synch) FIN SI SINON lect++; V(M_Lect)

Denne metode øger antallet af læsere; så hvis dette er den første læser, der prøver at komme ind, tillader det kun adgang, hvis der ikke er nogen aktuel skrivning. Ellers skal metoden vente, indtil udarbejdelsen er færdig. Brug af to semaforer til redaktørerne gør det muligt at fremkalde prioriteten for læserne.

Afslut en læsning Finir_Lire: P(M_Lect) lect-- SI Lect==0 ALORS V(Red) FIN SI V(M_Lect)

Denne metode reducerer antallet af læsere. Derefter, hvis dette er den sidste læser, der afslutter, giver det redaktører adgang til (hvis det er nødvendigt).

Start en skrivning Commencer_Ecrire: P(M_Red) P(Red) SI (red or lect>0) ALORS pbloque=true V(Red) SINON red=true V(Red) V(M_Red)

Denne metode ved hjælp af M_Red-semaforen gør det muligt at sikre, at læsere prioriteres i slutningen af ​​en forfatter (faktisk slutningen af ​​en forfatter frigør den røde semafor - hvilket frigør en mulig læser - før at frigøre M_Red-semaforen).

Afslut en skrivning Finir_Ecrire: V(Red) V(M_Red)

Denne metode gør det muligt at sikre, at læserne prioriteres (faktisk frigør den røde semafor frigør en mulig læser, inden man frigør en mulig editor ved hjælp af M_Red-semaforen).

Løsning med asynkron kopi af datastrukturen

Antag, at læsernes mål er at læse data asynkront. Alle læsere har oplysningerne på det tidspunkt, hvor deres anmodning (muligvis fra en ekstern maskine) blev fremsat.

Eller en DATA- markør til en datastruktur, der indeholder alle de tilgængelige oplysninger. Redaktører sender anmodninger, der gemmes i en FIL- kø .

En M1 mutex beskytter følgende struktur:

Liste de DATA : PRECEDENT DATA : ACTUEL DATA : PROCHAIN booléen : MISAJOUR

En M2 mutex beskytter følgende struktur:

File de mises à jour : FILE Date de dernière modification : DERNIER Kode udført af læseren verrouille M1: si MISAJOUR est vrai: enfile ACTUEL dans PRECEDENT pour chaque élément de PRECEDENT: effacer l'élément si son compteur de références est nul (1) fin pour ACTUEL := PROCHAIN (2) PROCHAIN := copie de ACTUEL MISAJOUR := faux fin si récupérer un pointeur P sur ACTUEL et incrémenter son compteur de références déverrouille M1 lire dans P ... décrémenter le compteur de références de P Kode udført af forfatteren verrouille M2: enfiler les modifications dans FILE si DERNIER est dépassé de 10 secondes: verrouiller M1: effectuer toute modification de FILE dans PROCHAIN vider FILE MISAJOUR := vrai (3) déverrouille M1 fin si déverrouille M2 Bemærkninger
  1. Når datastrukturen er blevet opdateret, kan den gamle version forblive som en markør i samtidige lette processer . En god måde at undgå hukommelseslækage er derfor at holde en referencetæller for at slette de spidse hukommelsesområder, når der ikke længere bruges en proces.
  2. AKTUELT og NÆSTE er statiske markører, kopiering af det andet til det første svarer til en markeringstildeling. Som sagt i det første punkt forbliver den gamle markør i de lysprocesser, der er udført tidligere. På den anden side udfører man i den følgende linje en komplet kopi af de data, der er påpeget af AKTUELLE og peger på NÆSTE til kopien.
  3. Ved blot at indstille denne boolske til ægte vil fremtidige læsere kunne bruge den korrekte version af dataene.

Denne model er velegnet, når opdateringerne ikke kræver transaktionsstyring, som databaser skal levere .

Se også

  • Luigi Zaffalon og Pierre Breguet, Samtidig og realtids programmering med ADA 95 , Presses polytechniques et universitaire romandes, Lausanne , 1999
  • filosofernes middag