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

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

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

# nice -n-19 sy10 500 .2

evaluation time: 1.2296 sec.

# nice -n-19 sy11 500 .2

evaluation time: 1.24973 sec.

# nice -n-19 sy12 500 .2

evaluation time: 0.440904 sec.

ΠŸΡ€ΠΈ «ТСсткой» Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅ ΠΌΡ‹ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° Π·Π° счСт ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ выполнСния запросов ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, Π° ΠΏΡ€ΠΈ использовании Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи β€” 3-ΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ. ΠŸΡ€ΠΎΠ΄Π΅Π»Π°Π΅ΠΌ Ρ‚ΠΎ ΠΆΠ΅ самоС, Π½ΠΎ Π² условиях Π³ΠΎΡ€Π°Π·Π΄ΠΎ мСньшСй интСнсивности обновлСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° запросов:

# nice -n-19 sy10 500 .02

evaluation time 0.989699 sec.

# nice -n-19 sy11 500 .02

evaluation time 0.98391 sec.

# nice -n-19 sy12 500 .02

evaluation time 0.0863443 sec.

Π’Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ становится Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ 10-ΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΌ.

ΠŸΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ (sy10.cc, sy11.cc, sy12.cc) Π² Π²Ρ‹ΡΡˆΠ΅ΠΉ стСпСни условны: ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Π° происходящСго Π±ΡƒΠ΄Π΅Ρ‚ сущСствСнно Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈ Π·Π°ΠΌΠ΅Π½Π΅ пассивного оТидания (delay()) Π½Π° Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ процСссорныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Π½ΠΎ ΠΎΠ±Ρ‰ΠΈΠ΅ Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ.

Π‘ΠΏΠΈΠ½Π»ΠΎΠΊ

Π‘ΠΏΠΈΠ½Π»ΠΎΠΊ, ΠΈΠ»ΠΈ «крутящаяся» Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для примСнСния Π² систСмах SMP (Symmetrical Multi-Processing), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π² многопроцСссорных систСмах. ПовСдСниС спинлока практичСски ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ классичСскому ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡƒ, Π·Π° СдинствСнным ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ β€” ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ блокируСтся ΠΈ Π½Π΅ вытСсняСтся. НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅, Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ многопроцСссорной систСмС! ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ спинлока являСтся Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° выполнСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ ΠΎΠ½ΠΈ для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚Π΅Ρ€ΡŒ, связанных с ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ контСкстов.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с «крутящСйся» Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ <Ρ€thread.h>. Π‘Π°ΠΌΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ, ΠΈ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ возмоТности ΠΏΠΎ настройкС. Π‘ΠΏΠΈΠ½Π»ΠΎΠΊ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Ρ‹. ПоявлСниС этого элСмСнта синхронизации Π² QNX Neutrino связано с трСбованиями стандарта POSIX 1003.1j (draft).

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ со спинлоком

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ спинлока

int pthread_spin_init(pthread_spinlock_t* spinner, int pshared);

Ѐункция ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ синхронизации спинлока Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ spinner, ΠΈ устанавливаСт для Π½Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ доступа ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… процСссов Π² соотвСтствии со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ pshared. Π­Ρ‚Π° пСрСмСнная ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния:

β€’ PTHREAD_PROCESS_SHARED β€” с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ спинлок ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ любого процСсса, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π³ΠΎ доступ ΠΊ памяти, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ распрСдСлСн ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ спинлок;

β€’ PTHREAD_PROCESS_PRIVATE β€” доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ синхронизации Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² процСсса, ΠΈΠ· адрСсного пространства ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±Ρ‹Π»Π° распрСдСлСна ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° синхронизации.

Π’ случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠ΄ΠΎΠ² ошибок:

AGAIN β€” систСмС Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ рСсурсов для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ;

EBUSY β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ крутящСйся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ spinner, ΡƒΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½;

EINVAL β€” Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ spinner;

ENOMEM β€” систСма Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ достаточного количСства свободной памяти для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

int pthread_spin_destroy(pthread_spinlock_t* spinner);

