My-library.info
Все категории

Уильям Стивенс - UNIX: взаимодействие процессов

На электронном книжном портале my-library.info можно читать бесплатно книги онлайн без регистрации, в том числе Уильям Стивенс - UNIX: взаимодействие процессов. Жанр: Программирование издательство -, год 2004. В онлайн доступе вы получите полную версию книги с кратким содержанием для ознакомления, сможете читать аннотацию к книге (предисловие), увидеть рецензии тех, кто произведение уже прочитал и их экспертное мнение о прочитанном.
Кроме того, в библиотеке онлайн my-library.info вы найдете много новинок, которые заслуживают вашего внимания.

Название:
UNIX: взаимодействие процессов
Издательство:
-
ISBN:
-
Год:
-
Дата добавления:
17 сентябрь 2019
Количество просмотров:
232
Читать онлайн
Уильям Стивенс - UNIX: взаимодействие процессов

Уильям Стивенс - UNIX: взаимодействие процессов краткое содержание

Уильям Стивенс - UNIX: взаимодействие процессов - описание и краткое содержание, автор Уильям Стивенс, читайте бесплатно онлайн на сайте электронной библиотеки My-Library.Info
Книга написана известным экспертом по операционной системе UNIX и посвящена описанию одной из форм межпроцессного взаимодействия, IPC, с использованием которой создается большинство сложных программ. В ней описываются четыре возможности разделения решаемых задач между несколькими процессами или потоками одного процесса: передача сообщений, синхронизация, разделяемая память, удаленный вызов процедур.Книга содержит большое количество иллюстрирующих примеров и может использоваться как учебник по IPC, и как справочник для опытных программистов.

UNIX: взаимодействие процессов читать онлайн бесплатно

UNIX: взаимодействие процессов - читать книгу онлайн бесплатно, автор Уильям Стивенс

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/secn",

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/secn",

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]);


Уильям Стивенс читать все книги автора по порядку

Уильям Стивенс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки My-Library.Info.


UNIX: взаимодействие процессов отзывы

Отзывы читателей о книге UNIX: взаимодействие процессов, автор: Уильям Стивенс. Читайте комментарии и мнения людей о произведении.

Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*
Все материалы на сайте размещаются его пользователями.
Администратор сайта не несёт ответственности за действия пользователей сайта..
Вы можете направить вашу жалобу на почту librarybook.ru@gmail.com или заполнить форму обратной связи.