πŸ“Œ Semaphore

Semaphore β€” ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² синхронизации, основанный Π½Π° счётчикС. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ограничСния количСства ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… доступ ΠΊ рСсурсу, ΠΈΠ»ΠΈ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сигнализации ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΈ процСссами.

🧠 Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ содСрТит цСлочислСнный счётчик:

  • sem_wait() (ΠΈΠ»ΠΈ P) β€” ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
    • Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ > 0 β†’ ΠΏΡ€ΠΎΡ…ΠΎΠ΄
    • Если 0 β†’ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅
  • sem_post() (ΠΈΠ»ΠΈ V) β€” ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
    • ΠœΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ

Π’ΠΈΠΏΡ‹ сСмафоров:

  • Binary Semaphore β€” счётчик 0/1, Π°Π½Π°Π»ΠΎΠ³ Mutex
  • Counting Semaphore β€” ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ цСлочислСнный счётчик
  • Named Semaphore (sem_open, sem_unlink) β€” доступСн Ρ€Π°Π·Π½Ρ‹ΠΌ процСссам
  • Unnamed Semaphore (sem_init) β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ процСсса

βš™οΈ Π“Π΄Π΅ примСняСтся

ΠžΠ±Π»Π°ΡΡ‚ΡŒΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования
MultithreadingΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ доступа ΠΊ ΠΏΡƒΠ»Ρƒ рСсурсов
IPCБигнализация ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами
RTOSБинхронизация Π·Π°Π΄Π°Ρ‡, ISR
Producer/ConsumerΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Π±ΡƒΡ„Π΅Ρ€Ρ‹ с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ
EmbeddedΠ Π°Π±ΠΎΡ‚Π° с Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ, Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°ΠΌΠΈ, Ρ„Π»Π°Π³Π°ΠΌΠΈ

πŸ’» ΠŸΡ€ΠΈΠΌΠ΅Ρ€ (POSIX Semaphore, C)

#include <semaphore.h>
sem_t sem;
sem_init(&sem, 0, 1); // binary semaphore
 
sem_wait(&sem);  // Π²Ρ…ΠΎΠ΄ Π² ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ
// ...
sem_post(&sem);  // Π²Ρ‹Ρ…ΠΎΠ΄

βœ… ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ доступ (Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Mutex)

  • ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для мСТпроцСссной синхронизации

  • Π•ΡΡ‚ΡŒ ядровыС ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

❌ НСдостатки

  • Π‘Π»ΠΎΠΆΠ½Π΅Π΅ Π² ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅, Ρ‡Π΅ΠΌ Mutex

  • Ошибки ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ счётчика

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ Deadlock ΠΈΠ»ΠΈ Starvation Π±Π΅Π· контроля порядка