Semafor vs Mutex
Semaphore egy olyan adatstruktúra, amely biztosítja, hogy párhuzamos programozási környezetekben több folyamat ne férhessen hozzá egy közös erőforráshoz vagy egy kritikus szakaszhoz egyszerre. A szemaforokat a holt zárak és a versenyfeltételek elkerülésére használják. A Mutex (Kölcsönös kizárási objektum) arra is használható, hogy több párhuzamos folyamat ne férhessen hozzá egy közös erőforráshoz.
Mi az a szemafor?
Semaphore egy olyan adatstruktúra, amely a kritikus szakaszok kölcsönös kizárására szolgál. A szemaforok főleg két műveletet támogatnak, az úgynevezett várakozást (történelmi nevén P) és jelet (történelmi nevén V). A várakozási művelet blokkol egy folyamatot, amíg a szemafor meg nem nyílik, és a jelművelet lehetővé teszi egy másik folyamat (szál) belépését. Minden szemafor egy sor várakozó folyamathoz van társítva. Ha a várakozási műveletet egy szál hívja, ha a szemafor nyitva van, a szál folytatódhat. Ha a szemafor zárva van, amikor a várakozási műveletet egy szál hívja, a szál blokkolva van, és várnia kell a sorban. A jelművelet megnyit egy szemafort, és ha már van egy szál a sorban, akkor ez a folyamat folytatható, és ha nincs várakozó szál a sorban, a jel megjegyzi a következő szálakat. Kétféle szemafor létezik, amelyeket mutex szemaforoknak és számláló szemaforoknak neveznek. A Mutex szemaforok egyetlen hozzáférést tesznek lehetővé egy erőforráshoz, a számláló szemaforok pedig lehetővé teszik több szál hozzáférését egy erőforráshoz (amelynek több egysége is elérhető).
Mi az a Mutex?
Amikor egy számítógépes alkalmazás elindul, létrehoz egy mutexet, és csatolja egy erőforráshoz. Ha az erőforrást egy szál használja, az zárolva van, és más szálak nem használhatják. Ha egy másik szál szeretné használni ugyanazt az erőforrást, akkor kérést kell benyújtania. Ezután a szál egy sorba kerül, amíg az első szál be nem fejeződik az erőforrással. Amikor az első szál befejeződik az erőforrással, a zárolás megszűnik, és a sorban várakozó szál hozzáférhet az erőforráshoz. Ha több szál is várakozik a sorban, akkor ezek rotációs alapon kapnak hozzáférést. Gyakorlatilag, amikor a mutex váltogatja az erőforrás elérését több szál között, akkor ez látható lesz, mivel több szál fogyaszt egy erőforrást egyidejűleg. De belül egy adott időpontban csak egyetlen szál fér hozzá az erőforráshoz.
Mi a különbség a Semaphore és a Mutex között?
Annak ellenére, hogy mind a szemaforokat, mind a mutex objektumokat a kölcsönös kizárás elérésére használják párhuzamos programozási környezetekben, vannak különbségek. A mutex objektumok csak egyetlen szál számára teszik lehetővé az erőforrás vagy egy kritikus szakasz felhasználását, míg a szemaforok korlátozott számú egyidejű hozzáférést tesznek lehetővé egy erőforráshoz (a megengedett maximális szám alatt). Mutex objektumok esetén a többi szálnak, amely hozzá akar férni az erőforráshoz, várnia kell egy sorban, amíg az aktuális szál be nem fejezi az erőforrás használatát.