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

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

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

solaris % bw_pipe 5 10 65536

bandwidth: 13.722 MB/sec

solaris % bw_pipe 5 10 65536

bandwidth: 13.781 MB/sec

solaris % bw_pipe 5 10 65536

bandwidth: 13.685 MB/sec

solaris % bw_pipe 5 10 65536

bandwidth: 13.665 MB/sec

solaris % bw_pipe 5 10 65536

bandwidth: 13.584 MB/sec

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΌΡ‹ Π·Π°Π΄Π°Π΅ΠΌ ΠΏΡΡ‚ΡŒ Ρ†ΠΈΠΊΠ»ΠΎΠ², 10 ΠœΠ±Π°ΠΉΡ‚ Π·Π° Ρ†ΠΈΠΊΠ» ΠΈ 65536 Π±Π°ΠΉΡ‚ Π·Π° ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ² write ΠΈΠ»ΠΈ read. Π‘Ρ€Π΅Π΄Π½Π΅Π΅ ΠΎΡ‚ этих пяти Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² даст Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ 13,7 ΠœΠ±Π°ΠΉΡ‚ Π² сСкунду, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ Π² Ρ‚Π°Π±Π». А.2.

Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ полосы пропускания ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний Posix

Π’ листингС А.5 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° функция main ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΠ·ΠΌΠ΅Ρ€ΡΡŽΡ‰Π΅ΠΉ полосу пропускания ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний Posix. Листинг А.6 содСрТит Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reader ΠΈ writer. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° устроСна Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ, ΠΈΠ·ΠΌΠ΅Ρ€ΡΠ²ΡˆΠ΅ΠΉ полосу пропускания ΠΊΠ°Π½Π°Π»Π°.

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

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ приходится ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ максимальноС количСство сообщСний Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΏΡ€ΠΈ Π΅Π΅ создании. ΠœΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 4. Π Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°Π½Π°Π»Π° IPC ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это количСство сообщСний, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ mq_send, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ контСкста Π½Π° ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ процСсс. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ зависит ΠΎΡ‚ этого магичСского числа. ИзмСнСниС Π΅Π³ΠΎ с 4 Π½Π° 8 Π² Solaris 2.6 Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ влияСт Π½Π° Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π² Ρ‚Π°Π±Π». А.2, Π½ΠΎ Π² Digital Unix 4.0B ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° 12%. ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ возрастСт с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ количСства сообщСний Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ трСбуСтся Π² Π΄Π²Π° Ρ€Π°Π·Π° мСньшС ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ контСкста. Однако Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ, это ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² Π΄Π²Π° Ρ€Π°Π·Π°, ΠΊΠ°ΠΊ ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ количСство памяти.

Листинг А.5. Ѐункция main для измСрСния полосы пропускания ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний Posix

//bench/bw_pxmsg.c

1  #include "unpipc.h"

2  #define NAME "bw_pxmsg"

3  void reader(int, mqd_t, int);

4  void writer(int, mqd_t);

5  void *buf;

6  int totalnbytes, xfersize;


7  int

8  main(int argc, char **argv)

9  {

10  int i, nloop, contpipe[2];

11  mqd_t mq;

12  pid_t childpid;

13  struct mq_attr attr;

14  if (argc != 4)

15   err_quit("usage: bw_pxmsg <#loops> <#mbytes> <#bytes/write>");

16  nloop = atoi(argv[1]);

17  totalnbytes = atoi(argv[2]) * 1024 * 1024;

18  xfersize = atoi(argv[3]);

19  buf = Valloc(xfersize);

20  Touch(buf, xfersize);

21  Pipe(contpipe);

22  mq_unlink(Px_ipc_name(NAME)); /* error OK */

23  attr.mq_maxmsg = 4;

24  attr.mq_msgsize = xfersize;

25  mq = Mq_open(Px_ipc_name(NAME), O_RDWR | O_CREAT, FILE_MODE, &attr);

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

27   writer(contpipe[0], mq); /* child */

28   exit(0);

29  }

