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

Пример

Пример

В листинге 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 = %dn", 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 totaln". 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 oncen", 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
40 64-byte messages were placed on queue, 2560 bytes total
40 128-byte messages were placed on queue, 5120 bytes total
40 256-byte messages were placed on queue, 10240 bytes total
32 512-byte messages were placed on queue, 16384 bytes total
16 1024-byte messages were placed on queue, 16384 bytes total
8 2048-byte messages were placed on queue, 16384 bytes total
4 4096-byte messages were placed on queue, 16384 bytes total
2 8192-byte messages were placed on queue, 16384 bytes total
63 identifiers at once

Причина, по которой в Digital Unix 4.0В получился результат 63 идентификатора, а не 64, как в табл. 6.2, заключается в том, что один идентификатор всегда используется системным демоном.

Оглавление книги

Оглавление статьи/книги

Генерация: 0.057. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз