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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: взаимодСйствиС процСссов». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 117

Автор Уильям БтивСнс

ПpoΠ³Ρ€aΠΌΠΌa измСрСния Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ для ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний Posix ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² листингС А.15.

Листинг А. 15. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° измСрСния Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ для ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний Posix

//bench/lat_pxmsg.с

1  #include "unpipc.h"

2  #define NAME1 "lat_pxmsg1"

3  #define NAME2 "lat_pxmsg2"

4  #define MAXMSG 4 /* мСсто для 4096 Π±Π°ΠΉΡ‚ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ */

5  #define MSGSIZE 1024


6  void

7  doit(mqd_t mqsend, mqd_t mqrecv)

8  {

9   char buff[MSGSIZE];

10  Mq_send(mqsend, buff, 1.0);

11  if (Mq_receive(mqrecv, buff, MSGSIZE, NULL) != 1)

12   err_quit("mq_receive error");

13 }


14 int

15 main(int argc, char **argv)

16 {

17  int i, nloop;

18  mqd_t mq1, mq2;

19  char buff[MSGSIZE];

20  pid_t childpid;

21  struct mq_attr attr;

22  if (argc != 2)

23   err_quit("usage: lat_pxmsg <#loops>");

24  nloop = atoi(argv[1]);

25  attr.mq_maxmsg = MAXMSG;

26  attr.mq_msgsize = MSGSIZE;

27  mq1 = Mq_open(Px_ipc_name(NAME1), O_RDWR | O_CREAT, FILE_MODE, &attr);

28  mq2 = Mq_open(Px_ipc_name(NAME2), O_RDWR | O_CREAT, FILE_MODE, &attr);

29  if ((childpid = Fork()) == 0) {

30   for(;;) { /* Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс */

31    if (Mq_receive(mq1, buff, MSGSIZE, NULL) != 1)

32     err_quit("mq_receive error");

33    Mq_send(mq2, buff, 1.0);

34   }

35   exit(0);

36  }

37  /* Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс */

38  doit(mq1, mq2);

39  Start_time();

40  for (i = 0; i < nloop; i++)

41   doit(mq1, mq2);

42  printf("latency: %.3f usec\n", Stop_time() / nloop);

43  Kill(childpid, SIGTERM);

44  Mq_close(mq1);

45  Mq_close(mq2);

46  Mq_unlink(Px_ipc_name(NAMED);

47  Mq_unlink(Px_ipc_name (NAME2));

48  exit(0);

49 }

25-28 Π‘ΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π΄Π²Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΎΠ΄Π½Ρƒ сторону. Π₯отя для ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ Posix ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ сообщСний, функция mq_receive всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сообщСниС с Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ, поэтому ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лишь ΠΎΠ΄Π½Ρƒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ прилоТСния.

Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний System V

Π’ листингС А.16 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ для ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний System V.

Листинг А.16. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ для ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний System V

//bench/lat_svmsg.c

1  #include "unpipc.h"

2  struct msgbuf p2child = { 1, { 0 } }; /* type = 1 */

3  struct msgbuf child2p = { 2, { 0 } }; /* type = 2 */

4  struct msgbuf inbuf;


5  void

6  doit(int msgid)

7  {

8   Msgsnd(msgid, &p2child, 0, 0);

9   if (Msgrcv(msgid, &inbuf, sizeof(inbuf.mtext), 2, 0) != 0)

10   err_quit("msgrcv error");

11 }


12 int

13 main(int argc, char **argv)

14 {

15  int i, nloop, msgid;

16  pid_t childpid;

17  if (argc != 2)

18   err_quit("usage: lat_svmsg <#loops>");

19  nloop = atoi(argv[1]);

20  msgid = Msgget(IPC_PRIVATE, IPC_CREAT | SVMSG_MODE);

21  if ((childpid = Fork()) == 0) {

22   for(;;) { /* Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс */

23    if (Msgrcv(msgid, &inbuf, sizeof(inbuf.mtext), 1, 0) != 0)

24     err_quit("msgrcv error");

25    Msgsnd(msgid, &child2p, 0, 0);

26   }

27   exit(0);

28  }

29  /* Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс */

30  doit(msgid);

31  Start_time();

32  for (i = 0; i < nloop; i++)

33   doit(msgid);

34  printf("latency: %.3f usec\n", Stop_time() / nloop);

35  Kill(childpid, SIGTERM);

36  Msgctl(msgid, IPC_RMID, NULL);

37  exit(0);

38 }

ΠœΡ‹ создаСм ΠΎΠ΄Π½Ρƒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ сообщСния ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ±ΠΎΠΈΡ… направлСниях. БообщСния с Ρ‚ΠΈΠΏΠΎΠΌ 1 ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΌΡƒ, Π° сообщСния с Ρ‚ΠΈΠΏΠΎΠΌ 2 β€” Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ сторону. Π§Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ msgrcv Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ doit ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 2, Ρ‡Ρ‚ΠΎ обСспСчиваСт ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ сообщСний Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Аналогично Π² Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΌ процСссС Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ msgrcv ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Π’ Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… 9.3 ΠΈ 11.3 ΠΌΡ‹ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ структуры, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² ядрС, нСльзя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ статичСски, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ стандарты Posix.1 ΠΈ Unix 98 Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ лишь Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ Π² этих структурах, Π½ΠΎ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π½ΠΈ ΠΈΡ… порядок, Π½ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ»Π΅ΠΉ. Π’ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ структуру msgbuf статичСски, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний System V Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎ эта структура содСрТит ΠΏΠΎΠ»Π΅ Ρ‚ΠΈΠΏΠ° сообщСния long, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° измСрСния Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ интСрфСйса Π΄Π²Π΅Ρ€Π΅ΠΉ

ПpoΠ³Ρ€aΠΌΠΌa измСрСния Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ для интСрфСйса Π΄Π²Π΅Ρ€Π΅ΠΉ Π΄Π°Π½Π° Π² листингС А.17. Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс создаСт Π΄Π²Π΅Ρ€ΡŒ ΠΈ связываСт с Π½Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ server. Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π΄Π²Π΅Ρ€ΡŒ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ door_call Π² Ρ†ΠΈΠΊΠ»Π΅. Π’ качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° пСрСдаСтся 1 Π±Π°ΠΉΡ‚ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ возвращаСтся.

Листинг А.17. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° измСрСния Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ интСрфСйса Π΄Π²Π΅Ρ€Π΅ΠΉ

//bench/lat_door.c

1  #include "unpipc.h"


2  void

3  server(void *cookie, char *argp, size_t arg_size,

4   door_desc_t *dp, size_t n_descriptors)

5  {

6   char c;

7   Door_return(&c, sizeof(char), NULL, 0);

8  }


9  int

10 main(int argc, char **argv)

11 {

12  int i, nloop, doorfd, contpipe[2];

13  char c;

14  pid_t childpid;

15  door_arg_t arg;

16  if (argc != 3)

17   err_quit("usage: lat_door <pathname> <#loops>");

18  nloop = atoi(argv[2]);

19  unlink(argv[1]);

20  Close(Open(argv[1], O_CREAT | O_EXCL | O_RDWR, FILE_MODE));

21  Pipe(contpipe);

22  if ((childpid = Fork()) == 0) {

23   doorfd = Door_create(server, NULL, 0);

24   Fattach(doorfd, argv[1]);

25   Write(contpipe[1], &c, 1);

26   for(;;) /* Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс = сСрвСр */

27    pause();

28   exit(0);

29  }

30  arg.data_ptr = &c; /* Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс = ΠΊΠ»ΠΈΠ΅Π½Ρ‚ */

31  arg.data_size = sizeof(char);

32  arg.desc_ptr = NULL;

33  arg.desc_num = 0;

34  arg.rbuf = &c;

35  arg.rsize = sizeof(char);

36  if (Read(contpipe[0], &c, 1) != 1) /* ΠΆΠ΄Π΅ΠΌ создания */

37   err_quit("pipe read error");

38  doorfd = Open(argv[1], O_RDWR);

39  Door_call(doorfd, &arg); /* запуск */

40  Start_time();

41  for (i = 0; i < nloop; i++)

42   Door_call(doorfd, &arg);

43  printf("latency: %.3f usec\n", Stop_time() / nloop);

44  Kill(childpid, SIGTERM);

45  unlink(argv[1]);

46  exit(0);

47 }

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ Sun RPC

Для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ Sun RPC ΠΌΡ‹ напишСм Π΄Π²Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΡŽ полосы пропускания. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ старый Ρ„Π°ΠΉΠ» спСцификации RPC, Π½ΠΎ Π½Π° этот Ρ€Π°Π· ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ сСрвСра. ВспомнитС ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.11: эта ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚. Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ. Π’ листингС А.18 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Как ΠΈ Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ упраТнСния 16.11, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ clnt_call для Π²Ρ‹Π·ΠΎΠ²Π° Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹; Π² Π·Π°Π³Π»ΡƒΡˆΠΊΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° отсутствуСт нСобходимая Π·Π°Π³Π»ΡƒΡˆΠΊΠ° для этой ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹.

Листинг А.18. ΠšΠ»ΠΈΠ΅Π½Ρ‚ Sun RPC для измСрСния Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ

//bench/lat_sunrpc_client.с

1  #include "unpipc.h"

2  #include "lat_sunrpc.h"


3  int

4  main(int argc, char **argv)

5  {

6   int i, nloop;

7   CLIENT *cl;

8   struct timeval tv;

9   if (argc != 4)

10   err_quit("usage: lat_sunrpc_client <hostname> <#loops> <protocol>");

11  nloop = atoi(argv[2]);

12  cl = Clnt_create(argv[1], BW_SUNRPC_PROG, BW_SUNRPC_VERS, argv[3]);

13  tv.tv_sec = 10;

14  tv.tv_usec = 0;

15  Start_time();

16  for (i = 0; i < nloop; i++) {

17   if (clnt_call(cl, NULLPROC, xdr_void, NULL,

18    xdr_void, NULL, tv) != RPC_SUCCESS)

19    err_quit("%s", clnt_sperror(cl, argv[1]));

20  }

21  printf("latency: %.3f usec\n", Stop_time() / nloop);

22  exit(0);

23 }

ΠœΡ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ сСрвСр с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π² листингС А.13, Π½ΠΎ ΠΎΠ½Π° всС Ρ€Π°Π²Π½ΠΎ Π½Π΅ вызываСтся. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ rpcgen для построСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ сСрвСра, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄Π½Ρƒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ сСрвСра, Π½ΠΎ ΠΌΡ‹ Π½Π΅ обязаны Π΅Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ rpcgen, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° автоматичСски создаСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main сСрвСра с Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ, которая Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π°.

А.5. Бинхронизация ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

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

Π’Π·Π°ΠΈΠΌΠ½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Posix