30  /* 4parent */

31  Start_time();

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

33   reader(contpipe[1], mq, totalnbytes);

34  printf("bandwidth: %.3f MB/sec\n",

35  totalnbytes / Stop_time() * nloop);

36  kill(childpid, SIGTERM);

37  Mq_close(mq);

38  Mq_unlink(Px_ipc_name(NAME));

39  exit(0);

40 }

Листинг А.6. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ reader ΠΈ writer

//bench/bw_pxmsg.c

41 void

42 writer(int contfd, mqd_t mqsend)

43 {

44  int ntowrite;

45  for(;;) {

46   Read(contfd, &ntowrite, sizeof(ntowrite));

47   while (ntowrite > 0) {

48    Mq_send(mqsend, buf, xfersize, 0);

49    ntowrite –= xfersize;

50   }

51  }

52 }


53 void

54 reader(int contfd, mqd_t mqrecv, int nbytes)

55 {

56  ssize_t n;

57  Write(contfd, &nbytes, sizeof(nbytes));

58  while ((nbytes > 0) &&

59   ((n = Mq_receive(mqrecv, buf, xfersize, NULL)) > 0)) {

60   nbytes –= n;

61  }

62 }

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° измСрСния полосы пропускания ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ System V

Π’ листингС А.7 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main, ΠΈΠ·ΠΌΠ΅Ρ€ΡΡŽΡ‰Π΅ΠΉ полосу пропускания ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний System V, Π° Π² листингС А.8 —тСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ reader ΠΈ writer.

Листинг А.7. Ѐункция main для измСрСния полосы пропускания ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний System V

//bench/bw_svmsg.c

1  #include "unpipc.h"

2  void reader(int, int, int);

3  void writer(int, int);

4  struct msgbuf *buf;

5  int totalnbytes, xfersize;


6  int

7  main(int argc, char **argv)

8  {

9   int i, nloop, contpipe[2], msqid;

10  pid_t childpid;

11  if (argc != 4)

12   err_quit("usage: bw_svmsg <#loops> <#mbytes> <#bytes/write>");

13  nloop = atoi(argv[1]);

14  totalnbytes = atoi(argv[2]) * 1024 * 1024;

15  xfersize = atoi(argv[3]);

16  buf = Valloc(xfersize);

17  Touch(buf, xfersize);

18  buf->mtype = 1;

19  Pipe(contpipe);

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

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

22   writer(contpipe[0], msqid); /* Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс */

23   exit(0);

24  }

25  Start_time();

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

27   reader(contpipe[1], msqid, totalnbytes);

28  printf("bandwidth: %.3f MB/sec\n",

29  totalnbytes / Stop_time() * nloop);

30  kill(childpid, SIGTERM);

31  Msgctl(msqid, IPC_RMID, NULL);

32  exit(0);

33 }

Листинг А.8. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ reader ΠΈ writer

//bench/bw_svmsg.c

34 void

35 writer(int contfd, int msqid)

36 {

37  int ntowrite;

38  for (;;) {

39   Read(contfd, &ntowrite, sizeof(ntowrite));

40   while (ntowrite > 0) {

41    Msgsnd(msqid, buf, xfersize – sizeof(long), 0);

42    ntowrite –= xfersize;

43   }

44  }

45 }


46 void

47 reader(int contfd, int msqid, int nbytes)

48 {

49  ssize_t n;

50  Write(contfd, &nbytes, sizeof(nbytes));

51  while ((nbytes > 0) &&

52   ((n = Msgrcv(msqid, buf, xfersize – sizeof(long), 0, 0)) > 0)) {

53   nbytes –= n + sizeof(long);

54  }

55 }

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° измСрСния полосы пропускания Π΄Π²Π΅Ρ€Π΅ΠΉ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° измСрСния полосы пропускания интСрфСйса Π΄Π²Π΅Ρ€Π΅ΠΉ слоТнСС, Ρ‡Π΅ΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ fork ΠΏΠ΅Ρ€Π΅Π΄ созданиСм Π΄Π²Π΅Ρ€ΠΈ. Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс создаСт Π΄Π²Π΅Ρ€ΡŒ ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ°Π½Π°Π»Π° ΠΎΠΏΠΎΠ²Π΅Ρ‰Π°Π΅Ρ‚ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ.

