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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² QNX/Neutrino 2. Руководство ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² QNX Realtime PlatformΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 22

Автор Π ΠΎΠ± ΠšΡ‘Ρ€Ρ‚Π΅Π½

Π’ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° провСряСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ lo_water, ΠΈ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° increment, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π΅ достигнСт ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния β€” ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° maximum (ΠΈΠΌΠ΅Π½Π½ΠΎ поэтому число Π² столбцС «ВсСго ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Β» Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ 10, Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° условиС ΠΏΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ lo_water пСрСстаСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ).

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ наступаСт ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ блокирования большС Π½Π΅ остаСтся. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, находящиСся Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ свои Π΄Π΅Π»Π°. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ этом ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ с Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° hi_water.

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ Π Π΅ΠΆΠΈΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π Π΅ΠΆΠΈΠΌ блокирования ВсСго ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ 9 1 10 Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ 8 2 10 Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ 7 3 10 Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ 6 4 10 Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ 5 5 10 Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ 4 6 10 Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ 3 7 10 Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ 2 8 10 Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° hi_water 2 7 9 Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ 1 8 9 Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° hi_water 1 7 9 Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ 0 8 8 Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° hi_water 0 7 7

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ происходит Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° число Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ hi_water. РСализация здСсь Ρ‚Π°ΠΊΠΎΠ²Π°: ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ, ΠΎΠ½ провСряСт число Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΈ Ссли ΠΈΡ… слишком ΠΌΠ½ΠΎΠ³ΠΎ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ большС, Ρ‡Π΅ΠΌ прСдусмотрСно ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ hi_water), Ρ‚ΠΎ Β«ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ самоубийство». Удобство использования ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² lo_water ΠΈ hi_water Π² ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… структурах состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠΈ Π²Ρ‹ фактичСски Π·Π°Π΄Π°Π΅Ρ‚Π΅ «эффСктивный Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Β» числа ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ всСгда доступно достаточноС число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π±Π΅Π· нСобходимости Π½Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΈ Π½Π΅ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°ΡŽΡ‚ΡΡ. Π’ нашСм случаС, послС выполнСния дСйствий, пСрСчислСнных Π² Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ…, ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ систСму, которая способна ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄ΠΎ 4 запросов ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π±Π΅Π· нСобходимости Π² создании Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (7-4 = 3, Ρ‡Ρ‚ΠΎ соотвСтствуСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° lo_ water).

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΡƒΠ»Π°ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ достаточно Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π²Π»Π°Π΄Π΅Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΎΠΉ управлСния числом ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² ΠΏΡƒΠ»Π΅, Π΄Π°Π²Π°ΠΉΡ‚Π΅ обратимся ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ элСмСнтам Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΉ записи ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²:

// Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ дСскриптор ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

THREAD_POOL_HANDLE_T *handlΠ΅;


THREAD_POOL_PARAM_T *(*block_func)(

 THREAD_POOL_PARAM_T *ctp);


void (*unblock_func)(THREAD_POOL_PARAM_T *ctp);


int (*handler_func)(THREAD_POOL_PARAM_T *ctp);


THREAD_POOL_PARAM_T *(*context_alloc)(

 THREAD_POOL_HANDLE_T *handle);


void (*context_free)(THREAD_POOL_PARAM_T *ctp);

ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ обратимся ΠΊ рисунку Β«Π–ΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Β». Из рисунка Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ создании ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· вызываСтся функция context_alloc(). (Аналогично, ΠΏΡ€ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° вызываСтся функция context_tree()). Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΉ записи с ΠΈΠΌΠ΅Π½Π΅ΠΌ handler пСрСдаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ context_alloc() Π² качСствС Π΅Π΅ СдинствСнного ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Ѐункция context_alloc() отвСтствСнна Π·Π° ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ настройки ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° контСкст (списках ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ctp). Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ содСрТаниС этого указатСля β€” ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ваша Π·Π°Π±ΠΎΡ‚Π°; Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ всС Ρ€Π°Π²Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π² Π½Π΅Π³ΠΎ помСститС.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° контСкст создан Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ context_alloc(), вызываСтся функция block_func() для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² Ρ€Π΅ΠΆΠΈΠΌ блокирования. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ функция block_func() ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ context_alloc(). ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ функция block_func() разблокируСтся, ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° контСкст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ handler_func(). Ѐункция handler_func() ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Β«Ρ€Π°Π±ΠΎΡ‚Ρ‹Β» β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Ρ‚ΠΈΠΏΠΎΠ²ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½Π° ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ сообщСниС ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ принято, Ρ‡Ρ‚ΠΎ функция handler_func() Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π½ΡƒΠ»ΡŒ β€” Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ значСния Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ QSSL для Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. Ѐункция unblock_func() Ρ‚Π°ΠΊΠΆΠ΅ Π² настоящСС врСмя Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π°, поэтому просто ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ Ρ‚Π°ΠΌ NULL.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ прояснит ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ псСвдокода (ΠΎΠ½ основан всС Π½Π° Ρ‚ΠΎΠΌ ΠΆΠ΅ рисункС Β«Π–ΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² ΠΏΡƒΠ»Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Β»):

FOREVER DO

 IF (#threads < lo_water) THEN

  IF (#threads < maximum) THEN

   create new thread

   context = (*context_alloc)(handle);

  ENDIF

 ENDIF

 retval = (*block_func)(context);

 (*handler_func)(retval);

 IF (#threads > hi_water) THEN

  (*context_free)(context)

  kill thread

 ENDIF

DONE

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ привСдСнная Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° излишнС ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π°. Π•Π΅ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ состоит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π°ΠΌ ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ ctp ΠΈ handler ΠΈ Π΄Π°Ρ‚ΡŒ Π²Π°ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдставлСниС ΠΎΠ± Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ для управлСния числом ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

ДиспСтчСризация ΠΈ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΈΡ€

Π”ΠΎ настоящСго ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΌΡ‹ обсуТдали дисциплины диспСтчСризации ΠΈ состояния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π½ΠΎ практичСски Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ сказали ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈ ΠΊΠΎΠ³Π΄Π° происходит собствСнно ΠΏΠ΅Ρ€Π΅ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. БущСствуСт распространСнноС Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ «просто случаСтся», Π±Π΅Π·ΠΎ всяких Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½. И Π² ΠΎΠ±Ρ‰Π΅ΠΌ-Ρ‚ΠΎ, для проСктирования это довольно полСзная абстракция! Однако, ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ происходит ΠΏΠ΅Ρ€Π΅ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Вспомним рисунок Β«Π‘Ρ…Π΅ΠΌΠ° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° диспСтчСризации» (Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ «Роль ядра»).

ΠŸΠ΅Ρ€Π΅ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Ρ€ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹:

β€’ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅;

β€’ ΡΠΈΡΡ‚Π΅ΠΌΠ½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ²;

β€’ ΡΠ±ΠΎΠΉ (ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅).

ΠŸΠ΅Ρ€Π΅ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΌΡƒ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΡŽ

ΠŸΠ΅Ρ€Π΅ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ·-Π·Π° Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ прСрывания ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° Π΄Π²Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ:

β€’ ΠΏΠΎ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΡŽ ΠΎΡ‚ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ²;

β€’ ΠΏΠΎ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΡŽ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… срСдств.

Часы Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ пСриодичСскиС прСрывания для ядра, организуя ΠΏΠ΅Ρ€Π΅ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

НапримСр, Ссли Π²Ρ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅ Π²Ρ‹Π·ΠΎΠ² sleep(10), часы Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ число ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ; ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΡŽ ядро ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ систСмных часов. Когда систСмныС часы ΠΏΠΎΠΊΠ°ΠΆΡƒΡ‚, Ρ‡Ρ‚ΠΎ 10 сСкунд истСкли, ядро ΠΏΠ΅Ρ€Π΅ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ ваш ΠΏΠΎΡ‚ΠΎΠΊ, пСрСвСдя Π΅Π³ΠΎ Π² состояниС готовности (READY). (ΠœΡ‹ рассмотрим этот вопрос Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π² Π³Π»Π°Π²Π΅ «Часы, Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹ ΠΈ пСриодичСскиС увСдомлСния»).

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Π΅ прСрывания ΠΎΡ‚ Π²Π½Π΅ΡˆΠ½ΠΈΡ… устройств, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚, ТСсткий диск ΠΈΠ»ΠΈ Π°ΡƒΠ΄ΠΈΠΎ ΠΏΠ»Π°Ρ‚Ρ‹. Π’ этом случаС ΠΎΠ½ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ядрС, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅ΠΌ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅. ΠŸΠΎΡ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ пСрСупорядочСн ядром Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ядро сгСнСрируСт «событиС».

ΠŸΠ΅Ρ€Π΅ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ систСмным Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ

Если ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π΅Π»Π°Π΅Ρ‚ систСмный Π²Ρ‹Π·ΠΎΠ², ΠΏΠ΅Ρ€Π΅ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ выполняСтся Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ асинхронноС Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ.

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