Чтение онлайн

ЖАНРЫ

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

Стивенс Уильям Ричард

Шрифт:

В этом разделе мы хотели показать типичные значения ограничений, чтобы помочь в планировании переносимых программ. При выполнении приложений, активно использующих очереди сообщений, обычно требуется настройка этих (или аналогичных) параметров ядра (что описано в разделе 3.8).

Пример

В листинге 6.21 приведен текст программы, которая определяет четыре ограничения, показанные в табл. 6.2.

Листинг 6.21. Определение системных ограничений для очередей сообщений System V

//svmsg/limits.c

1 #include "unpipc.h"

2 #define MAX_DATA 64*1024

3 #define MAX_NMESG 4096

4 #define MAX_NIDS 4096

5 int max_mesg;

6 struct mymesg {

7 long type;

8 char data[MAX_DATA];

9 } mesg;

10 int

11 main(int argc, char **argv)

12 {

13 int i, j, msqid, qid[MAX_NIDS];

14 /*
определение максимального размера сообщения */

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

16 mesg.type = 1;

17 for (i = MAX_DATA; i > 0; i –= 128) {

18 if (msgsnd(msqid, &mesg, i, 0) == 0) {

19 printf("maximum amount of data per message = %d\n", i);

20 max_mesg = i;

21 break;

22 }

23 if (errno != EINVAL)

24 err_sys("msgsnd error for length %d", i);

25 }

26 if (i == 0)

27 err_quit("i == 0");

28 Msgct(lmsqid, IPC_RMID, NULL);

29 /* количество сообщений в очереди */

30 mesg.type = 1;

31 for (i = 8; i <= max_mesg; i *= 2) {

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

33 for (j = 0; j < MAX_NMESG; j++) {

34 if (msgsnd(msqid, &mesg, i, IPC_NOWAIT) != 0) {

35 if (errno == EAGAIN)

36 break;

37 err_sys("msgsnd error, i = %d, j = %d", i, j);

38 break;

39 }

40 }

41 printf("%d %d-byte messages were placed onto queue,", j, i);

42 printf(" %d bytes total\n". i*j);

43 Msgctl(msqid, IPC_RMID, NULL);

44 }

45 /* максимальное количество идентификаторов */

46 mesg.type = 1;

47 for (i = 0; i <= MAX_NIDS; i++) {

48 if ((qid[i] = msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT)) == –1) {

49 printf("%d identifiers open at once\n", i);

50 break;

51 }

52 }

53 for (j = 0; j < i; j++)

54 Msgctl(qid[j], IPC_RMID, NULL);

55 exit(0);

56 }

Определение
максимального размера сообщения

14-28 Для определения максимально возможного размера сообщения мы пытаемся послать сообщение, в котором будет 65 536 байт данных, и если эта попытка оказывается неудачной, уменьшаем этот объем до 65 408, и т.д., пока вызов msgsnd не окажется успешным.

Сколько сообщений различного размера может быть помещено в очередь?

29-44 Теперь мы начинаем с 8-байтовых сообщений и смотрим, сколько их поместится в очередь. После определения этого ограничения мы удаляем очередь (сбрасывая все эти сообщения) и повторяем процедуру с 16-байтовыми сообщениями. Мы повторяем это до тех пор, пока не будет достигнут максимальный размер сообщения из первого пункта. Ожидается, что небольшие сообщения будут превышать ограничение по количеству сообщений в очереди, а большие — ограничение по количеству байтов.

Сколько идентификаторов может быть открыто одновременно?

45-54 Обычно есть системное ограничение на количество одновременно открытых идентификаторов. Оно определяется непосредственно созданием очередей до тех пор, пока не произойдет ошибка при вызове msgget.

Запустим эту программу сначала в Solaris 2.6, а затем в Digital Unix 4.0B, и результаты подтвердят приведенные в табл. 6.2 величины:

solaris % limits

maximum amount of data per message = 2048

40 8-byte messages were placed on queue, 320 bytes total

40 16-byte messages were placed on queue, 640 bytes total

40 32-byte messages were placed on queue, 1280 bytes total
 

40 64-byte messages were placed on queue, 2560 bytes total

32 128-byte messages were placed on queue, 4096 bytes total

16 256-byte messages were placed on queue, 4096 bytes total

8 512-byte messages were placed on queue, 4096 bytes total

4 1024-byte messages were placed on queue, 4096 bytes total

2 2048-byte messages were placed on queue, 4096 bytes total

50 identifiers open at once

alpha % limits

maximum amount of data per message = 8192

40 8-byte messages were placed on queue, 320 bytes total

40 16-byte messages were placed on queue, 640 bytes total

40 32-byte messages were placed on queue, 1280 bytes total

Поделиться с друзьями: