Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QNX/UNIX: Анатомия ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 56

Автор Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ ОлСг Π˜Π²Π°Π½ΠΎΠ²ΠΈΡ‡

Каким ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ? Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ манипуляции с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°, входящСго Π² ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ. Однако послС выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

sem_wait()
(ΠΏΡ€ΠΈ этом счСтчик сСмафора ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π΄ΠΎ нуля) ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΊΠΎΠ΄Π° критичСской сСкции ΡƒΠΆΠ΅ Π½ΠΈΠΊΠ°ΠΊ нСльзя ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π» сСмафор, ΠΈ нСльзя Π½ΠΈΡ‡Π΅Π³ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ систСма ΠΈΠΌΠ΅Π»Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΎΡ„ΠΈΠ»Π°ΠΊΡ‚ΠΈΠΊΠΈ инвСрсии ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² ΠΈ Π²Π·Π°ΠΈΠΌΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ (Β«ΠΌΠ΅Ρ€Ρ‚Π²Ρ‹Ρ… ΠΎΠ±ΡŠΡΡ‚ΠΈΠΉΒ» β€” deadlock) ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Ρ… Π²Π·Π°ΠΈΠΌΠ½Ρ‹ΠΌ влияниСм ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ синхронизации явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ…Ρ€Π°Π½ΠΈΠ» ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Π³ΠΎ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ» (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π·Π½Π°Π» своСго хозяина). Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ Ρ‚Π°ΠΊΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π½Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚, ΠΈ это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ систСмы с Π΅Π³ΠΎ использованиСм. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ сСмафора ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎ для случаСв слабо связанных ΠΈ Π² ΠΈΠ΄Π΅Π°Π»Π΅ Ρ€Π°Π²Π½ΠΎΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². БобствСнно, для этих случаСв сСмафор ΠΊΠ°ΠΊ срСдство синхронизации ΠΈ разрабатывался [10].

‒ Частным случаСм Π·Π°Π΄Π°Ρ‡ΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ являСтся классичСская Π·Π°Π΄Π°Ρ‡Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ доступа ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ/ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ. Вакая ситуация Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±Ρ‰ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ. Пока ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ Π½Π΅ Β«ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Β» Π½ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² эту ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΡΡ‚Π°ΠΈΠ²Π°Ρ‚ΡŒ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ классичСскоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ этой Π·Π°Π΄Π°Ρ‡ΠΈ. Π’ этом случаС Π½Π°ΠΌ понадобится Π΄Π²Π° сСмафора (ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ (ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅), инициализируСтся Π½ΡƒΠ»Π΅ΠΌ (Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ), Π° Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ запись (производство), β€” Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ (ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ доступ Β«ΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŽΒ» ΠΊ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ рСсурсу).

<b>Β Β Β Β Β Β Β Β  ΠŸΠΎΡ‚ΠΎΠΊ А                   ΠŸΠΎΡ‚ΠΎΠΊ Π’</b>

sem_wait(&amp;sem_A);Β Β Β Β Β Β Β Β Β sem_wait(&amp;sem_B);

/* критичСская сСкция */Β  /* критичСская сСкция */

sem_post(&amp;sem_B);Β Β Β Β Β Β Β Β  sem_post(&amp;sem_A);

ПолоТим, ΠΏΠΎΡ‚ΠΎΠΊ А являСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π’. БоотвСтствСнно сСмафор

sem_A
ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ 1, Π° сСмафор
sem_B
ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ 0. Когда ΠΏΠΎΡ‚ΠΎΠΊ Π’ попытаСтся ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠ° А. ΠŸΠΎΡ‚ΠΎΠΊ А, ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, Π²ΠΎΠΉΠ΄Π΅Ρ‚ Π² ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΅Π³ΠΎ сСмафор Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½), установит Π½ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ, покидая ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ, Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ сСмафор ΠΏΠΎΡ‚ΠΎΠΊΠ° Π’. ПослС этого ΠΏΠΎΡ‚ΠΎΠΊ Π’ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ ΠΈ смоТСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ссли Π΄Π°Π½Π½Ρ‹Π΅ производятся Π² Ρ†ΠΈΠΊΠ»Π΅ (Π° это обычная ситуация), Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ А Π½Π΅ смоТСт ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊ Π’ Π½Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ Π½Π΅ ΠΏΠΎΠΊΠΈΠ½Π΅Ρ‚ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Описанная схСма Π½Π΅ являСтся ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Однако Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ситуация, ΠΊΠΎΠ³Π΄Π° сущСствуСт мноТСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ. Π’ ОБ QNX сущСствуСт ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² синхронизации, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Β«Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ чтСния/записи» ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для синхронизации доступа Π² Ρ‚Π°ΠΊΠΎΠΉ ситуации. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² прСдоставляСт мноТСствСнный доступ ΠΊ критичСской сСкции ΠΊΠΎΠ΄Π° со стороны Β«Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉΒ», ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ содСрТимого ΠΎΠ±Ρ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ устанавливаСт ΡΠΊΡΠΊΠ»ΡŽΠ·ΠΈΠ²Π½Ρ‹ΠΉ доступ для «писатСлСй». Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ рассмотрСн ΠΏΠΎΠ·ΠΆΠ΅.

