Kritiskt avsnitt

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 25 oktober 2017; kontroller kräver 6 redigeringar .

En kritisk sektion  är en sektion av programmets körbara kod som får åtkomst till en delad resurs (data eller enhet) som inte får användas samtidigt av mer än en exekveringstråd . När två (eller flera) trådar är i det kritiska avsnittet uppstår ett "race" ("tävling") tillstånd. För att undvika denna situation måste fyra villkor vara uppfyllda:

  1. Två trådar får inte vara i kritiska områden samtidigt.
  2. Programmet bör inte göra antaganden om hastighet eller antal processorer.
  3. En tråd utanför det kritiska området kan inte blockera andra trådar.
  4. Det är omöjligt för en tråd att vänta för evigt för att träffa en kritisk region.

En kritisk sektion är ett  trådsynkroniseringsobjekt som låter dig förhindra samtidig exekvering av en viss uppsättning operationer (vanligtvis relaterade till dataåtkomst) av flera trådar. En kritisk sektion utför samma uppgifter som en mutex .

Det finns terminologiska skillnader mellan en mutex och en kritisk sektion: så en procedur som liknar att "fånga" en mutex kallas att gå in i den kritiska sektionen ( eng.  enter ), och liknar att låsa upp mutex - att lämna den kritiska delen ( sv.  leave ) .

Proceduren för att gå in i och lämna kritiska sektioner tar vanligtvis kortare tid än liknande mutex-operationer, vilket beror på frånvaron av behovet av att komma åt OS-kärnan.

I operativsystem i Microsoft Windows- familjen är skillnaden mellan en mutex och en kritisk sektion att mutex är ett kärnobjekt och kan användas av flera processer samtidigt, medan den kritiska sektionen tillhör processen och tjänar till att synkronisera bara dess trådar.

Windows kritiska sektioner har en optimering för att använda en atomiskt föränderlig variabel tillsammans med kärnans "sync event"-objekt. Att fånga ett kritiskt avsnitt innebär en atomär ökning av variabeln med 1. Byte till att vänta på en kärnhändelse utförs endast om värdet på variabeln före fångst redan var större än 0, det vill säga det finns en verklig "konkurrens" av två eller flera trådar för en resurs.

Således, i frånvaro av ett påstående, förbigås infångningen/avallokeringen av en kritisk sektion utan anrop till kärnan.

Att fånga en redan upptagen kritisk sektion innan du kommer åt kärnan väntar en kort stund i slingan (antalet iterationer av slingan ( eng.  spin count ) ställs in av funktionerna InitializeCriticalSectionAndSpinCount () eller SetCriticalSectionSpinCount () som pollar variabelt antal aktuella användare, och om denna variabel blir lika med 0, sker infångningen utan anrop till kärnan.

Ett liknande objekt i Windows-kärnan kallas FAST_MUTEX ( ExAcquire/ReleaseFastMutex ). Det skiljer sig från ett kritiskt avsnitt genom att det inte stöder rekursiv återhämtning av samma tråd.

Ett liknande objekt i Linux kallas futex .

Se även

Länkar