Как очередь сообщений реализована в ядре Linux?

Я хотел бы знать, как очереди сообщений реализованы в ядре Linux.

28 голосов | спросил Sen 5 FebruaryEurope/MoscowbSat, 05 Feb 2011 13:05:47 +0300000000pmSat, 05 Feb 2011 13:05:47 +030011 2011, 13:05:47

1 ответ


39

Ядро Linux (2.6) реализует две очереди сообщений: (скорее, «списки сообщений», поскольку реализация выполняется с помощью связанного списка, строго не выполняющего принцип FIFO)

Сообщения системы IP VC

Очередь сообщений из System V.

Процесс может вызывать msgsnd() для отправки сообщения. Ему необходимо передать идентификатор IPC очереди принимающих сообщений, размер сообщения и структуру сообщения, включая тип сообщения и текст.

С другой стороны, процесс вызывает msgrcv(), чтобы получить сообщение, передав идентификатор IPC очереди сообщений, где сообщение должен быть сохранен, размер и значение t .

t указывает сообщение, возвращенное из очереди, положительное значение означает, что возвращается первое сообщение с его типом, равным t , отрицательное значение возвращает последнее сообщение равным для ввода t , а ноль возвращает первое сообщение очереди.

Эти функции определены в include /linux /msg.h и реализован в ipc /msg.c

Существуют ограничения на размер сообщения (макс.), общее количество сообщений (мни) и общий размер всех сообщений в очереди (mnb):

$ sysctl kernel.msg{max,mni,mnb}
kernel.msgmax = 8192
kernel.msgmni = 1655
kernel.msgmnb = 16384

Вышеприведенный результат относится к системе Ubuntu 10.10, значения по умолчанию определены в msg .h .

Более невероятно старый файл очереди сообщений System V объяснил здесь .

Очередь сообщений POSIX

Стандарт POSIX определяет механизм очереди сообщений, основанный на очереди сообщений IPC System V, расширяя его некоторыми функциями:

  • Простой файловый интерфейс для приложения
  • Поддержка приоритетов сообщений
  • Поддержка асинхронного уведомления
  • Тайм-ауты для операций блокировки

См. ipc /mqueue.c

Пример

util-linux предоставляет некоторые программы для анализа и изменения очередей сообщений, а в спецификации POSIX приведены некоторые примеры C:

Создайте очередь сообщений с помощью ipcmk; обычно вы делаете это, вызывая функции C, такие как ftok() и msgget():

$ ipcmk -Q

Давайте посмотрим, что произошло, используя ipcs или с помощью cat /proc/sysvipc/msg:

$ ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x33ec1686 65536      user       644        0            0           

Теперь заполните очередь сообщений:

$ cat <<EOF >msg_send.c
#include <string.h>
#include <sys/msg.h> 

int main() {
  int msqid = 65536;
  struct message {
    long type;
    char text[20];
  } msg;

  msg.type = 1;
  strcpy(msg.text, "This is message 1");
  msgsnd(msqid, (void *) &msg, sizeof(msg.text), IPC_NOWAIT);
  strcpy(msg.text, "This is message 2");
  msgsnd(msqid, (void *) &msg, sizeof(msg.text), IPC_NOWAIT);

  return 0;
}
EOF

Опять же, вы, как правило, не кодируете msqid в коде.

$ gcc -o msg_send msg_send.c
$ ./msg_send
$ ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x33ec1686 65536      user       644        40           2        

И другая сторона, которая будет получать сообщения:

$ cat <<EOF >msg_recv.c
#include <stdio.h>
#include <sys/msg.h>

int main() {
  int msqid = 65536;
  struct message {
    long type;
    char text[20];
  } msg;
  long msgtyp = 0;

  msgrcv(msqid, (void *) &msg, sizeof(msg.text), msgtyp, MSG_NOERROR | IPC_NOWAIT);
  printf("%s \n", msg.text);

  return 0;
}
EOF

Посмотрите, что произойдет:

$ gcc -o msg_recv msg_recv.c
$ ./msg_recv
This is message 1
$ ./msg_recv
This is message 2
$ ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x33ec1686 65536      user       644        0            0           

После двух попыток очередь снова пуста.

Удалите его, указав ключ (-Q) или msqid (-q):

$ ipcrm -q 65536
ответил wag 5 FebruaryEurope/MoscowbSat, 05 Feb 2011 16:26:05 +0300000000pmSat, 05 Feb 2011 16:26:05 +030011 2011, 16:26:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132