β€’Β Π”ΠΎ сих ΠΏΠΎΡ€ ΠΌΡ‹ фактичСски рассматривали Ρ€Π°Π±ΠΎΡ‚Ρƒ сСмафора Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. Для большого количСства Π·Π°Π΄Π°Ρ‡ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅ΠΆΠΈΠΌ сСмафора ΠΈ являСтся основным. Однако возмоТности счСтного сСмафора, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСство ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² вСсьма спСцифичСских Π·Π°Π΄Π°Ρ‡Π°Ρ…, Π³Π΄Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ срСдства синхронизации Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΎΡ‚ программиста Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

ΠŸΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ счСтного сСмафора. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… всСгда шСл «вслСд» Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ выполнял Π½Π΅ΠΊΠΈΠ΅ цикличСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС ΠΈΡ… выполнСния ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этой схСмы Π½Π°ΠΌ понадобится сСмафор, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ.

<b>Β Β Β Β  ΠŸΠΎΡ‚ΠΎΠΊ А           ΠŸΠΎΡ‚ΠΎΠΊ Π’</b>

while (true)Β Β Β Β  while (true)

{Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  {

Β /* Ρ€Π°Π±ΠΎΡ‚Π° A; */Β Β  <i>/* sem_wait(&amp;sem); */</i>

Β sem_post(&amp;sem);Β  Ρ€Π°Π±ΠΎΡ‚Π° B;

}Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  }

ΠŸΠΎΡ‚ΠΎΠΊ А Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ счСтчик сСмафора Π½Π° 1, Π° ΠΏΠΎΡ‚ΠΎΠΊ Π’ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ стрСмится Β«Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ слабину» ΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ этот счСтчик Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ½ Π½Π΅ достигнСт нуля. Π’Π½Π΅ зависимости ΠΎΡ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ², дисциплины диспСтчСризации ΠΈΠ»ΠΈ Π»ΡŽΠ±Ρ‹Ρ… источников Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊ Π’ Π±ΡƒΠ΄Π΅Ρ‚ Β«ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΒ» Π·Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ А ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π΅ большС Ρ†ΠΈΠΊΠ»ΠΎΠ², Ρ‡Π΅ΠΌ Π΅Π³ΠΎ Β«Π²Π΅Π΄ΡƒΡ‰ΠΈΠΉΒ» ΠΏΠΎΡ‚ΠΎΠΊ.

ВсСми этими ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π³Π»Π°Π²Π½ΡƒΡŽ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ сСмафора: любой ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ состояниС (Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ счСтчик), Ρ‚Π΅ΠΌ самым дСлая это элСмСнт синхронизации ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ срСдством управлСния порядком выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ являСтся ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ инструмСнтом для построСния собствСнных срСдств планирования (диспСтчСризации) выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² вашСй систСмы. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ POSIX прСдусматриваСт Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Β«ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ…Β» сСмафоров, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ любой ΠΏΠΎΡ‚ΠΎΠΊ, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΉ Π»ΡŽΠ±ΠΎΠΌΡƒ процСссу, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΌΡƒΡΡ Π² систСмС, Π° Π² ОБ QNX ΠΊ сСмафорам ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΈ любой ΠΏΠΎΡ‚ΠΎΠΊ любого процСсса Π²ΠΎ всСй сСти QNX. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, сСмафор позволяСт ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ выполнСния Π·Π°Π΄Π°Ρ‡ Π΄Π°ΠΆΠ΅ для вашСй распрСдСлСнной сСтСвой систСмы.

НиТС ΠΌΡ‹ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠ°ΠΊ с Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ, Ρ‚Π°ΠΊ ΠΈ с ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ сСмафорами, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π² ОБ QNX. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сСмафорами ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅

&lt;semaphore.h&gt;
. Если для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ явно.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ сСмафорами

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сСмафора

QNX ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° сСмафоров β€” Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅. Π Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ сСмафору ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΈΠ· любого процСсса Π² систСмС (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΠΎ сСти QNET с Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ сСтСвого хоста), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π°ΠΊΠΎΠΉ сСмафор ΠΈΠΌΠ΅Π΅Ρ‚ ассоциированноС с Π½ΠΈΠΌ имя Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС QNX. НСобходимо ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ сСмафоры, ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… Ρ€Π°Π²Π½Ρ‹Ρ… условиях, ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ для своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ Π² систСмС ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний POSIX (mqueue).

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° сСмафоров сущСствуСт своя Π³Ρ€ΡƒΠΏΠΏΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒΡΡ.

sem_init()
ΠΈ
sem_destroy()
β€” созданиС ΠΈ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ сСмафора. ΠŸΡ€ΠΈ создании указываСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ доступа ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика сСмафора. Π‘ Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ сСмафором Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ нСльзя (это ΠΎΠ±Ρ‰Π΅Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ справСдливо ΠΈ для всСх ΠΈΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² синхронизации). ПослС Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ сСмафора Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ для использования.

ОбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ 0 Π² случаС успСха ΠΈ -1 Π² случаС ошибки. Код ошибки записываСтся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ

errno
. Π’ частности, функция
sem_init()
ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… выполнСния: