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

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

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

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, оТидая ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π° клиСнтского запроса.