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

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

Автор ОлСг Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ

К соТалСнию, ΠΈ тСхничСская докумСнтация QNX [8], ΠΈ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΊΠ½ΠΈΠ³Π° Π . ΠšΠ΅Ρ€Ρ‚Π΅Π½Π° [1] написаны ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ схСмС:[35] всС, Ρ‡Ρ‚ΠΎ касаСтся ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² синхронизации, Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΠΌΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ POSIX (Π±Π°Ρ€ΡŒΠ΅Ρ€Ρ‹, ТСсткая Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° (sleepon), спинлок, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния-записи), описываСтся Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΈ сопровоТдаСтся ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΊΠΎΠ΄Π°, Π° Π²ΠΎΡ‚ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ понятия, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ pthread_mutex_t, sem_t (Π΄Π° ΠΈ pthread_cond_t, ΠΏΠΎ сущСству), описаны лишь качСствСнно, Β«Π½Π° ΠΏΠ°Π»ΡŒΡ†Π°Ρ…Β», Π² ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… рассказах ΠΎΠ± Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅ пользования Π²Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ½Π°Ρ‚ΠΎΠΉ ΠΈ ΠΊΡƒΡ…Π½Π΅ΠΉ (Ρ‚Π΅Ρ€ΠΌΠΈΠ½ bathroom встрСчаСтся Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Ρ‡Π°Ρ‰Π΅, Ρ‡Π΅ΠΌ pthread_mutex_t). ΠœΡ‹ попытаСмся ΠΏΠΎ возмоТности ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот пСрСкос.

Π₯ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° интСрСсный Ρ„Π°ΠΊΡ‚. Π’ POSIX-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ API QNX прСдставлСн большой Π½Π°Π±ΠΎΡ€ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Ρ… срСдств синхронизации: ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹, условныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, сСмафоры, Π±Π°Ρ€ΡŒΠ΅Ρ€Ρ‹, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи, ΠΆΠ΄ΡƒΡ‰ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, спинлоки. Однако Π² Ρ€ΠΎΠ΄Π½ΠΎΠΌ native API QNX ΠΈΠ· всСго этого многообразия ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ всСго Ρ‚Ρ€ΠΈ элСмСнта синхронизации: ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, сСмафор ΠΈ условная пСрСмСнная. И это ΠΏΡ€ΠΈ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ условная пСрСмСнная Π½Π΅ являСтся ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ срСдством синхронизации ΠΈ примСняСтся ΠΊΠ°ΠΊ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°!

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всС ΠΌΠ½ΠΎΠ³ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ срСдств синхронизации, прСдоставляСмоС Π² POSIX API QNX, строится ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ этих ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… срСдств синхронизации. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π°Π½Π°Π»ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² систСмы ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ срСдства синхронизации, ΠΏΠΎΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ Π² POSIX API, строятся с использованиСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΈ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. МоТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π° мыотСкс-условная пСрСмСнная с ΠΎΠ΄Π½ΠΎΠΉ стороны ΠΈ сСмафор с Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΡΠ²Π»ΡΡŽΡ‚ΡΡ нСзависимыми базисами, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… позволяСт ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ практичСски любой, сколь ΡƒΠ³ΠΎΠ΄Π½ΠΎ спСцифичСский элСмСнт синхронизации, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΠΈΠΉ потрСбностям, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΈ построСнии вашСй систСмы. ΠœΡ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ эту ΠΌΡ‹ΡΠ»ΡŒ ΠΏΠΎΠ·ΠΆΠ΅, ΠΏΡ€ΠΈ рассмотрСнии особСнностСй примСнСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ².

НСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Π½Π°Π±ΠΎΡ€ элСмСнтов синхронизации окаТСтся ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ для Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Π²Π°ΠΌΠΈ систСмы, Π²Π°ΠΆΠ½Ρ‹ΠΌ являСтся Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ Π² случаС, Ссли ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Π΅ систСмой срСдства синхронизации ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ вас Π½Π΅ ΡƒΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚, Ρ‚ΠΎ Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ собствСнныС срСдства синхронизации, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ базис ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΈΡ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ. И ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ срСдства синхронизации Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ вас.

