Semaphore vs Mutex
Semaphore är en datastruktur som används för att säkerställa att flera processer inte kommer åt en gemensam resurs eller en kritisk sektion samtidigt, i parallella programmeringsmiljöer. Semaforer används för att undvika döda lås och tävlingsförhållanden. Mutex (Mutual Exclusion Object) används också för att undvika åtkomst till en gemensam resurs samtidigt genom flera samtidiga processer.
Vad är en semafor?
Semaphore är en datastruktur som används för att ge ömsesidig uteslutning till kritiska sektioner. Semaforer stöder huvudsakligen två operationer som kallas vänta (historiskt känd som P) och signal (historiskt känd som V). Vänteoperationen blockerar en process tills semaforen är öppen och signaloperationen tillåter en annan process (tråd) att komma in. Varje semafor är associerad med en kö av väntande processer. När vänteoperationen anropas av en tråd, om semaforen är öppen, kan tråden fortsätta. Om semaforen stängs när vänteoperationen anropas av en tråd, blockeras tråden och den måste vänta i kön. Signaloperationen öppnar en semafor och om det redan finns en tråd som väntar i kön tillåts den processen fortsätta och om det inte finns några trådar som väntar i kön kommer signalen att komma ihåg för nästa trådar. Det finns två typer av semaforer som kallas mutex semaforer och räkne semaforer. Mutex semaforer tillåter en enda åtkomst till en resurs och räkne semaforer tillåter flera trådar att komma åt en resurs (som har flera tillgängliga enheter).
Vad är en Mutex?
När en datorapplikation startas kommer den att skapa en mutex och bifoga den till en resurs. När resursen används av en tråd är den låst och andra trådar kan inte använda den. Om en annan tråd vill använda samma resurs måste den göra en begäran. Sedan kommer den tråden att placeras i en kö tills den första tråden är klar med resursen. När den första tråden är klar med resursen kommer låset att tas bort och tråden som väntar i kön kan få tillgång till resursen. Om det finns flera trådar som väntar i kön, ges de åtkomst i en roterande basis. Praktiskt taget, när mutex alternerar åtkomsten till en resurs mellan flera trådar, kommer det att vara synligt eftersom flera trådar konsumerar en resurs samtidigt. Men internt är det bara en enda tråd som kommer åt resursen vid en given tidpunkt.
Vad är skillnaden mellan Semaphore och Mutex?
Även om både semaforerna och mutex-objekten används för att uppnå ömsesidig uteslutning i parallella programmeringsmiljöer, har de vissa skillnader. Ett mutex-objekt tillåter bara en enskild tråd att konsumera en resurs eller en kritisk sektion, medan semaforer tillåter ett begränsat antal samtidiga åtkomster till en resurs (under ett maxim alt tillåtet antal). Med mutex-objekt måste andra trådar som vill komma åt resursen vänta i en kö tills den aktuella tråden är klar med hjälp av resursen.