티스토리 뷰

프로세스 간에는 기본적으로 자원을 공유할 수 없다. 각 프로세스는 독립된 주소 공간을 가지고 있기 때문에 자신의 메모리 공간에만 접근할 수 있다. 만약 프로세스가 서로의 메모리 공간에 접근할 수 있다면 의도치 않게 데이터를 변경하거나 충돌이 발생할 수 있다.

만약 프로세스 간에 데이터를 주고받고 싶다면 IPC(Inter-Process Communication) 방식을 사용해야 한다.

 

1. 공유 메모리

공유 메모리 방식은 사용자 영역 일부를 데이터를 주고받기 위한 메모리 공간으로 사용한다. 프로세스 A는 B에게 전달하고자 하는 데이터를 공유 메모리에 저장하고, 프로세스 B는 공유 메모리에 저장된 데이터를 읽는다. 이렇게 되면 프로세스 A가 B에게 데이터를 전달한 것과 마찬가지가 된다.

 

공유 메모리 방식은 사용자 영역에서 데이터를 주고 받는 방식이기 때문에 커널의 개입이 없다. 따라서 커널이 개입하는 메시지 전달 방식보다 빠르다. 대신, 커널의 제어를 받지 않기 때문에 공유 메모리 영역을 여러 프로세스가 동시에 읽고 쓸 경우 데이터 일관성이 깨질 수 있다. 따라서 적절한 동기화 처리가 필요하다.

 

2. 메시지 전달

메시지 전달 방식은 프로세스 간에 주고받는 데이터를 커널 영역을 통해 전달하는 방식이다. 공유 메모리 방식이 사용자 영역 내에서만 데이터를 주고받았다면, 메시지 전달 방식은 커널을 통해 데이터를 주고받기 때문에 공유 메모리 방식보다 데이터를 주고받는 속도가 느리다.

 

커널을 통해 데이터를 주고 받을 때 send()rev()라는 시스템 콜(system call)을 사용한다. 각 프로세스는 시스템 콜을 통해 데이터를 주고받을 수 있다.

 

3. 파이프 (Pipe)

파이프 방식은 데이터를 한 방향으로 전달하는 통로를 제공한다. 프로세스 A에서 파이프를 통해 데이터를 보내면 이 데이터를 프로세스 B가 받을 수 있다.

3-1. 익명 파이프(Anonymous Pipe)

익명 파이프는 부모-자식 관계에 있는 프로세스 간에 데이터를 주고받는 방식이다.

  • 부모-자식 프로세스 간의 통신 : 부모 프로세스가 파이프를 생성하고 이를 자식 프로세스에게 상속한다.
  • 생성 방법 : pipe() 시스템 호출을 통해 익명 파이프가 생성된다.

3-2. 네임드 파이프(Named Pipe)

네임드 파이프는 서로 관련 없는 독립된 프로세스 간에 데이터를 주고 받는 통로를 제공한다.

  • 독립된 프로세스 간의 통신 : 부모-자식 관계에 있지 않은 독립된 프로세스 간에도 사용할 수 있다.
    • 파이프에 이름이 부여되어 독립된 프로세스 간에도 사용할 수 있다.
  • 생성 방법 : mkfifo() 시스템 호출을 통해 네임드 파이프가 생성된다.

파이프 방식은 단방향 통신을 기본적으로 제공하고 이를 반이중 통신(Half-Duplex)라고 한다. 반이중 통신은 한 번에 한 방향(read-only, write-only)으로 데이터를 주고받을 수 있는 구조이다. 만약 양방향 통신인 전이중 통신(Full-Duplex)이 필요하다면 두 개의 파이프를 만들어야 한다. 그러나 파이프를 두 개를 구현하는 것은 복잡하기 때문에 전이중 통신을 고려한다면 파이프 방식은 좋은 선택이 아니다.

 

4. 메시지 큐(Message Queue)

메시지 큐 FIFO(First In, First Out) 방식으로 동작하므로 메시지가 큐에 들어간 순서대로 처리된다. 즉, 먼저 보낸 메시지가 먼저 읽히는 구조이다. 단, 메시지의 우선순위가 설정된 경우에는 우선순위에 따라 메시지가 처리될 수도 있다. 이로 인해 중요한 메시지를 먼저 처리하는 유연한 통신이 가능하다. 메시지 큐는 부모-자식 관계가 아닌 독립적인 프로세스 간 통신도 지원한다.

 

메시지 큐를 사용하지 않는다면 동기 방식으로 데이터를 주고받아야 한다. 동기 방식에서는 송신자가 직접 수신자에게 메시지를 전달하고 수신자가 해당 메시지를 받았는지 확인해야 통신이 완료된다. 이 방식은 End-To-End 통신이라고도 하며 송신자와 수신자가 동시에 상호작용해야 통신이 이루어진다. 즉, 송신자는 수신자가 메시지를 받을 때까지 대기해야 한다.

반면, 메시지 큐를 사용하면 송신자와 수신자 사이에 큐가 중간에 위치하게 된다. 송신자가 메시지를 큐에 넣으면 송신자는 즉시 작업이 완료된 것처럼 처리되며, 큐에서 수신자가 해당 메시지를 읽을 때까지 기다리지 않아도 된다. 이렇게 비동기 통신이 가능하기 때문에 송신자는 다음 작업을 바로 진행할 수 있고 수신자는 자신이 준비된 시점에서 메시지를 처리할 수 있다.

 

수신자에 의해 큐에 담긴 메시지가 꺼내어지면 그 메시지는 큐에서 삭제된다. 메시지 큐는 커널 공간에서 관리되며 메모리 내에 생성된다. 메시지 큐의 크기는 제한이 있기 때문에 큐가 가득 찬다면 수신자가 메시지를 수신할 때까지 송신 프로세스는 대기해야 한다.

 

IPC(Inter Process Communication) 정리

  • 공유 메모리 방식
    • 장점 : 커널의 개입 없이 데이터를 주고받기 때문에 데이터를 주고받는 속도가 빠르다.
    • 단점 : 여러 프로세스가 공유 메모리에 동시에 접근하면 데이터 일관성이 깨질 수 있다. 따라서 동기화 처리를 해주어야 한다.
  • 메시지 전달 방식
    • 장점 : 커널의 시스템 콜에 의해 데이터를 주고받으므로 안전하게 데이터를 주고받을 수 있다.
    • 단점 : 커널이 개입하여 데이터를 주고받기 때문에 속도가 느리다. 

 

 

Total
Today
Yesterday
최근에 올라온 글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30