본문 바로가기
개발/CS

IPC(Inter Process Communication) - 프로세스 간 통신

by 수인분당선 2024. 12. 2.
반응형

안녕허세염
오늘 알아볼 내용은 IPC입니당

이전에 공부한 바와 같이 우리가 알고있는 프로세스들은 각각 독립적으로 실행됩니다.
이말은 즉슨 프로세스 각각은 다른 프로세스로 인해 영향을 받지 않는다는 말과 같습니다.
하지만 이런 프로세스들 간에도 서로 통신을 해야하는 경우가 있습니다. 다른 프로세스의 자원을 읽어와야 한다던지.. 하는 경우가 종종 있습니다
이때 나오는 개념이 바로 프로세스 간 통신수단인 IPC입니다!


IPC(Inter Process Communication)

: 프로세스 간 통신을 가능하게 해주는 수단

이 통신수단은 커널에 탑재되어있는 설비 수단입니다.
IPC 통신에서는 프로세스 간의 데이터를 공유하는 과정에서 데이터가 손상되거나 문제가 발생하는 것을 막고, 동기화를 원활하게 돕기 위해 이전에 배웠던 세마포어뮤텍스를 활용한다고 합니다. 그 두가지 기법을 활용하면 데이터를 공유해야하는 순간에도 안전한 데이터 공유가 가능합니다!
번에 하나의 프로세스만 접근시킬 때)
 
IPC는 상황에따른 여러가지 종류가 있습니다. 어떤 통신을 하느냐에 따라 적절한 IPC를 선택하여 사용합니다.

 



1. 익명 PIPE

: 부모-자식 간 관계에서 두 개의 프로세스 간의 단방향 데이터 통신
 
파이프를 통한 두 개의 프로세스 연결방법. 하나의 프로세스는 읽기만, 다른 하나는 쓰기만 가능한 한방향 통신으로 반이중통신이라고도 부릅니다.

사용이 간단하며 데이터의 흐름 자체도 읽기-쓰기만 가능한 상태인만큼 단순한 데이터의 흐름일 경우 효율적이라고 할 수 있습니다. 대체로 부모자신간의 관계에서 주로 사용되고, 운영체제 수준에서 관리되기 때문에 신뢰성이 높은 편입니다.
반이중통신을 기본으로 가지지만, 양쪽으로도 수신이 가능하며 양방향수신을 위해서는 2개의 파이프를 만들어 진행해야합니다. 하지만 파이프라 2개가 되는 순간부터 복잡한 구현을 필요로 하다는 단점을 가지고 있습니다.
 

활용 사례

  • 리눅스/유닉스 쉘 명령어
    예를 들어, ls | grep 'text'는 익명 파이프를 사용해 ls 명령의 출력을 grep 명령의 입력으로 전달.
  • 간단한 프로세스 간 데이터 전달
    예: 한 프로세스가 데이터를 생성하고, 다른 프로세스가 이를 소비(읽기).

 

2. Named PIPE(FIFO)

:  익명파이프와 같은 방식으로 통신하지만, 이름을 통해 통신하기에 부모-자신등의 관계가 아닌 프로세스들 간에도 통신이 가능한 방법

익명파이프와 반대인 이름파이프입니다..
만약 통신할 프로세스들 간에 부모-자식과 같은 관계가 존재한다면 익명 파이프를 사용할 수 있지만, 서로 통신한 프로세스를 명확하게 알지 못하는 각각의 독립적인 프로세스 간의 통신이 필요한 경우, 이름파이프를 사용해야합니다.
통신방법은 익명파이프와 동일하게 읽기와쓰기가 각각의 두 프로세스가 하나씩만 작동되며, 양방향통신을 위해서는 2개의 파이프가 필요합니다.
 

활용 사례

  • 프로세스 간 비동기 데이터 공유
    예: 데이터 수집기 프로세스와 분석기 프로세스가 서로 독립적으로 동작하며 데이터 공유.
  • 멀티미디어 애플리케이션
    예: 오디오나 비디오 스트림 데이터를 여러 프로세스가 공유.

 

3. Message Queue

: 우리가 알고있는 Queue를 활용하여 통신하는 방법으로 파이프와 같은 데이터의 흐름이 아닌 메모리 공간의 개념
 
말이 조금 어렵기에 쉽게 예를 들어서 설명하자면, 
한 프로세스가 다른 프로세스에 접근해야하는 상황에서
Message Queue는 접근해야하는 해당 프로세스의 Message를 Queue에 송신하여 넣어줍니다.
그리고, 해당 Message를 전달받고자 하는 프로세스가 Queue에 존재하는 데이터를 읽어 순차적으로 전달하여 처리합니다.
이 과정에서 Queue의 형태로 데이터가 들어오고 나가게 되므로 이런 이름이 붙게 되었습니다.
여기서 Queue는 운영체제의 커널에서 관리합니다.
 

