ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [IPC] IPC(Inter-Process Communication)란?
    Computer Science 2023. 12. 28. 16:31

    IPC

    IPC는 Inter-Process Communication의 약자로 프로세스 간 통신을 말한다. 프로세스는 독립된 실행 객체로서 서로 독립되어 있기 때문에 다른 프로세스의 영향을 받지 않는다. 대신 서로 간 통신을 위해 커널 영역에서 IPC라는 내부 프로세스 간 통신을 제공한다. 

     

    커널

    운영체제 자체도 소프트웨어이기 때문에 메모리에 올려야 사용할 수 있다. 하지만 메모리 공간의 제약으로 운영체제 중 필요한 부분 만을 메모리에 올려놓고 그렇지 않은 부분은 필요할 때 메모리에 올려 사용하게 된다. 이때 메모리에 상주하는 운영체제의 부분을 커널이라고 한다. 보통은 운영체제라고 하면 커널을 말한다. 커널은 메모리에 상주하는 부분으로써 운영체제의 핵심적인 부분이다.

     

     

    프로세스 VS 스레드

    프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램이다. 프로그램을 구동하는 작업 단위이기도 하다. 프로그램이 메모리에 로드되면 운영체제로부터 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받는다. 한 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다. 프로세스는 자신만의 고유 공간과 자원을 할당 받아 사용한다.

     

    스레드는 어떠한 프로그램 내에서 특히 프로세스 내에서 실행되는 흐름의 단위이다. 프로세스 내에서 Stack만 할당받고 프로세스 내 스레드끼리 부모 프로세스의 Code, Data, Heap 영역은 공유한다. 프로세스 내 스레드들은 서로 주소 공간이나 자원을 공유하며 실행할 수 있다. 스레드는 다른 스레드와 공간, 자원을 공유한다. 

     

     

     

     

    프로세스 간 통신이 필요한 경우

    프로세스는 독립된 실행 객체로 다른 프로세스와 상관없이 독립적으로 실행된다. 하지만 다른 프로세스와 함께 실행되며 통신이 필요한 경우가 존재한다.

     

    ▷ 데이터 공유

    프로세스는 생성되면서 메모리 공간과 자원을 할당받지만, 스레드는 메모리 공간과 자원을 공유한다. 프로세스는 데이터를 공유하기 위해서 IPC를 통해 별도의 공간을 만들어주어야 한다.

     

    프로세스 간 데이터 동기화

    IPC 통신에서 프로세스 간 데이터를 동기화하고 보호하기 위해 세마포어와 뮤텍스를 사용한다. 세마포어와 뮤텍스는 공유된 자원에 한번에 하나의 프로세스만 접근시키기 위해 사용한다.

     

    중요 프로세스의 안정성

    하나의 프로세스에서 공유 자원을 동기화한 후 여러 스레드가 사용하면 데이터 공유를 상대적으로 쉽게 할 수 있다. 다만 하나의 프로세스가 죽어버리면 프로세스 내 모든 스레드가 죽어버려 위험한 상황이 발생한다. 

    예를 들어 api를 제공하는 작업과 데이터를 분석/적재하는 작업을 하나의 프로세스에서 하는 경우, 데이터 분석 과정에서 예외가 발생해 프로그램이 내려간다면 클라이언트에서 api 응답이 나가지 못하는 상황이 발생할 수 있다. 

     

    계산 속도 향상

    여러 프로세스가 동시에 작업을 병렬적으로 처리하기 때문에 처리 속도를 높일 수 있다.

     

    모듈성

    시스템 기능을 별도의 프로세스 또는 스레드로 분할하여 모듈 식 방식으로 시스템을 구성할 수 있다.

     

    편의성

    사용자가 여러 작업을 동시에 수행할 수 있다.

     

     

     

     

    IPC 종류

    내부 프로세스 간 통신에 다양한 방식이 존재하기 때문에 필요에 따라 적절한 IPC를 선택할 필요가 있다. 프로세스간 통신 방법에 따라 운영체제 지원 방식과 소켓(네트워크)을 사용하는 방식이 있다.

     

    운영체제 지원 방식

    • 파이프
    • 메모리맵
    • 공유메모리
    • 커널 메시지 큐(프로세스간 통신)
    • 파일
    • 시그널

    네트워크 사용 방식

    • 소켓
    • 네트워크 메시지 큐(분산 시스템 간 통신. Kafka, RabbitMQ)
    • RPC(Remote Procedure Call)
    • DBMS, 캐시(Redis)

     

     

     

    Message Passing Model VS Shared Memory Model

    IPC의 운영체제 지원 방식에 대해 Message Passing 모델과 Shared Memory 모델이라는 기본 모델이 있다. 데이터를 공유하기 위해 통신을 이용해 데이터를 주고받는 것이 전자, 데이터를 공유해서 함께 사용하는 것이 후자에 해당한다. 

     

    ▷ Message Passing Model

    메시지 패싱 모델은 프로세스간에 교환되는 메시지를 통해 통신이 발생한다. 메시지 큐를 사용하여 프로세스 간 메시지를 주고받는 것이다. Producer측에서 send한 메시지를 Consumer가 받아 사용하는 방식이다. 메시지 패싱 모델은 시스템 콜을 사용하여 구현되는데 주요작업인 send, receive 등을 할 때 커널이 개입된다. 커널 개입으로 인해 많은 시간이 소요된다는 단점이 있다. 파이프와 메시지 큐 방식이 여기 포함된다.

     

    Shared Memory Model

    협력 프로세스가 공유 메모리 영역을 설정한 다음 공유 영역에서 데이터를 읽고 쓰는 방식으로 정보를 교환한다. 시스템 콜이 공유 메모리 영역을 설정하는데만 필요하기 때문에 메시지 패싱 모델보다 빠르다. 즉, 일단 설정되면 메모리 액세스로 처리되기 때문에 커널의 도움이 필요 없다.

    이 모델에서는 프로세스가 공유 메모리에 액세스할 때 작업을 동기화할 수 있는 매커니즘을 제공해야한다. 이 문제를 해결하기 위해 세마포어와 뮤텍스를 사용한다.

     

     

     

    PIPE(파이프)

    파이프는 통신을 위한 메모리 공간(버퍼)를 생성하여 데이터를 주고 받을 수 있게 해준다. 두 개의 프로세스를 연결하여 하나의 프로세스는 데이터를 쓰기만, 다른 하나는 데이터를 읽기만 할 수 있다. 한쪽 방향으로 통신이 가능한 파이프 특징 때문에 Half-Duplex(반이중) 통신이라고 부르기도 한다. Unix는 파이프를 특수한 유형의 파일로 취급하므로 read/write 시스템 콜을 사용하여 파이프에 액세스할 수 있다. 파이프는 Anoymous PIPE와 Named PIPE가 존재한다.

     

    Anoymous PIPE(익명 파이프)

    부모-자식, 형제 프로세스 같은 통신할 프로세스를 명확하게 알 수 있는 경우 사용한다. 읽기와 쓰기 즉, 송수신을 모두 하기를 원한다면 두 개의 파이프를 만들어야한다.

    장점 ● 매우 간단하게 사용할 수 있다.
    ● 한쪽 프로세스가 읽기만 하고 다른 하나는 쓰기만 하는 데이터 흐름을 가질 때 사용한다.
    단점 ● 읽기, 쓰기를 모두 해야한다면 PIPE를 두개 만들어야하는데 구현이 복잡하다.
    ● 같은 PPID(부모 프로세스)를 가지는 프로세스들 사이에서만 통신이 가능하다.

     

     

     Named PIPE(FIFO)

    서로 모르는 상태의 프로세스들 사이의 통신에서 사용한다. 같은 PPID를 가지는 프로세스들 사이에서만 통신이 가능한 익명 파이프의 단점을 극복한 PIPE의 확장이다.

    Named PIPE가 서로 다른 프로세스들 사이에서 통신이 가능한 이유는 프로세스 통신을 위해 이름이 있는 파일을 사용하기 때문이다. FIFO라는 특수 파일을 이용해 서로 관련 없는 프로세스가 통신한다. Named PIPE의 생성은 mkfifo를 통해 이뤄지는데, mkfifo가 성공하면 명명된 파일이 생성된다.

    장점 ● 서로 다른 프로세스들 사이의 통신이 가능하다.
    단점 ● 읽기 쓰기가 동시에 가능하지 않아 read-only, write-only만 가능하다. 
    (통신 선로가 파일로 존재하므로 하나를 읽기 전용, 하나를 쓰기 전용으로 열어 해결할 수 있다.)
    ● 프로세스 간 양방향 통신을 위해서는 두 개의 FIFO파일이 필요하다. (자원 낭비, 비효율적) 

     

     

     

    메시지 큐

    메시지 큐는 선입 선출 자료구조를 가지는 중앙 매개체로 커널에서 관리한다. 입출력 방식으로 보자면 PIPE와 동일하다. PIPE가 데이터의 흐름이라면 메시지 큐는 메모리 공간이라는 점에서 다르다. PIPE나 FIFO와 달리 다수의 프로세스 간 메시지를 전달할 수 있다. 사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.

    장점 ● 다수의 프로세스 간 메시지를 전달할 수 있다. (양방향 통신)
    단점 ●  메시지 큐는 메모리 공간으로 제약 존재

     

     

    [메시지 큐] 메시지 큐에 대해서 (메시지 큐, MOM, 특징, 이점 등)

    MOM (Message Oriented Middleware) MOM은 메시지 지향 미들 웨어로서 어플리케이션의 메시지를 중간에서 관리해주는 시스템이다. 여기서 미들웨어란 무엇일까? 개념적으로 미들웨어는 응용프로그램과 운

    miraekwak.tistory.com

     

     

     

     

    공유 메모리

    공유메모리는 데이터를 공유해서 함께 사용하는 방식이다.

     

    프로세스는 자신만의 메모리 영역을 가지고 있다. 이 메모리 영역은 다른 프로세스가 접근해서 함부로 데이터를 읽거나 쓰지 못하도록 커널에 의해서 보호가 되는데, 만약 다른 프로세스의 메모리 영역을 침범하려고 하면 커널은 프로세스에 SIGSEGV(경고시그널 - 할당된 메모리의 범위를 벗어나는 곳에서 읽기, 쓰기를 시도할 때 발생)을 보내게 된다.

     

    다수의 프로세스가 동시에 동작하는 Linux운영체제의 특성상 프로세스의 메모리 영역은 반드시 보호되어야 한다. 하지만 메모리 영역에 있는 데이터를 다른 프로세스도 사용할 수 있도록 해야할 경우도 필요하다. PIPE 등을 이용해서 데이터 통신을 통해 데이터를 전달하는 방법도 있지만, Thread 처럼 메모리 영역을 공유한다면 더 편하게 데이터를 함께 사용할 수 있다.

     

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

     

    장점 ● 프로세스 간 read/write를 모두 필요로 할 때 사용한다.
    ● 공유 메모리는 중개자가 없어 곧바로 메모리에 접근할 수 있기 때문에, 다른 모든 IPC 중에서 가장 빠르게 작동한다. 
    단점   여러 프로세스가 동시에 접근하지 못하도록 동기화 작업이 필요하다. (세마포어)

     

     

     

     

    메모리 맵

    공유 메모리와 마찬가지로 메모리를 공유한다는 점에서 비슷하다. 차이점은 메모리 맵의 경우 열린 파일을 메모리에 맵핑시켜서 공유한다는 점이다. 주로 파일로 대용량 데이터를 공유해야할 때 사용한다. FILE IO가 느릴 때 사용하면 좋다. 파일은 시스템의 전역적인(모두 공유할 수 있는) 자원이므로 서로 다른 프로세스들끼리 데이터를 공유하는데 문제가 없다.

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

    장점 ● 데이터가 메모리에 이미 올라와있는 것처럼 간단하게 접근할 수 있다.
    ● 일반적인 파일 IO에 비해 나은 성능을 보여준다.
    ● 비동기 IO를 사용하지만 시스템에서 처리해주기 때문에 스레드 문제를 걱정할 필요가 없다.
    단점  일반 파일 IO에 비해 상당히 많은 메모리를 요구한다.
    ● 많은 데이터를 얼마나 오랫동안 메모리에 둘 것인지 컨트롤 할 수 없다. 

     

     

     

     

    시그널(Signal)

    시그널은 특정 이벤트를 프로세스에 알리는 IPC 매커니즘이다. 시그널은 사용자 애플리케이션에서 동기적(코드를 진행하면서 발생 ex. 잘못된 메모리 액세스)로 발생할 수 도 있고, 비동기적(외부 이벤트에 의해 발생 ex. 종료)으로 발생할 수도 있다.

    특정 이벤트에 의해 시그널이 생성되고 이 시그널이 프로세스에 전달된다. 전달받은 프로세스의 시그널 핸들러는 해당 시그널을 처리한다. 프로세스는 각 시그널에 대해 커널에서 제공되는 default handler를 오버라이딩하여 시그널 핸들러를 정의할 수 있다.

    장점 ● 프로세스에 이벤트나 알림을 보내는 간단하고 빠른 통신 매커니즘이다.
    단점 작은 양의 정보나 데이터 전달을 위해 사용하기 때문에 데이터의 한계가 존재한다.
    ● 비동기적으로 발생해 실행 예측 불가능으로 안전성이 떨어진다.

     

     

     

     

    세마포어(Semaphore)

    세마포어는 프로세스간 데이터를 동기화하고 보호하는데 목정을 둔다. 프로세스간 메시지 전송을 하거나 공유 메모리를 통해서 특정 데이터를 공유하게 될 경우 공유된 자원에 여러 개 프로세스가 동시에 접근하는 문제가 발생한다. 이를 단지 한번에 하나의 프로세스만 접근 가능하도록 만들어줘야한다. 이때 사용하는 것이 세마포어이다. 한 프로세스가 사용하고 있는 동안에 세마포어를 세워서 다른 프로세스를 대기시키고 사용이 끝나면 해제시키는 방법으로 사용한다. 

     

     

    세마포어 VS 뮤텍스

      Mutex Semaphore
    정의 공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 것 공유된 자원의 데이터를 여러 프로세스가 접근하는 것을 막는 것
    상태 상태가 0, 1 두개 (이진 세마포어) 세마포어는 뮤텍스가 될 수 있다
    해제 뮤텍스 소유 중인 스레드가 뮤텍스 해제 세마포어를 소유하지 않는 스레드가 세마포어 해제
    저장 프로세스 범위를 가지고 종료될 때 자동 clean 파일 시스템 상의 파일 형태로 존재
    사용 동기화 대상이 오직 하나일 때 동기화 대상이 하나 이상일 때

     

     

     

     

    소켓(Socket)

    소켓은 동일한 호스트 운영체제에서 실행되는 프로세스 간 데이터를 교환하기 위한 데이터 통신 엔드 포인트이다. 데이터 교환을 위해 양쪽 PC에서 각각 임의의 포트를 정하고 해당 포트 간의 대화를 통해 데이터를 주고 받는 방식이다. 이때 각각 PC의 포트를 담당하는 소켓은 각각 하나의 프로세스다.

    1. 각각의 PC엣 프로세스를 통해 타 PC PORT에 연결하라는 명령을 보내게 되면
    2. 두 프로세스는 서로 확인 과정을 거쳐 연결을 진행하고
    3. 연결 후 마치 PIPE와 같이 1대 1로 데이터를 주고 받는 방식이다.

    클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 대 사용한다. 전이중(Full Duplex) 통신이 가능하다.

    장점 ● 서버 클라이언트 환경을 구축하는데 용이하다.
    ● 범용적인 IPC로써 양방향 통신이 가능하다.
    ● 패킷 단위로 주고 받음으로써 직관적으로 이해하기 쉬운 코드를 만들 수 있다.
    단점 Internet UDP와는 달리 경로를 지정할 수 없다.

     

     

     

     

    RPC(Remote Procedure Call)

    RPC는 분산 네트워킹 망에서 많이 사용되는 방식이다. 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게 하는 프로세스 간 통신 기술이다. 원격 프로시저 호출을 이용하면 프로그래머는 함수가 실행 프로그램에 로컬 위치에 있든 원격 위치에 있든 간에 동일한 코드를 이용할 수 있다. 해당 방법은 분리된 PC에 저장된 데이터를 마치 내 PC에 존재하는 것처럼 데이터를 가져와 사용하는 통신방법이다. 스텁(stub)을 통해서 마치 자신의 디스크에 존재하는 것처럼 착각을 일으켜 사용하는 방식이다.

     

    프로시저

    특정 작업을 수행하기 위한 프로그램의 일부, 일련의 작업 순서

     

    스텁

    서버측에서 실제 절차를 추상화하는 프록시 객체이다. 클라이언트 측 스텁은 서버를 찾고 파라미터를 직렬화한다. 즉 네트워크에서 전송하기 위한 형태로 파라미터를 패키징하는 것이다. 서버 측 스텁은 이 메시지를 수신하고 직렬화된 파라미터 압축을 풀고 서버에서 프로시저를 수행한다.

     

     

     

     

    정리

      PIPE Named PIPE MQ Shared Memory Memory Map Socket RPC
    사용시기 부모 자식 간 단방향 통신 시 다른 프로세스와 단방향 통신 시 다른 프로세스와 단방향 통신 시 다른 프로세스와 양방향 통신 시 다른 프로세스와 양방향 통신 시 다른 시스템 간 양방향 통신 시 다른 시스템 간 양방향 통신 시
    공유매개체 파일 파일 메모리 메모리 파일+메모리 소켓 RPC
    통신 단위 Stream Stream 구조체 구조체 페이지 Stream Stream
    통신 방향 단방향 단방향 단방향 양방향 양방향 양방향 양방향
    통신 가능 범위 동일 시스템 동일 시스템  동일 시스템 동일 시스템 동일 시스템 동일 + 외부 시스템 동일 + 외부 시스템

     

     

     


    참고

    댓글

Designed by Tistory.