I Linux är semaforer en synkroniseringsprimitiv som används för att kontrollera åtkomst till delade resurser med flera processer eller trådar. De fungerar i huvudsak som räknare som kan ökas (med hjälp av `SEM_POST ') och minskas (med hjälp av` SEM_WAIT'). Dessa operationer är atomiska, vilket innebär att de är oavbrutna, vilket garanterar konsistens.
Här är en uppdelning av deras viktigaste egenskaper och användning:
* Synkroniseringsmekanism: Semaphores förhindrar rasförhållanden, där flera processer som försöker komma åt och ändra samma resurs samtidigt kan leda till oförutsägbara och felaktiga resultat. De verkställer en kontrollerad åtkomstorder.
* Räknarvärde: En semafor upprätthåller ett icke-negativt heltal. Detta värde representerar antalet tillgängliga resurser eller tillstånd.
* `sem_wait ()` (eller `SEM_RYWAIT ()`): Denna operation minskar semaforens värde. Om värdet är större än noll, minskas det och processen fortsätter. Om värdet är noll, blockerar processen (väntar) tills semaforens värde blir större än noll (en annan process ökar det med `SEM_POST '). `Sem_trywait ()` är en icke-blockerande version; Det returnerar ett fel om semaforvärdet är noll.
* `SEM_POST ()`: Denna operation ökar semaforens värde. Om en process är blockerad som väntar på semaforen kommer en av väntningsprocesserna att väckas.
* typer: Linux tillhandahåller namngivna och namngivna semaforer.
* namngivna semaforer: Dessa skapas med hjälp av `SEM_INIT ()` och är endast tillgängliga inom processen eller trådgruppen där de skapades. De används vanligtvis för synkronisering inom en enda process.
* namngivna semaforer: Dessa skapas med hjälp av `SEM_OPEN ()` och finns i systemets delade minne. De kan nås med flera processer, vilket möjliggör kommunikation mellan processen (IPC). Namngivna semaforer identifieras med ett unikt namn.
* binära semaforer: En semafor med ett maximivärde på 1 kallas ofta en binär semafor. Det fungerar som ett mutex -lås (ömsesidigt uteslutning), vilket gör att en process endast kan komma åt den delade resursen i taget.
* räknar semaforer: En semafor med ett värde större än 1 är en räknande semafor. Det kan representera flera instanser av en resurs, vilket gör att flera processer kan komma åt resursen samtidigt upp till semaforens värde.
Exempel (konceptuell):
Föreställ dig en skrivare som delas av flera processer. En räkningssemaphore kan användas för att kontrollera åtkomst:
1. Initialisering: Semaphore initialiseras till antalet skrivare (t.ex. 3).
2. Process 1 vill skriva ut: Det kallar `SEM_WAIT ()`. Semaphore -värdet minskas (3 blir 2) och processen fortsätter att skriva ut.
3. Process 2 vill skriva ut: Det kallar `SEM_WAIT ()`. Semaphore -värdet minskas (2 blir 1) och processen fortsätter att skriva ut.
4. Process 3 vill skriva ut: Det kallar `SEM_WAIT ()`. Semaphore -värdet minskar (1 blir 0) och processen fortsätter att skriva ut.
5. Process 4 vill skriva ut: Det kallar `SEM_WAIT ()`. Semaphore -värdet är 0, så processen blockeras tills en skrivare blir tillgänglig.
6. Process 1 Finish Tryck: Det kallar `SEM_POST ()`. Semaphore -värdet ökas (0 blir 1) och process 4 väcks.
Nyckelbibliotek: I Linux kommer semaforer vanligtvis åtkomliga med hjälp av POSIX -semaforfunktionerna som deklarerats i ``. Observera att den specifika implementeringen kan variera något mellan olika UNIX-liknande system.