ΠœΡ‹ постараСмся ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту идСю ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ использования Π±Π°Π·ΠΎΠ²Ρ‹Ρ… срСдств синхронизации Π² качСствС «конструктора» ΠΏΡ€ΠΈ построСнии Π±ΠΎΠ»Π΅Π΅ слоТных. Π’Ρ€ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… элСмСнта синхронизации ОБ QNX β€” ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, условная пСрСмСнная ΠΈ сСмафор β€” Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ микроядра систСмы ΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

SyncTypeCreate(unsigned type, sync_t* sync, const struct _sync_attr_t* attr);

Π—Π΄Π΅ΡΡŒ type ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ значСния:

_NTO_SYNC_MUTEX_FREE β€” для создания ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°;

_NTO_SYNC_SEM β€” для создания сСмафора;

_NTO_SYNC_COND β€” для создания условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π΄Π²Π° Π²Π°ΠΆΠ½Ρ‹Ρ… Ρ„Π°ΠΊΡ‚Π°. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ‚ΠΈΠΏΡ‹ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° (pthread_mutex_t), условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (pthread_cond_t) ΠΈ сСмафора (sem_t) ΡΠ²Π»ΡΡŽΡ‚ΡΡ псСвдонимами Ρ‚ΠΈΠΏΠ° sync_t. А Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ρ‚ΠΈΠΏΡ‹ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ псСвдонимами ΠΎΠ΄Π½ΠΎΠ³ΠΎ-СдинствСнного Ρ‚ΠΈΠΏΠ° β€” sync_attr_t, содСрТащСго ΠΏΠΎΠ»Π΅ protocol, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ опрСдСляСт, ΠΊΠ°ΠΊΠΈΠΌ способом ОБ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π°Ρ€ΡŒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹ Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΠΈΡ… инвСрсии.

Π’ соотвСтствии с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ QNX 6.2.1 это ΠΏΠΎΠ»Π΅ присутствуСт Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² всСх Ρ‚Ρ€Π΅Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² синхронизации, Π½ΠΎ доступно ΠΎΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для пСрСопрСдСлСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ². По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° вмСсто attr пСрСдаСтся NULL) ΠΏΠΎΠ»Π΅ protocol ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PTHREAD_PRIO_INHERIT. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ОБ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» наслСдования ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² для прСдотвращСния инвСрсии.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, всС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ синхронизации QNX Π² Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ эффСкт инвСрсии ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ². Однако Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π²Π°ΠΆΠ½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π° вопроса: Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ситуации инвСрсии ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ², ΠΈ Ссли Π΄Π°, Ρ‚ΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ Π»ΠΈ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² ΠΏΡ€Π΅ΠΏΡΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ возникновСнию инвСрсии (Π² качСствС ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ этого утвСрТдСния ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² Ρ‚ΠΈΠΏΠ° Π±Π°Ρ€ΡŒΠ΅Ρ€).

ВСсты [4] ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ² наслСдованиСм ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² (ΠΈΠ»ΠΈ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ) ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ прСдотвращаСтся Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ инвСрсии ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ². По-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡƒ, Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ это связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ сама ΠΏΠΎ сСбС инвСрсия ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° ΠΈΠ· всСх элСмСнтов синхронизации Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ ΠΈΠ· Π΅Π³ΠΎ наслСдников (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния-записи).

Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ (счСтный)

Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ являСтся вСсьма спСцифичСским (Π² сравнСнии с ΠΏΡ€ΠΎΡ‡ΠΈΠΌΠΈ) для ОБ QNX срСдством синхронизации, ΠΈ хотя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ стандартом POSIX, Π΄Π°ΠΆΠ΅ сСмантика этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ отличаСтся ΠΎΡ‚ всСх ΠΏΡ€ΠΎΡ‡ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² синхронизации.

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

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сСмафором ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ стандартом POSIX 1003.1 (1993) Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π° Π½Π΅ стандартом POSIX 1003b (1995), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ pthread_* ΠΈ всС Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ синхронизации; соотвСтствСнно Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ манипулирования сСмафорами Π½Π΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с прСфикса pthread_*.

