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

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

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

Β return (ClockCycles() - tb) * 1000 / cps;

}

const int MSGLEN = 80;

// потоковая функция сСрвСра:

void* server(void* chid) {

Β int rcvid;

Β char message[MSGLEN];

Β while (true) {

Β  rcvid = MsgReceive((int)chid, message, MSGLEN, NULL);

Β  sprintf(message + strlen(message), "[%07llu] ... ", mark());

Β  delay(TEMP); // имитация обслуТивания

Β  sprintf(message + strlen(message), [%07llu]->", mark());

Β  MsgReply(rcvid, EOK, message, strlen(message) + 1);

Β }

Β return NULL;

}

// потоковая функция ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°:

void* client(void* data) {

Β while (true) {

Β  char message[MSGLEN];

Β  sprintf(message, "%d:\t[%07llu]->", pthread_self(), mark());

Β  MsgSend((int)data, message, strlen(message) + 1, message, MSGLEN);

Β  sprintf(message + strlen(message), "[%07llu]", mark());

Β  cout << message << endl;

Β  static unsigned int seed = 0;

Β  delay(numclient*(((long)rand_r(&seed ) * TEMP / RAND_MAX) + TEMP));

Β  // имитация вычислСний...

Β }

Β return NULL;

}

int main(int argc, char** argv) {

Β // 1-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ - число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²:

Β if (argc > 1 && atoi(argv[1]) > 0)

Β  numclient = atoi(argv[1]);

Β tb = ClockCycles();

Β int chid = ChannelCreate(0);

Β if (pthread_create(NULL, NULL, server, (void*)chid) != EOK)

Β  perror("server create"), exit(EXIT_FAILURE);

Β for (int i = 0; i < numclient; i++)

Β  if (pthread_create(NULL, NULL, client,

Β Β  (void*)ConnectAttach(0, 0, chid, _NTO_SIDE_CHANNEL, 0)) != EOK)

Β Β  perror("client create"), exit(EXIT_FAILURE);

Β sigpause(SIGINT);

Β return EXIT_SUCCESS;

}

ВсС происходит Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ процСсса:

‒ БоздаСтся Π΅Π΄ΠΈΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ сСрвСра, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ сообщСний ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π½Π° Π½ΠΈΡ….

‒ БоздаСтся N ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² (задаСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки запуска прилоТСния), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ сСрвСру.

β€’Β Πš ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΊΠ°Π½Π°Π»Ρƒ сСрвСра устанавливаСтся N соСдинСний ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ².

β€’Β ΠšΠ°Π½Π°Π» ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΡ для сСрвСра ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ соСдинСний для ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΡΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ (Ρ‚.e. Π²Π½Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡ… Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ); ΠΈΡ… значСния ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ Π² ΠΏΠΎΡ‚ΠΎΠΊΠΈ (сСрвСра ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²) ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (Ρ‚Ρ€ΡŽΠΊ с ΠΏΠΎΠ΄ΠΌΠ΅Π½ΠΎΠΉ цСлочислСнных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΌΡ‹ рассматривали Ρ€Π°Π½Π΅Π΅).

β€’Β Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ продвигаСтся ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΊ сСрвСру ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ; Π² Ρ…ΠΎΠ΄Π΅ пСрСсылки объСм сообщСния нарастаСт: ΠΎΠ½ΠΎ образуСтся ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎΠ»Π΅ΠΉ, добавляСмых ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, сСрвСром ΠΈ снова ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ.

β€’Β Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниСм Π² Ρ‚Π΅Π»Π΅ самого сообщСния формируСтся тСкст, содСрТащий 5 ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉΒ β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ с сообщСниСм) ΠΈ 4 Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ (Π² миллисСкундах): ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сообщСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, ΠΏΡ€ΠΈΠ΅ΠΌΠ° сообщСния сСрвСром (Π½Π°Ρ‡Π°Π»ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ), ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° сообщСниС сСрвСром (ΠΊΠΎΠ½Π΅Ρ† ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ), ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ.

Запустим ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ:

# n1 5

И ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹, понаблюдаСм состояния (Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ) Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ

pidin
(с Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, СстСствСнно). Π’ΠΎΡ‚ нСсколько «снимков» состояний, здСсь ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ вСсь спСктр Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… состояний, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅:

5546027 1 ./n1Β  10r SIGSUSPEND

5546027 2 ./n1Β  10r NANOSLEEP

5546027 3 ./n1Β  10r NANOSLEEP

5546027 4 ./n1Β  10r SENDΒ Β Β Β Β Β  5546027

5546027 5 ./n1Β  10r REPLYΒ Β Β Β Β  5546027

5546027 6 ./n1Β  10r NANOSLEEP

5546027 7 ./n1Β  10r NANOSLEEP

5730347 1 ./n1Β  10r SIGSUSPEND

5730347 2 ./n1Β  10r RECEIVE 1

5730347 3 ./n1Β  10r NANOSLEEP

5730347 4 ./n1Β  10r NANOSLEEP

5730347 5 ./n1Β  10r NANOSLEEP

5730347 6 ./n1Β  10r NANOSLEEP

5730347 7 ./n1Β  10r NANOSLEEP

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ выполнСния (Π½Π° мСньшСм числС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π»Π΅Π³Ρ‡Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ):

# n1 3

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

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

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

3: [0002003]->[0002003] ... [0002504]->[0002505]

5: [0003462]->[0003462] ... [0003964]->[0003964]

4: [0003485]->[0003964] ... [0004466]->[0004466]

3: [0005017]->[0005017] ... [0005518]->[0005518]

5: [0005624]->[0005624] ... [0006126]->[0006126]

4: [0006741]->[0006741] ... [0007243]->[0007243]