Ѐункция Π΄Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ крутящСйся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. ПослС Π΄Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ примСнСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ вновь ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, Ссли ΠΏΠΎΡ‚ΠΎΠΊ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ крутится Π½Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ spinner, Π»ΠΈΠ±ΠΎ Ссли ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ spinner Π½Π΅ Π±Ρ‹Π» ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния:

EOK β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅;

EBUSY β€” Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½Π°;

EINVAL β€” Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ spinner.

Π—Π°Ρ…Π²Π°Ρ‚ ΠΈ освобоТдСниС спинлока

int pthread_spin_lock(pthread_spinlock_t* spinner);

int pthread_spin_trylock(pthread_spinlock_t* spinner);

Π­Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Ρ…Π²Π°Ρ‚Π° ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π·Π°Ρ…Π²Π°Ρ‚Π° крутящСйся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ соотвСтствСнно. Как ΠΈ для ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, Ссли ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ spinner Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π·Π°Ρ…Π²Π°Ρ‚Π° свободСн, Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ, Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ ΠΎΠ΄Π½Ρƒ ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, становится Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ крутящСйся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Если spinner ΡƒΠΆΠ΅ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Ρ‚ΠΎ Π² случаС Π²Ρ‹Π·ΠΎΠ²Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ· рассматриваСмых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ возвращаСтся Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π° Π² случаС простого Π·Π°Ρ…Π²Π°Ρ‚Π° (пСрвая функция) Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ «крутится», Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ остаСтся Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ, Π½ΠΎ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ управлСния Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ синхронизации Π½Π΅ освободится.

ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Π·Π°Ρ…Π²Π°Ρ‚Π° крутящСйся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

EOK β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅;

EAGAIN β€” нСдостаточно рСсурсов систСмы для Π·Π°Ρ…Π²Π°Ρ‚Π° spinner;

EDEADLK β€” Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΡƒΠΆΠ΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚ spinner;

EINVAL β€” spinner β€” Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° pthread_spinlock_t;

EBUSY β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ (для pthread_spin_trylock()).

int pthread_spin_unlock(pthread_spinlock_t* spinner);

Π’Ρ‹Π·ΠΎΠ² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ освобоТдаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ крутящСйся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ spinner.

Ѐункция ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ значСния:

EOK β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅;

EINVAL β€” Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ spinner;

EPERM β€” Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ являСтся Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ крутящСйся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ.

5. БпСцифичСскиС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ QNX

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма QNX ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ вся построСна Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрных ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Ρ‚Π΅ΠΊΠ°ΡŽΡ‚ ΠΈΠ· микроядСрной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями микроядра. ΠœΡ‹ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΠΌ эти ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ арсСнал возмоТностСй, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΈΡ… ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ описаниС ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎ Π±Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ (ΠΏΠΎΠ»Π½ΠΎΠ΅ описаниС см. Π² тСхничСской Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ QNX ΠΏΠΎ систСмной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅). Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π»ΡƒΡ‡ΡˆΠ°Ρ ΠΊΠ½ΠΈΠ³Π° ΠΏΠΎ ΠΎΠ±ΠΌΠ΅Π½Ρƒ сообщСниями микроядра ΡƒΠΆΠ΅, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, написана ΠΈ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Π° Π½Π° русский язык [1]. Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎ всСму ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Β«ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями», написанноС Π’. Π—Π°ΠΉΡ†Π΅Π²Ρ‹ΠΌ ΠΈ Ρ€Π°Π½Π΅Π΅ Π½Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π²ΡˆΠ΅Π΅ΡΡ, содСрТит ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· этого ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Π³Π»Π°Π²Π΅ ΠΌΡ‹ лишь ΠΊΡ€Π°Ρ‚ΠΊΠΎ рассмотрим вопросы ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ° ΠΈ синхронизации, присущиС самой микроядСрной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ систСмы.

ОбмСн сообщСниями микроядра

МодСль ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями β€” это Ρ‚ΠΎΡ‚ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ стоит Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° любой микроядСрной ОБ, ΠΊΠ°ΠΊ Π½Π° Ρ‚Ρ€Π΅Ρ… ΠΊΠΈΡ‚Π°Ρ…: SEND β€” RECEIVE β€” REPLY. ОбмСн сообщСниями микроядра построСн Π½Π° Ρ‚Ρ€Π΅Ρ… Π³Ρ€ΡƒΠΏΠΏΠ°Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² native API QNX (рис. 5.1):

