728x90
반응형
SMALL
프로세스 간 통신(IPC, Inter-Process Communication)이란?
컴퓨터에서 프로그램은 각각 독립적으로 실행되는 프로세스라는 단위로 나뉘어요. 하지만 때로는 한 프로세스가 다른 프로세스와 데이터를 주고받거나 협력해야 할 때가 있습니다. 이를 프로세스 간 통신(IPC)이라고 해요. 😊
IPC는 운영체제가 프로세스들끼리 정보를 공유할 수 있게 하는 방법이에요.
간단히 말해서, 프로세스들이 서로 대화하거나 파일을 주고받는 방법이에요. 😊
📂 IPC에서 자주 사용되는 개념
- 파이프 (Pipe): 데이터를 한쪽에서 보내면 다른 쪽에서 받을 수 있는 터널 같은 것!
- 소켓 (Socket): 네트워크로 연결된 두 프로세스가 통신하는 방식.
- 공유 메모리: 프로세스들이 같은 메모리 공간을 함께 사용하는 방법.
- 메시지 큐: 데이터를 보내고 받고 할 수 있는 편지함 같은 구조.
📂 공유 메모리 (Shared Memory)
- 공유 메모리는 두 프로세스가 같은 메모리 공간을 사용해서 데이터를 공유하는 방법이에요.
- 마치 하나의 공용 노트를 여러 사람이 함께 사용하는 것 같아요.
- 데이터를 메모리에 저장하고, 프로세스들이 거기서 읽거나 쓸 수 있어요.
🧠 공유 메모리 (Python과 Java)
동작 설명
- 공유 메모리는 두 프로세스(또는 스레드)가 하나의 공통 데이터 영역을 통해 데이터를 읽고 쓸 수 있도록 만듭니다.
- 두 프로세스가 동시에 데이터를 접근할 때 순서가 중요하기 때문에, 동기화를 통해 데이터 충돌을 방지해야 합니다.
- 파이썬의
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
)는 이 공간에 접근하여 값을 증가하거나 감소합니다. p1
과p2
가 실행될 때마다 값이 변경되므로 최종 값은 실행 순서에 따라 다를 수 있습니다.
자바 공유 메모리 코드 설명
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)이란? : 파이프
2024.12.17 - [운영체제] - [쉬운설명]프로세스 간 통신(IPC)이란? : 소켓
2024.12.17 - [운영체제] - [쉬운설명]프로세스 간 통신(IPC)이란? : 메시지 큐
😊 마무리
- 소켓: 네트워크 통신.
- 공유 메모리: 프로세스 간 공용 메모리 공간.
- 메시지 큐: 메시지를 저장하고 교환하는 우체통.
반응형
SMALL
'운영체제' 카테고리의 다른 글
[운영체제] 프로세스와 스레드 개념 정리: 자바 예제 포함 (1) | 2024.12.18 |
---|---|
[운영체제] 멀티스레딩 vs 멀티프로세싱: 차이점과 특징 비교 (2) | 2024.12.18 |
[운영체제] 가상 메모리(Virtual Memory) 완벽 정리: 개념, 필요성, 동작 원리와 장단점 (0) | 2024.12.16 |
[운영체제] 프로세스 동기화 심화: 세마포어(Semaphore) 개념과 Java·Python 예제 코드 (0) | 2024.12.16 |
[운영체제] 멀티프로세싱(Multiprocessing) 완벽 정리: 개념, 특징, Python 구현 예제 (0) | 2024.12.13 |