운영체제

[운영체제] 프로세스 간 통신(IPC) 공유 메모리: 개념과 Java·Python 예제 코드 정리

CodeCaine Explorer 2024. 12. 17. 00:23
728x90
반응형
SMALL

프로세스 간 통신(IPC, Inter-Process Communication)이란?

컴퓨터에서 프로그램은 각각 독립적으로 실행되는 프로세스라는 단위로 나뉘어요. 하지만 때로는 한 프로세스가 다른 프로세스와 데이터를 주고받거나 협력해야 할 때가 있습니다. 이를 프로세스 간 통신(IPC)이라고 해요. 😊

IPC는 운영체제가 프로세스들끼리 정보를 공유할 수 있게 하는 방법이에요.
간단히 말해서, 프로세스들이 서로 대화하거나 파일을 주고받는 방법이에요. 😊


📂 IPC에서 자주 사용되는 개념

  • 파이프 (Pipe): 데이터를 한쪽에서 보내면 다른 쪽에서 받을 수 있는 터널 같은 것!
  • 소켓 (Socket): 네트워크로 연결된 두 프로세스가 통신하는 방식.
  • 공유 메모리: 프로세스들이 같은 메모리 공간을 함께 사용하는 방법.
  • 메시지 큐: 데이터를 보내고 받고 할 수 있는 편지함 같은 구조.

📂 공유 메모리 (Shared Memory)

  • 공유 메모리는 두 프로세스가 같은 메모리 공간을 사용해서 데이터를 공유하는 방법이에요.
  • 마치 하나의 공용 노트를 여러 사람이 함께 사용하는 것 같아요.
  • 데이터를 메모리에 저장하고, 프로세스들이 거기서 읽거나 쓸 수 있어요.

🧠 공유 메모리 (Python과 Java)

동작 설명

  1. 공유 메모리는 두 프로세스(또는 스레드)가 하나의 공통 데이터 영역을 통해 데이터를 읽고 쓸 수 있도록 만듭니다.
  2. 두 프로세스가 동시에 데이터를 접근할 때 순서가 중요하기 때문에, 동기화를 통해 데이터 충돌을 방지해야 합니다.
  3. 파이썬의 multiprocessing.Value와 자바의 AtomicInteger는 이런 공유 메모리 접근을 안전하게 처리하도록 도와줍니다.

파이썬 공유 메모리 코드 설명

from multiprocessing import Process, Value

def increment(shared_num):
    for _ in range(5):
        shared_num.value += 1  # 공유 메모리에 값을 1 증가
        print("Incremented:", shared_num.value)  # 현재 값 출력

def decrement(shared_num):
    for _ in range(5):
        shared_num.value -= 1  # 공유 메모리에 값을 1 감소
        print("Decremented:", shared_num.value)  # 현재 값 출력

if __name__ == "__main__":
    shared_num = Value('i', 0)  # 공유 메모리 공간 초기화 (정수형, 초기값 0)

    # 두 프로세스 생성: 하나는 값을 증가, 다른 하나는 값을 감소
    p1 = Process(target=increment, args=(shared_num,))
    p2 = Process(target=decrement, args=(shared_num,))

    p1.start()  # 첫 번째 프로세스 시작
    p2.start()  # 두 번째 프로세스 시작

    p1.join()  # 첫 번째 프로세스가 끝날 때까지 대기
    p2.join()  # 두 번째 프로세스가 끝날 때까지 대기

    print("최종 값:", shared_num.value)  # 공유 메모리의 최종 값 출력
  • Value('i', 0): 정수형 0을 초기값으로 갖는 공유 메모리 공간 생성.
  • 두 프로세스(p1, p2)는 이 공간에 접근하여 값을 증가하거나 감소합니다.
  • p1p2가 실행될 때마다 값이 변경되므로 최종 값은 실행 순서에 따라 다를 수 있습니다.

자바 공유 메모리 코드 설명

import java.util.concurrent.atomic.AtomicInteger;

public class SharedMemoryExample {
    public static void main(String[] args) {
        AtomicInteger sharedNum = new AtomicInteger(0); // 공유 메모리 초기화 (0)

        // 증가 스레드
        Thread incrementer = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                sharedNum.getAndIncrement(); // 값을 1 증가
                System.out.println("Incremented: " + sharedNum.get()); // 현재 값 출력
            }
        });

        // 감소 스레드
        Thread decrementer = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                sharedNum.getAndDecrement(); // 값을 1 감소
                System.out.println("Decremented: " + sharedNum.get()); // 현재 값 출력
            }
        });

        incrementer.start(); // 첫 번째 스레드 시작
        decrementer.start(); // 두 번째 스레드 시작

        try {
            incrementer.join(); // 첫 번째 스레드 종료 대기
            decrementer.join(); // 두 번째 스레드 종료 대기
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

        System.out.println("최종 값: " + sharedNum.get()); // 최종 값 출력
    }
}
  • AtomicInteger: 자바에서 공유 메모리를 안전하게 다룰 수 있는 클래스.
  • 두 스레드(incrementer, decrementer)가 공유 메모리 sharedNum에 접근하여 값을 각각 증가/감소.
  • 실행 순서에 따라 최종 값은 다를 수 있지만, AtomicInteger동기화 문제를 자동으로 처리합니다.

2024.12.16 - [운영체제] - [쉬운설명]프로세스 간 통신(IPC)이란? : 파이프

 

[쉬운설명]프로세스 간 통신(IPC)이란? : 파이프

프로세스 간 통신(IPC, Inter-Process Communication)이란?컴퓨터에서 프로그램은 각각 독립적으로 실행되는 프로세스라는 단위로 나뉘어요. 하지만 때로는 한 프로세스가 다른 프로세스와 데이터를 주

alswnsghd1234.tistory.com

2024.12.17 - [운영체제] - [쉬운설명]프로세스 간 통신(IPC)이란? : 소켓

 

[쉬운설명]프로세스 간 통신(IPC)이란? : 소켓

프로세스 간 통신(IPC, Inter-Process Communication)이란?컴퓨터에서 프로그램은 각각 독립적으로 실행되는 프로세스라는 단위로 나뉘어요. 하지만 때로는 한 프로세스가 다른 프로세스와 데이터를 주

alswnsghd1234.tistory.com

2024.12.17 - [운영체제] - [쉬운설명]프로세스 간 통신(IPC)이란? : 메시지 큐

 

[쉬운설명]프로세스 간 통신(IPC)이란? : 메시지 큐

프로세스 간 통신(IPC, Inter-Process Communication)이란?컴퓨터에서 프로그램은 각각 독립적으로 실행되는 프로세스라는 단위로 나뉘어요. 하지만 때로는 한 프로세스가 다른 프로세스와 데이터를 주

alswnsghd1234.tistory.com

 

😊 마무리

  • 소켓: 네트워크 통신.
  • 공유 메모리: 프로세스 간 공용 메모리 공간.
  • 메시지 큐: 메시지를 저장하고 교환하는 우체통.
반응형
SMALL