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

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

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

...

Π’ΠΈΠ΄Π½ΠΎ, ΠΊΠ°ΠΊ 3 ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ сообщСния ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ([

0000000
]), ΠΏΠΎΡ‚ΠΎΠΊ сСрвСра (TID = 2) Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ сообщСниС ([
0000000
], 1-я строка), ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ с TID = 3, Π΄Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… сообщСния (ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² с TID = 4 ΠΈ 5) ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ систСмой Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ обслуТивания (строки 2 ΠΈ 3). ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ обслуТивания запроса ΠΎΡ‚ TID = 3 ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π° ([
0000501
]) ΠΏΠΎΡ‚ΠΎΠΊ сСрвСра ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ (извлСкаСтся ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Ρ€Π°Π½Π΅Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ΅ сообщСниС) сообщСниС ΠΎΡ‚ TID = 4 ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Π•Ρ‰Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚Π΅Π»ΡŒΠ½Π΅Π΅ для ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ становится ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Π° для большСго числа ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² (здСсь ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… запросов становится Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π΄Π»ΠΈΠ½Π½Π΅Π΅, Π° Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ прСдсказуСмым - ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запрос ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ обслуТивания), Π½ΠΎ эти Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Π° для ΠΈΡ… осмыслСния:

# n1 10

3:Β  [0000000]->[0000000] ... [0000501]->[0000501]

4:Β  [0000000]->[0000501] ... [0001003]->[0001003]

5:Β  [0000000]->[0001003] ... [0001505]->[0001505]

6:Β  [0000000]->[0001505] ... [0002007]->[0002007]

7:Β  [0000000]->[0002007] ... [0002508]->[0002508]

8:Β  [0000000]->[0002508] ... [0003010]->[0003010]

9:Β  [0000000]->[0003010] ... [0003512]->[0003512]

10: [0000000]->[0003512] ... [0004014]->[0004014]

11: [0000000]->[0004014] ... [0004516]->[0004516]

12: [0000000]->[0004516] ... [0005017]->[0005018]

3:Β  [0005501]->[0005501] ... [0006003]->[0006003]

5:Β  [0008024]->[0008024] ... [0008526]->[0008526]

7:Β  [0008038]->[0008526] ... [0009028]->[0009028]

4:Β  [0009273]->[0009273] ... [0009775]->[0009775]

6:Β  [0010377]->[0010377] ... [0010878]->[0010878]

8:Β  [0010590]->[0010878] ... [0011380]->[0011380]

9:Β  [0010952]->[0011380] ... [0011882]->[0011882]

12: [0011297]->[0011882] ... [0012384]->[0012384]

11: [0011356]->[0012384] ... [0012886]->[0012886]

10: [0012024]->[0012886] ... [0013387]->[0013388]

3:Β  [0012874]->[0013388] ... [0013889]->[0013889]

7:Β  [0014888]->[0014888] ... [0015390]->[0015390]

4:Β  [0016254]->[0016254] ... [0016756]->[0016756]

5:Β  [0017646]->[0017646] ... [0018148]->[0018148]

6:Β  [0019088]->[0019088] ... [0019590]->[0019590]

11: [0020206]->[0020206] ... [0020708]->[0020708]

8:Β  [0020320]->[0020708] ... [0021210]->[0021210]

10: [0021078]->[0021210] ... [0021712]->[0021712]

12: [0021384]->[0021712] ... [0022213]->[0022213]

7:Β  [0021630]->[0022213] ... [0022715]->[0022715]

9:Β  [0021811]->[0022715] ... [0023217]->[0023217]

3:Β  [0022009]->[0023217] ... [0023719]->[0023719]

ДинамичСский ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

ДинамичСский ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π΅ являСтся ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ спСцифичСским ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ, ΠΏΡ€ΠΎΠ΄ΠΈΠΊΡ‚ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ микроядСрной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ QNX. Π­Ρ‚ΠΎ удачная искусствСнная конструкция, всС опрСдСлСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² Ρ„Π°ΠΉΠ»Π΅

<sys/dispatch.h>
. Π£Π΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² составС API QNX имССтся Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ инструмСнты ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ОБ.

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

ДинамичСский ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½ΡƒΠΆΠ΅Π½ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ QNX Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΊΠ°ΠΊ инструмСнт построСния ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² рСсурсов - основы построСния сСрвисов ОБ QNX. Но ΠΈ ΠΏΠΎΠΌΠΈΠΌΠΎ этой Ρ†Π΅Π»ΠΈ динамичСский ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² прСдставляСт собой ΠΌΠΎΡ‰Π½Π΅ΠΉΡˆΠ΅Π΅ срСдство для конструирования ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

ΠŸΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ динамичСского ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Π½Π°ΠΌΠΈ описан Π² ΠΊΠ½ΠΈΠ³Π΅ [4] Π² Π³Π»Π°Π²Π΅ Β«Π‘Π΅Ρ€Π²Π΅Ρ€ TCP/IP... ΠΌΠ½ΠΎΠ³ΠΎ сСрвСров Ρ…ΠΎΡ€ΠΎΡˆΠΈΡ… ΠΈ Ρ€Π°Π·Π½Ρ‹Ρ…Β». По сути, это Ρ€Π΅Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ TCP/IP-сСрвСр, Π½ΠΎ сСйчас это для нас Π½Π΅Π²Π°ΠΆΠ½ΠΎ:

Π‘Π΅Ρ€Π²Π΅Ρ€ Π½Π° Π±Π°Π·Π΅ динамичСского ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

#include <pthread.h>

#include <sys/dispatch.h>

static int ls; // ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ TCP-сокСт

THREAD_POOL_PARAM_T* alloc(THREAD_POOL_HANDLE_T* h) {

Β return (THREAD_POOL_PARAM_T*)h;

}

// функция блокирования ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

THREAD_POOL_PARAM_T* block(THREAD_POOL_PARAM_T* p) {

Β int rs = accept(ls, NULL, NULL);

Β if (rs < 0) errx("accept error");

Β return(THREAD_POOL_PARAM_T*)rs;

}

int handler(THREAD_POOL_PARAM_T* p) {

Β retrans((int)p);

Β close((int)p);

Β delay(250);

Β cout << pthread_self() << flush;

Β return 0;

}