활용 사례

  • 이벤트 기반 시스템
    예: POS(Point of Sale) 시스템에서 주문 정보 전달.
  • 비동기 작업 처리
    예: 이메일 서비스에서 수신된 이메일을 다른 프로세스에 전달.

 

4. 공유 메모리

: 데이터 자체를 모두가 이용할 수 있도록 공유 메모리에 담아두는 방법

위의 방법들과 다르게 이 방법은 통신을 지원하는 게 아닌 데이터 자체를 공유하도록 열어두는 방법입니다

프로세스의 특징 중 하나가 프로세스의 메모리 영역은 서로 침범할 수 없다는 점인데, 여기서 다른 프로세스들이 데이터를 사용할 수 있도록 공유하고 싶은 상황이 발생할 수 있게됩니다.
그때 파이프, 메세지 큐 등을 통한 통신도 가능하지만 만약 다른 프로세스들이 자주 통신을 접해야하는 경우라면 오히려 아예 공유메모리에 넣어두고 공유하는게 훨씬 더 편하기도 하고, 속도적으로도 가장 빠릅니다.

공유메모리는 프로세스 간의 메모리 영역을 공유하여 사용합니다.
프로세스가 공유 메모리 할당을 커널에 요청하면, 커널이 프로세스에 메모리 공간을 할당해주고 이후 모든 프로세스는 해당 메모리 영역에 접근할 수 있게 된다고 합니다.
 
이 방법은 속도 뿐만 아니라 통신비용까지 절감할 수 있게 되지만, 동기화 문제가 발생할 확률이 높아 앞전에 말한 세마포어나 뮤텍스가 필요하고, 데이터를 보호하기 위한 추가적인 설계를 요구합니다.
 

활용 사례

  • 실시간 데이터 분석
    예: 센서 데이터를 다수의 분석 프로세스가 실시간으로 공유.
  • 게임 개발
    예: 게임 서버와 클라이언트 간의 빠른 상태 공유.

 

5. 메모리 맵

: 공유 메모리와 같이 메모리를 공유해주는 형태로, 열린 파일을 메모리에 맵핑시켜서 공유합니다(??)
작동 자체가 파일을 기반으로 하기 떄문에 주로 파일로 대용량 데이터를 공유해야 할 때 사용한다고 합니다.

 
활용 사례

  • 멀티미디어 데이터 처리
    예: 비디오 파일을 여러 프로세스에서 동시 처리.
  • 데이터베이스
    예: 파일 기반 데이터베이스의 페이지 캐싱.

6. 소켓

: 네트워크에 존재하는 소켓 단위를 활용한 통신 방법으로, 로컬뿐만아니라  원격 상에서 프로세스 간의 데이터를 공유해야하는 상황에서 사용됩니다.
이 방법에는 "클라이언트"와 "서버"의 개념이 수반되며, TCP/IP프로토콜을 활용하여 안정적으로 데이터를 전송할 수 있습니다.
하지만 구현 복잡도가 높고 원격 통신인만큼 성능이 다른 통신 방법에 비해 낮은 편입니다

활용 사례

  • 웹 서버와 클라이언트
    예: HTTP 통신.
  • 분산 시스템
    예: 분산 파일 시스템에서 데이터 동기화.

7. RPC(Remote Procedure Call)

: 분산 네트워크 망에서 사용되는 방법으로, 내부 간의 통신을 숨겨주고, 별도의 코딩 없이도 다른 주소 공간에서 함수 등을 실행할 수 있게 하는 방법
 
원격 프로시처 호출을 통해 프로시저는 프로세스가 원하는 데이터나 함수가 로컬이든 원격이든 로컬 함수를 사용하는 것처럼 자유롭게 이용할 수 있습니다.
소켓과 같이 클라이언트-서버 아키텍처 구조를 가졌을 때 자주 사용되고, 특히 안드로이드의 통신에서 해당 기법이 사용된다고 합니다.

이렇게 간략하게 IPC와 그 종류에 대해서 알아보았습니다.
디테일하게 개념을 안찾다보니 생각보다 간략하게 글이 정리가 되네요..
이러면안될것같기도하고
추가적으로 보충이 필요하다 싶으면 시간이 날 때(안한다는거아닌지) 그 부분에 대해서 따로 글을 파서 해보겠습니다..
 진짜하도록하겠습니다
그럼 파이팅!!!


참고자료
https://colevelup.tistory.com/3

https://gyoogle.dev/blog/computer-science/operating-system/IPC.html
https://bluemoon-1st.tistory.com/22
https://mysterlee.tistory.com/104
https://coder-in-war.tistory.com/entry/OS-01-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B0%84-%ED%86%B5%EC%8B%A0-IPC-RPC

반응형