프로세스 간 통신 (IPC)

최정은·2022년 10월 27일
0

Backend Roadmap

목록 보기
17/23
post-thumbnail

IPC란?

프로세스는 자신에게 할당된 메모리 내의 정보만 접근할 수 있고, 이를 벗어나서 접근할 경우 (C의 경우 segmentation fault) 오류가 발생한다. 이는 안전성을 위해 OS에서 자기 프로세스의 메모리만 접근하도록 강제하는 것이다.

프로세스 간 통신(Inter Process Communication, IPC)은 프로세스끼리 서로 데이터를 주고받는 행위 또는 그에 대한 방법을 뜻한다. IPC에는 같은 컴퓨터에 있는 프로세스뿐만 아니라 네트워크로 연결된 다른 컴퓨터에 있는 프로세스와의 통신도 포함된다.

IPC 종류

1) 공유 메모리 (Shared Memory)를 이용한 통신

  • 말 그대로 메모리의 일정 영역을 공유하는 것이다. 데이터 자체를 공유하도록 지원한다.

  • 공유 메모리는 커널에서 관리된다. 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당한다. 이후 어떤 프로세스건 해당 메모리 영역에 접근할 수 있다.

    • 공유 메모리가 각 프로세스에게 attach 하는 방식으로 동작한다.
  • 프로세스 간 read, write를 모두 필요로 할 때 사용한다.

  • 중개자 없이 곧바로 메모리에 접근할 수 있기 때문에 모든 IPC 중에서 가장 빠르게 동작한다.

2) 이름 없는, 익명 파이프 (Anonymous Pipe)를 이용한 통신

  • 일반적으로 파이프라고 하면 이름 없는 파이프를 가리킨다.

  • 부모와 자식 프로세스 혹은 같은 부모를 가진 자식 프로세스와 같이, 서로 관련 있는 프로세스 간 통신에 사용된다.

  • pipe 함수로 파이프를 생성한다.

  • 생성된 파이프는 두 개의 프로세스를 연결하고, 하나의 프로세스는 데이터를 쓰기만 다른 하나는 읽기만 할 수 있다. 한쪽 방향으로만 통신이 가능하기 때문에 반이중 통신에 속한다.

  • 파이프로 전이중 통신을 하려면 파이프 2개를 사용해야 한다.

양방향 통신은 전이중 통신과 반이중 통신과 나뉜다.

전이중 통신 : 데이터를 동시에 양쪽 방향으로 전송할 수 있는 구조다.
반이중 통신 : 데이터를 양쪽 방향으로 전송할 수 있지만 동시 전송은 불가능하고, 특정 시점에 한쪽 방향으로만 전송할 수 있는 구조다.

3) 이름 있는 파이프 (Named Pipe)를 이용한 통신

  • FIFO라 불리는 특수 파일을 이용한다.

  • 서로 관련 없는 프로세스 간 통신에 사용된다. 부모 프로세스와 무관한 다른 프로세스와 통신할 수 있다.

    • 이름이 있는 파일을 사용하기 때문에 관련 없는 프로세스와 가능하다.
    • 외부 프로세스와 통신 가능하다.
  • mkfifo 를 통해 명명된 파이프를 생성한다.

  • 익명 파이프와 마찬가지로 전이중 통신을 위해 파이프 2게를 만들어야 한다.

4) 메시지 큐 (Message Queue)를 이용한 통신

  • 큐는 FIFO(선입선출)의 자료 구조를 가지는 통신 설비로 커널에서 관리한다.

  • 입출력 방식으로는 이름 있는 파이프와 동일하다.

  • 이름 있는 파이프와 다른 점은, 이름 있는 파이프는 데이터의 흐름이라면 메시지 큐는 메모리 공간이라는 점이다.

  • 어디에서나 물건을 꺼낼 수 있는 컨베이너 벨트와 유사하며 컨베이너 벨트에 올라올 물건에 라벨을 붙이면서 동시에 다양한 물건을 다룰 수 있는 것에 비유할 수 있다.

  • 즉, 큐에 넣을 데이터에 번호를 붙임으로써 여러 개의 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.

  • 구조체 기반으로 통신한다.

5) 메모리 맵 (Memory Map)을 이용한 통신

  • OS에서 파일을 다루는 방법 중 하나로써, 공유 메모리처럼 메모리를 공유한다는 측면에 있어서 비슷한 측면이 있다.

  • 하지만 메모리 맵은 열린 파일을 메모리에 매핑시켜서 공유한다.

  • 프로세스의 가상 메모리 주소 공간에 파일을 매핑한 뒤, 가상 메모리 주소에 직접 접근하는 것으로 파일 읽기 또는 쓰기를 대신한다.

  • 주로 파일로 대용량 데이터를 공유해야 할 때 사용한다.

  • 대부분의 OS에서는 프로세스를 실행할 때, 실행 파일의 각 세그먼트를 메모리에 사상하기 위해 메모리 맵 파일을 이용한다.

  • OS에서 페이징 기법을 사용하여 파일을 관리하며, 페이지 크기에 따라 적절히 파일의 내용을 읽고 쓸 수 있다.

  • 메모리 맵 파일은 메모리 맵 파일을 사용하기 이전 또는 이후에만 크기를 바꿀 수 있다.

6) 소켓 (Socket)을 이용한 통신

  • 여러 컴퓨터가 네트워크로 연결되어 있을 때도 소켓을 통해 데이터를 주고받는다.

  • 서버-클라이언트 환경을 구축하는데 용이하다.

    • 서버단에서는 bind, listen, accept를 진행해 소켓 연결을 위한 준비를 한다.
    • 클라이언트단에서는 connect를 통해 서버에 요청하고 연결이 수립된 후에는 소켓에 전달함으로써 데이터를 주고받는다.
    • 각 컴퓨터에서 임의의 포트를 정하고, 해당 포트를 통해 데이터를 주고받는다.
    • 연결이 끝난 후에 반드시 소켓을 닫아주어야 한다.
  • 전이중 통신이 가능하다.

  • 중대형 애플리케이션에서 주로 사용한다.

요약

IPC 종류공유 메모리익명 파이프이름 있는 파이프메시지 큐메모리 맵소켓
용도다른 프로세스와 양방향 통신부모-자식 간 단방향 통신다른 프로세스와 단방향 통신다른 프로세스와 단방향 통신다른 프로세스와 양방향 통신다른 시스템 간 양방향 통신
공유 매개체메모리파일파일메모리파일+메모리소켓
통신 단위구조체streamstream구조체페이지stream
통신 방향양방향단방향단방향단방향양방향양방향
통신 가능 범위동일 시스템동일 시스템동일 시스템동일 시스템동일 시스템동일+외부 시스템

프로세스 간 통신(IPC)에서 프로세스 간 데이터를 동기화하고 보호하기 위해 세마포어(semaphore)와 뮤텍스(mutex)를 사용한다.

Reference

프로세스 간 통신
IPC

profile
https://dolmeng22.tistory.com 로 이전했습니다~

0개의 댓글