1. ΠŸΡ€ΠΈΠ½ΡΡ‚ΡŒ сообщСниС. ΠŸΡ€ΠΎΡ†Π΅ΡΡ[38], ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ сСрвСром Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ услуги, выполняСт Π²Ρ‹Π·ΠΎΠ² Π³Ρ€ΡƒΠΏΠΏΡ‹ MsgReceive*()[39], фактичСски сообщая этим ΠΎ готовности ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ запрос ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΈ этом Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ состояниС со статусом RECEIVE, оТидая ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π° клиСнтского запроса.

2. ΠŸΠΎΡΠ»Π°Ρ‚ΡŒ сообщСниС. ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈΠΉ процСсс Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ эту услугу, посылая сообщСниС Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ MsgSend*(), ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ состояниС со статусом SEND. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ осущСствляСтся ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π° ΠΎΡ‡Π΅Π½ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ врСмя, ΠΏΠΎΠΊΠ° сСрвСр Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ Π΅Π³ΠΎ сообщСниС ΠΈ Π½Π΅ Π½Π°Ρ‡Π½Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСрвСр ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ посланноС сообщСниС, ΠΎΠ½ разблокируСтся ΠΈ мСняСт статус с RECEIVE Π½Π° READY. Π‘Π΅Ρ€Π²Π΅Ρ€ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ сообщСния, Π° статус Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ клиСнтского процСсса мСняСтся Π½Π° REPLY.

3. ΠžΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ сообщСниС. Π—Π°Π²Π΅Ρ€ΡˆΠΈΠ² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ шагС сообщСния, сСрвСр выполняСт Π²Ρ‹Π·ΠΎΠ² Π³Ρ€ΡƒΠΏΠΏΡ‹ MsgReply*() для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅ΠΌΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ. ПослС этого Π²Ρ‹Π·ΠΎΠ²Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π½Π° Π²Ρ‹Π·ΠΎΠ²Π΅ MsgSend*() со статусом REPLY, разблокируСтся (ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС READY). ПослС выполнСния MsgReply*() сСрвСр Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС READY. Однако Ρ‡Π°Ρ‰Π΅ всСго сСрвСр снова Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ состояниС Π½Π° Π²Ρ‹Π·ΠΎΠ²Π΅ MsgReceive*(), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΊΠ°ΠΊ бСсконСчный Ρ†ΠΈΠΊΠ».

Рис. 5.1. ОбмСн сообщСниями микроядра ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ рСсурсов

Π£ΠΆΠ΅ ΠΈΠ· этого повСрхностного описания понятно, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° сообщСний микроядра β€” это Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ срСдство взаимодСйствия процСссов с ΠΎΠ±ΠΌΠ΅Π½ΠΎΠΌ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Π½ΠΎ ΠΈ ΠΊΡ€Π°ΠΉΠ½Π΅ гибкая систСма синхронизации всСх участников взаимодСйствия.

ΠœΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ вопросы: Π­Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² (ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹?), Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… базируСтся ОБ QNX? КакоС это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ взаимодСйствиям Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ POSIX API? Π‘Π°ΠΌΠΎΠ΅ прямоС! ВсС Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ POSIX (open(), read(), … ΠΈ всС Π΄Ρ€ΡƒΠ³ΠΈΠ΅) Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² ОБ QNX ΠΊΠ°ΠΊ ΠΎΠ±ΠΌΠ΅Π½ сообщСниями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ «камуфлируСтся» ΠΏΠΎΠ΄ стандарты Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΎΠΉ использования ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² рСсурсов, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ Π΅Ρ‰Π΅ Π²ΠΏΠ΅Ρ€Π΅Π΄ΠΈ.

ВСхнология ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями микроядра Ρ…ΠΎΡ€ΠΎΡˆΠΎ описана [1] ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ для своСго понимания ΠΈ освоСния Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ изучСния. Π’ этой ΠΆΠ΅ Π³Π»Π°Π²Π΅, посвящСнной ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π°ΠΌ, ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ эту Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡŽ.