ipc message queue

agnusdei·2024년 11월 4일
0

Hardware & Software

목록 보기
94/136

임시 큐(Temporary Queue)를 활용한 IPC(Inter-Process Communication, 프로세스 간 통신)는 서로 다른 프로세스가 데이터를 주고받을 수 있도록 하는 방법 중 하나입니다. 특히 메세지 큐(Message Queue)는 프로세스 간 메시지를 비동기적으로 전달할 수 있어, 송신자와 수신자가 동시에 실행될 필요가 없는 장점이 있습니다.

  1. 임시 큐 메세지 전달의 개념과 목적

임시 큐는 메시지 전달을 일시적으로 필요로 할 때, 즉, 한 번의 작업에서만 메시지 송수신을 해야 할 때 주로 사용됩니다. 이는 데이터가 특정 작업에만 필요하고 작업 완료 후 큐를 삭제할 수 있다는 점에서 효율적입니다. 특히 클라이언트-서버 구조에서 작업 요청과 응답을 일시적으로 관리할 때 유용합니다.

  1. 메시지 큐의 기본 원리

메시지 큐는 운영 체제의 커널에 의해 관리되며, 각 메시지 큐에는 고유의 식별자(Identifier)가 부여됩니다. 이를 통해 프로세스가 특정 큐에 접근할 수 있게 되며, msgsnd(메시지 전송)와 msgrcv(메시지 수신) 함수로 메시지를 주고받습니다.

메시지 큐의 기본적인 흐름은 다음과 같습니다.

1.	메시지 큐 생성: msgget 함수를 사용하여 큐를 생성하거나 기존 큐에 접근합니다.
2.	메시지 전송: msgsnd 함수를 사용하여 데이터를 큐에 전송합니다.
3.	메시지 수신: msgrcv 함수를 사용하여 큐에서 데이터를 수신합니다.
4.	메시지 큐 삭제: 작업이 끝나면 msgctl 함수를 사용하여 큐를 삭제하여 자원을 해제합니다.
  1. 작동 순서 (간단한 예제)

여기서는 임시 큐를 사용해 메시지를 전달하는 예제를 보여드리겠습니다. 이 예제에서는 한 프로세스가 메시지를 전송하고, 다른 프로세스가 메시지를 수신하는 구조를 구현합니다.

헤더와 구조체 정의

우선 메시지 큐에 필요한 헤더 파일과 메시지 구조체를 정의합니다.

#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define MSG_SIZE 100

// 메시지 구조체
struct message {
long msg_type;
char msg_text[MSG_SIZE];
};

1) 메시지 큐 생성 및 메시지 전송 프로세스

int main() {
key_t key;
int msgid;

// 메시지 큐 식별자 생성
key = ftok("tempfile", 65); // 임시 파일로 키 생성
msgid = msgget(key, 0666 | IPC_CREAT);

struct message msg;
msg.msg_type = 1; // 메시지 타입 설정
strcpy(msg.msg_text, "Hello, from sender!");

// 메시지 전송
msgsnd(msgid, &msg, sizeof(msg), 0);
printf("Sent message: %s\n", msg.msg_text);

return 0;

}

2) 메시지 수신 프로세스

int main() {
key_t key;
int msgid;

// 동일한 키를 사용하여 큐 접근
key = ftok("tempfile", 65);
msgid = msgget(key, 0666 | IPC_CREAT);

struct message msg;

// 메시지 수신
msgrcv(msgid, &msg, sizeof(msg), 1, 0);
printf("Received message: %s\n", msg.msg_text);

// 메시지 큐 삭제
msgctl(msgid, IPC_RMID, NULL);

return 0;

}

  1. 장단점

    • 장점: 임시 메시지 큐는 비동기적으로 동작하므로 송수신 프로세스가 동시에 실행될 필요가 없습니다. 또한 데이터가 일시적으로 필요할 때 자원을 효율적으로 사용할 수 있습니다.
    • 단점: 큐에 전송된 메시지는 수신되기 전까지 메모리에 남아 있기 때문에, 대용량 데이터를 관리하기에는 비효율적일 수 있으며, 큐가 삭제되지 않으면 시스템 자원을 점유하게 됩니다.

요약

임시 큐를 이용한 메시지 전달 IPC는 일회성 메시지 전송이 필요할 때 유용하며, 커널에서 제공하는 msgget, msgsnd, msgrcv, msgctl 함수 등을 통해 구현할 수 있습니다.

0개의 댓글