IPC(Inter-Process Communication)

이강용·2024년 7월 24일
0

CS

목록 보기
92/109

IPC(Inter-Process Communication)란?

  • 컴퓨터 프로세스 간에 데이터를 교환하는 방법이나 메커니즘을 의미
  • 서로 다른 프로세스는 독립된 메모리 공간을 가지기 때문에 직접적으로 데이터를공유할 수 없음
  • 따라서 프로세스 간의 통신을 위해서는 IPC 기술을 사용해야 함

주요 IPC 메커니즘

  1. 파이프(Pipes)
    • 익명 파이프(Anonymous Pipes) : 단방향 통신 채널로 부모-자식 프로세스 간에 주로 사용
    • 만약, 양방향 통신을 하려면 2개의 익명 파이를 만들어야 함
  • 명명 파이프(Named Pipes) : 단방향 또는 양방향 통신 채널로 네트워크를 통해서도 사용할 수 있으며 이름을 가지고 있어 관련 없는 프로세스 간에도 통신이 가능
  1. 메시지 큐(Message Queues)

    • 프로세스 간에 메시지를 전달하기 위해 큐를 사용, 메시지는 큐에 저장되고, 수신 프로세스는 큐에서 메시지를 읽어옴
      • 이는 비동기 통신을 가능하게 함

    rabbitmq 실습

    https://github.com/Gurenax/node-rabbitmq#1

    brew install rabbitmq

    npm install amqplib

    brew services start rabbitmq

send.js

#!/usr/bin/env node
const amqp = require("amqplib/callback_api");

// Create connection
amqp.connect("amqp://localhost", (err, conn) => {
  if (err) {
    console.error(err);
    process.exit(1);
  }

  // Create channel
  conn.createChannel((err, ch) => {
    if (err) {
      console.error(err);
      process.exit(1);
    }

    // Name of the queue
    const q = "hello";

    // Declare the queue
    ch.assertQueue(q, { durable: false });

    // Send message to the queue
    ch.sendToQueue(q, Buffer.from("Hello World!")); // 수정된 부분
    console.log(" [x] Sent 'Hello World'");

    // Close the connection and exit
    setTimeout(() => {
      conn.close();
      process.exit(0);
    }, 500);
  });
});

receive.js

#!/usr/bin/env node
const amqp = require("amqplib/callback_api");

// Create connection
amqp.connect("amqp://localhost", (err, conn) => {
  // Create channel
  conn.createChannel((err, ch) => {
    // Name of the queue
    const q = "hello";
    // Declare the queue
    ch.assertQueue(q, { durable: false });

    // Wait for Queue Messages
    console.log(` [*] Waiting for messages in ${q}. To exit press CTRL+C`);
    ch.consume(
      q,
      (msg) => {
        console.log(` [x] Received ${msg.content.toString()}`);
      },
      { noAck: true }
    );
  });
});

sudo chmod 755 send.js

sudo chmod 755 receive.js

brew services stop rabbitmq

  1. 공유 메모리(Shared Memory)

    • 두 개 이상의 프로세스가 특정 메모리 영역을 공유하여 데이터를 주고받는 방법
    • 빠른 통신을 가능하게 하지만 동기화 문제를 처리해야 함
  2. 메모리 맵(Memory-Mapped Files)

    • 파일을 메모리에 매핑하여 프로세스 간에 파일을 통해 데이터를 공유
    • 이는 파일을 읽거나 쓸 때 마치 메모리를 읽고 쓰는 것처럼 동작
  3. 소켓(Sockets)

    • 네트워크를 통해 프로세스 간 통신을 가능하게 하는 방법
    • 동일한 컴퓨터 내에서 또는 다른 컴퓨터와의 통신에 사용
    • TCP/IP 프로토콜을 통해 데이터를 송수신
  4. 시그널(Signals)

    • 운영 체제가 프로세스에 특정 이벤트가 발생했음을 알리기 위해 사용하는 방법
    • 시그널은 프로세스에게 비동기적으로 이벤트를 통지할 수 있음
  5. 세마포어(Semaphores)

    • 공유 자원에 대한 접근을 제어하기 위해 사용되는 동기화 메커니즘
    • 프로세스 간에 자원의 사용을 조율하고 동기화 문제를 해결하는 데 사용
  6. 파일(File)

    • 한 프로세스가 데이터를 파일에 기록하고, 다른 프로세스가 해당 파일을 읽어서 데이터를 처리하는 방식

a.js

const path = require("path");
const pt = path.join(__dirname, "a.json");
const fs = require("fs");
setInterval(() => {
  try {
    if (fs.existsSync(pt)) {
      console.log("파일을 읽습니다.");
      const ret = JSON.parse(fs.readFileSync(pt));
      console.log(ret);
    }
  } catch (err) {
    console.error(err);
  }
}, 3000);
console.log("process 1이 가동됩니다.");
  

b.js

const path = require("path");
const pt = path.join(__dirname, "a.json");
const fs = require("fs");
setTimeout(() => {
  const a = { a: 1 };
  fs.writeFileSync(pt, JSON.stringify(a));
}, 3000);
console.log("process 2가 가동됩니다.");
profile
HW + SW = 1

0개의 댓글