Π’ классичСской Ρ€Π°Π±ΠΎΡ‚Π΅ ДСйкстры [10] сСмафор опрСдСляСтся ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π°Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ провСсти Π΄Π²Π΅ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ счСтчика β€” ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ счСтчик Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ мСньшС нуля. Если Π½Π΅ΠΊΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ пытаСтся ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ счСтчика сСмафора, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡƒΠΆΠ΅ Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ, Ρ‚ΠΎ этот ΠΏΠΎΡ‚ΠΎΠΊ блокируСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ счСтчик сСмафора Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ€Π°Π²Π½ΠΎΠ΅ 1 ΠΈΠ»ΠΈ большС (посрСдством воздСйствия Π½Π° Π½Π΅Π³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²). Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ смоТСт ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния.

ΠŸΡ€ΠΈΠ½ΡΡ‚ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ сСмафоры Π΄Π²ΡƒΡ… Π²ΠΈΠ΄ΠΎΠ²: Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅, счСтчик ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ значСния 0 Π»ΠΈΠ±ΠΎ 1, ΠΈ счСтныС, ΠΈΠ»ΠΈ простыС, счСтчик ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ большиС ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния. Π’ QNX 6.2.1 максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика опрСдСляСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ SEM_VALUE_MAX, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π²Π½ΠΎ 32 767.

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚: сСмафор являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ простым ΠΈ соотвСтствСнно Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ срСдством синхронизации. И классичСскиС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ использования рСсурсов, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π² Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π­. ДСйкстрой, Π±Π°Π·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° понятии сСмафора. Однако Π² случаС систСм Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ сСмафоров для раздСлСния доступа ΠΊ рСсурсу Π²Π»Π΅Ρ‡Π΅Ρ‚ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ возникновСния инвСрсии ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² [4], ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½ΠΈΠΊΠ°ΠΊ нСльзя.

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° этого Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сСмафор ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ своСго Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° (Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ²ΡˆΠ΅Π³ΠΎ Π΅Π³ΠΎ), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ счСтного сСмафора Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°, Π° Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ сСмафор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π»ΠΈΡ‡Π°Π΅Ρ‚ своСго Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° (ΠΏΠΎΡ‚ΠΎΠΊ, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠΈΠΉ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π° ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ сСмафору), ΡƒΠΆΠ΅ пСрСстаСт Π±Ρ‹Ρ‚ΡŒ собствСнно сСмафором ΠΈ называСтся ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ, ΠΈΠ»ΠΈ эксклюзивной Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ. По-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡƒ, ΠΈΠΌΠ΅Π½Π½ΠΎ этим ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎΠΌ Π²Ρ‹Π·Π²Π°Π½ Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ синхронизации QNX, Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ native API, Π½ΠΎ прСдоставляСмыС Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ API POSIX, строятся Π±Π΅Π· использования сСмафоров.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ схСма Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСмафора позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ максимально ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ ΠΊΡ€ΡƒΠ³Π° Π·Π°Π΄Π°Ρ‡. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСсколько схСматичных ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²:

β€’ ΠžΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ условия (ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅). Часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ (Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ) ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ наступит Π½Π΅ΠΊΠΎΠ΅ событиС (выполнится условиС). Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ остановлСнный ΠΏΠΎΡ‚ΠΎΠΊ Π² Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ, Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΊ этому Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ. ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ сСмафор Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ:

      ΠŸΠΎΡ‚ΠΎΠΊ А             ΠŸΠΎΡ‚ΠΎΠΊ Π’

while (!expression)  expression = true;

sem_wait(&sem);      sem_post(&sem);

Π’ этом случаС ΠΏΠΎΡ‚ΠΎΠΊ А ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ выполнСния Π½Π΅ΠΊΠΎΠ΅Π³ΠΎ условия (опСрация sem_wait()), Π° ΠΏΠΎΡ‚ΠΎΠΊ Π’ увСдомляСт (опСрация sem_post()) ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ условия Π»ΡŽΠ±Ρ‹Π΅ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ этого условия ΠΏΠΎΡ‚ΠΎΠΊΠΈ.

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

Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ конструкция while() здСсь Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ ΠΈ простым if(), Π½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° выполнСния условия ΠΈ послС разблокирования ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ строгой Ρ„ΠΎΡ€ΠΌΠΎΠΉ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ систСмС, особСнно Ссли выполнСния условия ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

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