Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

메시지 대기열을 사용하는 IPC

<시간/>

이미 공유 메모리가 있는데 메시지 큐가 필요한 이유는 무엇입니까? 여러 가지 이유가 있을 수 있습니다. 단순화를 위해 이것을 여러 지점으로 나누도록 하겠습니다. −

  • 알다시피, 메시지가 프로세스에 의해 수신되면 더 이상 다른 프로세스에서 사용할 수 없습니다. 반면 공유 메모리에서는 여러 프로세스가 액세스할 수 있는 데이터를 사용할 수 있습니다.

  • 작은 메시지 형식으로 소통하고 싶다면

  • 여러 프로세스가 동시에 통신할 때 공유 메모리 데이터는 동기화로 보호되어야 합니다.

  • 공유 메모리를 사용하여 쓰기 및 읽기 빈도가 높으면 기능을 구현하는 것이 매우 복잡합니다. 이런 경우에는 활용 가치가 없습니다.

  • 모든 프로세스가 공유 메모리에 액세스할 필요가 없지만 매우 소수의 프로세스만 공유 메모리에 액세스할 필요가 없다면 메시지 큐로 구현하는 것이 좋습니다.

  • 다른 데이터 패킷과 통신하려면 프로세스 A가 프로세스 B에 메시지 유형 1을 보내고 프로세스 C에 메시지 유형 10을 보내고 프로세스 D에 메시지 유형 20을 보내고 있다고 가정해 보겠습니다. 이 경우 메시지 대기열을 사용하여 구현하는 것이 더 간단합니다. 주어진 메시지 유형을 1, 10, 20으로 단순화하려면 아래에서 설명하는 것처럼 0 또는 +ve 또는 -ve가 될 수 있습니다.

  • 물론 메시지 큐의 순서는 FIFO(선입 선출)입니다. 대기열에 삽입된 첫 번째 메시지가 가장 먼저 검색됩니다.

공유 메모리 또는 메시지 대기열을 사용하는 것은 응용 프로그램의 필요성과 응용 프로그램을 얼마나 효과적으로 활용할 수 있는지에 따라 다릅니다.

메시지 대기열을 사용한 통신은 다음과 같은 방식으로 발생할 수 있습니다. -

  • 한 프로세스는 공유 메모리에 쓰고 다른 프로세스는 공유 메모리에서 읽는다. 우리가 알고 있듯이 읽기는 여러 프로세스로 수행될 수도 있습니다.
    메시지 대기열을 사용하는 IPC

하나의 프로세스가 다른 데이터 패킷을 사용하여 공유 메모리에 쓰고 여러 프로세스가 공유 메모리에서 읽기, 즉 메시지 유형별로.

메시지 대기열을 사용하는 IPC

메시지 큐에 대한 특정 정보를 보았으니 이제 메시지 큐를 지원하는 시스템 호출(System V)을 확인할 차례입니다.

메시지 대기열을 사용하여 통신을 수행하려면 다음 단계를 따르세요. -

1단계 − 메시지 대기열을 생성하거나 이미 존재하는 메시지 대기열에 연결(msgget())

2단계 - 메시지 큐에 쓰기(msgsnd())

3단계 - 메시지 큐에서 읽기(msgrcv())

4단계 − 메시지 대기열에 대한 제어 작업 수행(msgctl())

여기서 우리는 두 개의 프로세스를 생성할 것입니다. 하나는 쓸 수 있고 다른 하나는 읽을 수 있습니다. 리더와 라이터 프로세스가 공유 메모리를 사용하여 어떻게 작동하는지 봅시다.

예시 코드

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// structure for message queue
struct msg_buffer {
   long msg_type;
   char msg[100];
} message;
main() {
   key_t my_key;
   int msg_id;
   my_key = ftok("progfile", 65); //create unique key
   msg_id = msgget(my_key, 0666 | IPC_CREAT); //create message queue and return id
   message.msg_type = 1;
   printf("Write Message : ");
   fgets(message.msg, 100, stdin);
   msgsnd(msg_id, &message, sizeof(message), 0); //send message
   printf("Sent message is : %s \n", message.msg);
}

예시 코드

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// Define message queue structure
struct msg_buffer {
   long msg_type;
   char msg[100];
} message;
main() {
   key_t my_key;
   int msg_id;
   my_key = ftok("progfile", 65); //create unique key
   msg_id = msgget(my_key, 0666 | IPC_CREAT); //create message queue and return id
   msgrcv(msg_id, &message, sizeof(message), 1, 0); //used to receive message
   // display the message
   printf("Received Message is : %s \n", message.msg);
   msgctl(msg_id, IPC_RMID, NULL); //destroy the message queue
   return 0;
}

출력

메시지 대기열을 사용하는 IPC