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

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

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

ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²Π΅: адрСсат получатСля, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ направляСтся ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ сообщСниС, опрСдСляСтся ΠΏΡ€ΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ установлСнии ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° соСдинСния (coid β€” connect ID) Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ:

#include <sys/neutrino.h>

int ConnectAttach(int nd, pid_t Did, int chid,

 unsigned index, int flags);

АдрСс назначСния (сСрвСра) Π² этом Π²Ρ‹Π·ΠΎΠ²Π΅ опрСдСляСтся Ρ‚Ρ€ΠΈΠ°Π΄ΠΎΠΉ {ND/PID/CHID}, Π³Π΄Π΅:

nd β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ сСтСвого ΡƒΠ·Π»Π°. ΠœΡ‹ Π½Π΅ станСм ΡƒΠ³Π»ΡƒΠ±Π»ΡΡ‚ΡŒΡΡ Π² ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ сСтСвых ΡƒΠ·Π»ΠΎΠ² сСти QNET. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ Π½Π° Π·Π°ΠΌΠ΅Ρ‚ΠΊΡƒ лишь Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΠΌΠ΅Π½ сообщСниями с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒΡŽ осущСствляСтся ΠΊΠ°ΠΊ с процСссом Π½Π° локальном ΡƒΠ·Π»Π΅ (nd = 0), Ρ‚Π°ΠΊ ΠΈ Π½Π° любом Π΄Ρ€ΡƒΠ³ΠΎΠΌ сСтСвом ΡƒΠ·Π»Π΅.

pid β€” PID процСсса-сСрвСра, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ производится соСдинСниС.

chid β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΊΠ°Π½Π°Π»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Π» процСсс с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ PID, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ChannelCreate(), ΠΈ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ устанавливаСтся соСдинСниС Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ConnectAttach().

Π’Ρ‹ΡˆΠ΅ ΠΌΡ‹ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ с процСссом ΠΊΠ°ΠΊ с пассивной субстанциСй, Π²ΠΎΠΎΠ±Ρ‰Π΅ говоря, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ сообщСниями. Π₯отя Π² адрСсной Ρ‚Ρ€ΠΈΠ°Π΄Π΅ ΠΎΠ±ΠΌΠ΅Π½Π° Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ PID процСсса! Π­Ρ‚ΠΎ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ Π½Π΅ мСняСт полоТСния Π²Π΅Ρ‰Π΅ΠΉ: ΠΈΠΌΠ΅Π½Π½ΠΎ адрСсная ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° CHID ΠΈ опрСдСляСт Ρ‚ΠΎΡ‚ ΠΏΠΎΡ‚ΠΎΠΊ (часто это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ прилоТСния), с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ ΠΎΠ±ΠΌΠ΅Π½ сообщСниями, a PID опрСдСляСт Ρ‚ΠΎ адрСсноС пространство процСсса, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ направляСтся сообщСниС, адрСсованноС CHID.

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Π΅Π΅ это выглядит Ρ‚Π°ΠΊ: Π² ΠΊΠΎΠ΄Π΅ сСрвСра ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎΡ‚ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ MsgReceive*(chid, ...), ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ запроса ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° MsgSend*(). Аналогично ΠΈ Π² ΠΊΠΎΠ΄Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° вся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ выполнСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, обозначСнная Π²Ρ‹ΡˆΠ΅, Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΡƒ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΌΡƒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

coid = ConnectAttach(... , chid, ...);

MsgSend*(coid, ...);

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Π΄Π²ΡƒΡ… ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π°Π±Π·Π°Ρ†Π΅Π² Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Π±ΡƒΠΊΠ²ΠΎΠΉ Π½Π΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΡ‚ ΠΈ Π½Π΅ отмСняСт полоТСния Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ излоТСния [1] Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями микроядра. Π’ΠΎΠ³Π΄Π° Π·Π°Ρ‡Π΅ΠΌ ΠΆΠ΅ ΠΌΡ‹ Π΄Π°Π΅ΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΡƒ? Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π°ΠΊΡ†Π΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ всС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ состояния ΠΈ ΠΈΡ… освобоТдСниС ΠΈΠΌΠ΅ΡŽΡ‚ смысл ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²!), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ MsgSend*() β€” MsgReceive*() β€” MsgReply*() (Π΄Π°ΠΆΠ΅ Ссли это СдинствСнный ΠΏΠΎΡ‚ΠΎΠΊ β€” Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ прилоТСния, ΠΈ Ρ‚ΠΎΠ³Π΄Π° ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ процСссов). ΠŸΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ сказанноС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ (Ρ„Π°ΠΉΠ» n1.cc):

ОбмСн сообщСниями ΠΈ Π²Π·Π°ΠΈΠΌΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

#include <stdlib.h>

#include <stdio.h>

#include <unistd.h>

#include <inttypes.h>

#include <errno.h>

#include <iostream.h>

#include <pthread.h>

#include <signal.h>

#include <sys/neutrino.h>

#include <sys/syspage.h>


static const int TEMP = 500; // Ρ‚Π΅ΠΌΠΏ выполнСния прилоТСния

static int numclient = 1;    // число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²


// многопотоковая вСрсия Π²Ρ‹Π²ΠΎΠ΄Π° диагностики Π² ΠΏΠΎΡ‚ΠΎΠΊ:

iostream& operator <<(iostream& с, char* s) {

 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

 pthread_mutex_lock(&mutex);

 c << s << flush;

 pthread_mutex_unlock(&mutex);

 return c;

}


static uint64_t tb; // врСмСнная ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠ° Π½Π°Ρ‡Π°Π»Π° прилоТСния


// врСмСнная ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠ° Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ‹Π·ΠΎΠ²Π°:

inline uint64_t mark(void) {

 // частота процСссора:

 const static uint64_t cps =

  SYSPAGE_ENTRY(qtime)->cycles_per_sec;

 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]

...

Π’ΠΈΠ΄Π½ΠΎ, ΠΊΠ°ΠΊ 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]