1. IPC (Inter-Process Communication)

프로세스 간 통신하는 방법 2가지

1) 공유 메모리 사용 (Shared-Memory)

  • 버퍼를 shared-memory로 만들면 된다 → Shared Buffer
  • 생산자 - Buffer - 소비자
  • buffer 가득차면 Producer: waiting / buffer 비면 Consumer: waiting
  • 문제 상황
    • 성능이 좋지만 동기화 문제 발생
    • 응용 프로그래머가 다 해결해야 함 → 너무 복잡
  • 문제 해결 : Message-Passing 으로!!

2) Message-Passing

  • send(message), receive(message) system call로 OS가 해결
  • ex. pipes
  • communication link를 구현

 

2. Message-Passing

direct vs indirect

1) direct

  • send(P, message) - p에게 메시지 전송, receive(Q, message) - Q로부터 메시지 수신
  • 링크가 automatically 생성됨
  • 2개의 프로세스 간에 정확히 하나의 링크만 만들어짐 (1 : 1)

2) indirect

  • 뭔가 매개체가 필요함 - 매개체 = Port (mailbox)
  • 그냥 port로 전송만 하면 됨
  • 복잡한 Communication link를 만들 수 있음 (다 : 다)
  • 여기서 또 blocking I/O vs non-blocking I/O으로 나누어짐

 

3. 실제 IPC 예시

1) Shared Memory : POSIX Shared Memory

  • POSIX: Portable OS Interface (for UNIX)
  • memory-mapped files 사용
  • 문제 : 일일이 shm_open, write, read, close 등을 프로그래머가 다 해줘야 함
  • 좀 더 진화된 형태 : pipes

2) Message Passing : Pipes

  • 생산자-소비자 방식으로 두 개의 프로세스가 서로 통신하는 메커니즘
  • uni-direction (단방향) vs bi-direction(양방향)
  • half-duplex(송, 수신 중 한 번에 하나만 가능) vs full-duplex (양방향으로 동시에 송수신)
  • 전통적인 pipe = 단방향 통신 2개 만들어 양방향처럼 사용하면 됨
  • 문제 : 그럼 Client-Server System에서는??
    • 네트워크 내에서 다른 2개의 컴퓨터끼리 shared memory 및 pipe 연결 불가능!!
  • 해결 : socket

 

4. Communication in Client-Server Systems

Pipe → Socket → RPC

1) Sockets

  • IP addr + Port = Socket
  • 네트워크 상의 서로 다른 endpoint 끼리의 통신할 때
  • Java
    • Socket class: connection-oriented (TCP)
    • DatagramSOcket class: connectionless (UDP)
    • MulticastSocket class: multiple recipients

2. RPCs (Remote Procedure Calls)

  • remote host에 있는 procedure를 호출하겠다.
  • marshaling 한 파라미터를 서로 넘겨줌 (쉽게, server, client 간에 넘겨줄 parameter 형식 맞춰준다고 생각)
    ex. serialization
  • IPC의 확장 개념

 

 

+ Recent posts