Bagaimana antrian pesan diimplementasikan di kernel Linux?


29

Saya ingin tahu bagaimana Antrian Pesan diimplementasikan di Linux Kernel.


IPC_NOWAIT kami menggunakannya hanya di penerima
Anwaar Qa

Jawaban:


41

Kernel Linux (2.6) mengimplementasikan dua antrian pesan:
(lebih tepatnya 'daftar pesan', karena implementasi dilakukan dengan menggunakan daftar tertaut yang tidak sepenuhnya mengikuti prinsip FIFO)

Pesan sistem V IPC

Antrian pesan dari Sistem V.

Suatu proses dapat meminta msgsnd()untuk mengirim pesan. Ia harus melewati pengidentifikasi IPC dari antrian pesan penerima, ukuran pesan dan struktur pesan, termasuk jenis pesan dan teks.

Di sisi lain, suatu proses meminta msgrcv()untuk menerima pesan, melewati pengidentifikasi IPC dari antrian pesan, di mana pesan harus disimpan, ukuran dan nilai t .

t menentukan pesan yang dikembalikan dari antrian, nilai positif berarti pesan pertama dengan jenisnya sama dengan t dikembalikan, nilai negatif mengembalikan pesan terakhir sama dengan tipe t dan nol mengembalikan pesan pertama antrian.

Fungsi-fungsi tersebut didefinisikan dalam include / linux / msg.h dan diimplementasikan dalam ipc / msg.c

Ada batasan pada ukuran pesan (maks), jumlah total pesan (mni) dan ukuran total semua pesan dalam antrian (mnb):

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

Output di atas berasal dari sistem Ubuntu 10.10, standarnya didefinisikan dalam msg .

Hal antrian pesan System V yang lebih luar biasa dijelaskan di sini .

Antrian Pesan POSIX

Standar POSIX mendefinisikan mekanisme antrian pesan berdasarkan antrian pesan System V IPC, memperluasnya dengan beberapa fungsi:

  • Antarmuka berbasis file sederhana ke aplikasi
  • Dukungan untuk prioritas pesan
  • Dukungan untuk notifikasi sinkron
  • Waktu tunggu untuk memblokir operasi

Lihat ipc / mqueue.c

Contoh

util-linux menyediakan beberapa program untuk menganalisis dan memodifikasi antrian pesan dan spesifikasi POSIX memberikan beberapa contoh C:

Buat antrian pesan dengan ipcmk; umumnya Anda akan melakukan ini dengan memanggil fungsi C seperti ftok()dan msgget():

$ ipcmk -Q

Mari kita lihat apa yang terjadi dengan menggunakan ipcsatau dengan cat /proc/sysvipc/msg:

$ ipcs -q

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

Sekarang isi antrian dengan beberapa pesan:

$ 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

Sekali lagi, Anda biasanya tidak membuat kode msqid dalam kode.

$ 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        

Dan sisi lain, yang akan menerima pesan:

$ 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

Lihat apa yang terjadi:

$ 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           

Setelah dua menerima, antrian kosong lagi.

Hapus setelahnya dengan menentukan kunci ( -Q) atau msqid ( -q):

$ ipcrm -q 65536

Jadi apakah pesan (jenis dan teks) dapat diklon / disalin dan kemudian salinan itu dimasukkan ke dalam antrian pesan sistem?
trusktr

dimasukkan dengan sangat baik. Terima kasih atas penjelasan yang luar biasa ini.
User9102d82
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.