Π”Ρ€ΡƒΠ³ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ рис. А.7 функция reader Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅. Π”Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ server, которая являСтся ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ сСрвСра для Π΄Π°Π½Π½ΠΎΠΉ Π΄Π²Π΅Ρ€ΠΈ. На рис. А.8 ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° схСма ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. 

Рис. А.8. Π‘Ρ…Π΅ΠΌΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ измСрСния полосы пропускания Π΄Π²Π΅Ρ€Π΅ΠΉ


ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Π²Π΅Ρ€ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Solaris, ΠΌΡ‹ упростим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, прСдполагая Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ двустороннСго ΠΊΠ°Π½Π°Π»Π° (Ρ€Π°Π·Π΄Π΅Π» 4.4).

Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²Ρ‹Π·Π²Π°Π½ΠΎ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ сообщСний ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Ρ€Π°Π±ΠΎΡ‚Π°Π²ΡˆΠ΅ΠΉ с ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ сообщСний Posix, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ процСсс просто ΠΏΠΎΠΌΠ΅Ρ‰Π°Π» сообщСния Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π² Ρ†ΠΈΠΊΠ»Π΅, Ρ‡Ρ‚ΠΎ осущСствляСтся асинхронно. Π’ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π° ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ процСсс Π±ΡƒΠ΄Π΅Ρ‚ просто приостановлСн, ΠΈ Ρ‚ΠΎΠ³Π΄Π° ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ процСсс ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ сообщСния. Если, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ помСщаСтся 8 сообщСний ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ процСсс ΠΏΠΎΠΌΠ΅Ρ‰Π°Π» Π² Π½Π΅Π΅ 8 сообщСний ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π» ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, Π° ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ процСсс считывал 8 сообщСний, ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° N сообщСний Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»Π° N/4 ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ контСкста. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Π΄Π²Π΅Ρ€Π΅ΠΉ являСтся синхронным: Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ процСсс блокируСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ door_call ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° сСрвСр Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° N сообщСний Π² этом случаС Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ N/2 ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ контСкста. Π‘ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΌΡ‹ столкнСмся ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΈ полосы пропускания Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² RPC. НСсмотря Π½Π° ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²ΡˆΠ΅Π΅ΡΡ количСство ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ контСкста, ΠΈΠ· рис. А.1 слСдуСт, Ρ‡Ρ‚ΠΎ Π΄Π²Π΅Ρ€ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ наибольшСй полосой пропускания ΠΏΡ€ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ сообщСний Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 25 ΠšΠ±Π°ΠΉΡ‚.

Π’ листингС А.9 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ writer, server ΠΈ reader ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² листингС А.10.

Листинг А.9. Ѐункция main измСрСния полосы пропускания интСрфСйса Π΄Π²Π΅Ρ€Π΅ΠΉ

//bench/bw_door.c

1  #include "unpipc.h"

2  void reader(int, int);

3  void writer(int);

4  void server(void *, char *, size_t, door_desc_t *, size_t);

5  void *buf;

6  int totalnbytes, xfersize, contpipe[2];


7  int

8  main(int argc, char **argv)

9  {

10  int i, nloop, doorfd;

11  char c;

12  pid_t childpid;

13  ssize_t n;

14  if (argc != 5)

15   err_quit("usage: bw_door <pathname> <#loops> <#mbytes> <#bytes/write>");

16  nloop = atoi(argv[2]);

17  totalnbytes = atoi(argv[3]) * 1024 * 1024;

18  xfersize = atoi(argv[4]);

19  buf = Valloc(xfersize);

20  Touch(buf, xfersize);

21  unlink(argv[1]);