Behandla Synchronisering: Kritisk sektionsproblem i OS
⚡ Smart sammanfattning
Behandla SyncChronisering är uppgiften att koordinera processkörning så att inga två processer får åtkomst till samma delade data eller resurs samtidigt. Det förhindrar datainkonsekvens i system med flera processer genom att kontrollera åtkomst till den kritiska sektionen.

Vad är process Synchronisering?
Behandla Synchronisering är uppgiften att samordna exekveringen av processer på ett sätt så att inte två processer kan ha tillgång till samma delade data och resurser.
Det behövs särskilt i ett flerprocesssystem när flera processer körs tillsammans och mer än en process försöker få åtkomst till samma delade resurs eller data samtidigt.
Detta kan leda till inkonsekvens i delade data. Så den förändring som görs av en process återspeglas inte nödvändigtvis när andra processer får åtkomst till samma delade data. För att undvika denna typ av inkonsekvens i data måste processerna synkroniseras med varandra.
Hur Process SyncHronization Fungerar?
Till exempel ändrar process A data i en minnesplats medan en annan process B försöker läsa data från Samma minnesplats. Det finns en stor sannolikhet att data som läses av den andra processen kommer att vara felaktiga.
Delar av ett program
Här är fyra viktiga delar av den kritiska delen:
- Ingångssektion: Det är en del av processen som avgör inträdet i en viss process.
- Kritisk sektion: Denna del tillåter en process att ange och ändra den delade variabeln.
- Avsluta avsnitt: Avslutningssektionen låter andra processer som väntar i ingångssektionen komma in i den kritiska sektionen. Den kontrollerar också att en process som avslutat sin körning ska tas bort via denna sektion.
- Återstående avsnitt: Alla andra delar av Code, som inte finns i den kritiska sektionen, ingångs- och utgångssektionen, kallas restsektionen.
Vad är problem med kritisk sektion?
En kritisk sektion är ett kodsegment som kan nås av en enda process vid en specifik tidpunkt. Sektionen består av delade dataresurser som andra processer måste kunna nå.
- Ingången till den kritiska sektionen hanteras av funktionen wait() och den representeras som P().
- Utgången från en kritisk sektion styrs av signal()-funktionen, representerad som V().
I det kritiska avsnittet kan endast en enda process köras. Andra processer, som väntar på att exekvera sin kritiska sektion, måste vänta tills den aktuella processen har slutfört sin exekvering.
Regler för kritisk sektion
Den kritiska sektionen måste tillämpa alla tre regler:
- Ömsesidig uteslutning: Ömsesidig uteslutning är en speciell typ av binär semafor som används för att kontrollera åtkomst till den delade resursen. Den inkluderar en prioritetsärvningsmekanism för att undvika problem med utökad prioritetsinversion. Inte mer än en process kan köras i dess kritiska sektion samtidigt.
- framsteg: Denna lösning används när ingen befinner sig i den kritiska sektionen, och någon vill in. Då bör de processer som inte befinner sig i sin restsektion avgöra vem som ska gå in, inom en begränsad tid.
- Bound Waiting: När en process gör en begäran om att komma in i den kritiska sektionen finns det en specifik gräns för antalet processer som kan komma in i deras kritiska sektion. Så när gränsen nås måste systemet tillåta begäran till processen att komma in i sin kritiska sektion.
Lösningar till den kritiska sektionen
Pågående SyncVid kronisering spelar den kritiska sektionen huvudrollen så att problemet måste lösas.
Här är några allmänt använda metoder för att lösa det kritiska avsnittsproblemet.
Peterson lösning
Petersons lösning är en allmänt använd lösning för kritiska sektionsproblem. Denna algoritm utvecklades av en datavetare vid namn Peterson, vilket är anledningen till att den kallas Petersons lösning.
I den här lösningen, när en process körs i ett kritiskt tillstånd, exekverar den andra processen bara resten av koden, och motsatsen kan hända. Denna metod hjälper också till att säkerställa att endast en enda process körs i den kritiska delen vid en specifik tidpunkt.
Exempelvis
PROCESS Pi
FLAG[i] = true
while( (turn != i) AND (CS is !free) ){ wait;
}
CRITICAL SECTION FLAG[i] = false
turn = j; //choose another process to go to CS
- Antag att det finns N processer (P1, P2, … PN) och att varje process vid någon tidpunkt måste gå in i den kritiska sektionen.
- En FLAG[]-array av storlek N bibehålls, vilken som standard är falsk. Så när en process behöver gå in i den kritiska sektionen måste den sätta sin flagga som sann. Om Pi till exempel vill gå in kommer den att sätta FLAG[i]=SANT.
- En annan variabel som heter TURN anger processnumret som för närvarande väntar på att komma in i CS.
- Processen som går in i den kritiska sektionen när du lämnar skulle ändra TURN till ett annat nummer från listan över färdiga processer.
- Exempel: tur är 2, då går P2 in i den kritiska sektionen och när man lämnar tur = 3 och därför bryter P3 ut ur väntslingan.
Synchronisering Hårdvara
Ibland löses problemen med den kritiska sektionen även av hårdvara. Vissa operativsystem erbjuder en låsfunktion där en process låses när den går in i den kritiska sektionen och släpper låset efter att den lämnat den.
Så när en annan process försöker komma in i den kritiska delen kommer den inte att kunna komma in eftersom den är låst. Det kan bara göra det om det är gratis genom att skaffa själva låset.
Mutex lås
SyncHårdvara för elektronik är inte en enkel metod att implementera för alla, så en strikt mjukvarumetod som kallas Mutex Locks introducerades också.
I detta tillvägagångssätt, i ingångssektionen av koden, erhålls ett LÅS över de kritiska resurserna som används inuti den kritiska sektionen. I utgångssektionen släpps det låset.
Semaphore Lösning
Semaphore är helt enkelt en variabel som är icke-negativ och delas mellan trådar. Det är en annan algoritm eller lösning på problemet med kritiska sektioner. Det är en signaleringsmekanism, och en tråd som väntar på en semafor kan signaleras av en annan tråd.
Den använder två atomära operationer: 1) vänta och 2) signal för processsynkronisering.
Exempelvis
WAIT ( S ): while ( S <= 0 ); S = S - 1; SIGNAL ( S ): S = S + 1;


