π 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 Π±Π΅Π· ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ ΠΏΠΎΡΡΠ΄ΠΊΠ°