에듀테크 프로젝트 대시보드
IPC — 프로세스 간 통신
| (파이프)다.
🔧 파이프(Pipe) 버퍼 체험 — ls | grep
커널 파이프 버퍼는 용량이 제한적이다(리눅스 기본 64KB). 소비자가 멈추면 생산자는 write()에서 블로킹된다.
쓰기 버튼을 눌러 데이터를 파이프에 채워보세요.
⚖️ IPC 메커니즘 비교
막대는 상대적인 처리량 감(학습용 근사치, 실제 값은 하드웨어·구현체마다 다름)
💻 코드로 보는 IPC
셸의 파이프 한 줄이 내부적으로 어떤 시스템 호출과 대응하는지 비교
# ls의 stdout 파일 디스크립터를 grep의 stdin에 연결 ls -l /var/log | grep ".log" | wc -l # 커널 내부: pipe() 시스템 콜이 fd 2개(읽기/쓰기)를 만들고 # 셸이 fork() 후 자식의 fd를 dup2()로 바꿔치기한다
from multiprocessing import Process, Pipe def worker(conn): conn.send("안녕, 부모!") # 커널 버퍼로 복사 conn.close() parent_conn, child_conn = Pipe() p = Process(target=worker, args=(child_conn,)) p.start() print(parent_conn.recv()) # 커널 버퍼에서 복사해 옴 p.join()
from multiprocessing import shared_memory import numpy as np # 두 프로세스가 "같은" 물리 메모리를 바라봄 → 복사 없음 shm = shared_memory.SharedMemory(create=True, size=1024) arr = np.ndarray((128,), dtype=np.float64, buffer=shm.buf) arr[:] = 0 # 다른 프로세스가 shm.name으로 열면 즉시 이 값이 보임 # 주의: 동시에 쓰면 경쟁 상태(race condition) 발생 → 락 필요 shm.close(); shm.unlink()
공유 메모리는 복사가 없는 대신 경쟁 상태 위험이 있고, 파이프·소켓은 복사 비용이 있는 대신 커널이 동기화를 대신 해준다 — 속도와 안전성은 트레이드오프다.