프로그래밍/리눅스 프로그래밍

[프로세스간 통신] IPC(inter process communication) 종류

jinkwon.kim 2018. 9. 10. 17:12
728x90
반응형

[프로세스간 통신] IPC(inter process communication) 종류 (Linux)

 

 

IPC의 종류 

  1) PIPE

  2) Named PIPE

  3) Message Queue

  4) Shared Memory

  5) Memory Map

  6) socket

 

IPC 별 사용 시기 및 특징

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

 

IPC별 세부 설명

PIPE

    (1) 정의

      - 익명의 PIPE를 통해서 동일한 PPID를 가진 프로세스들 간에 단방향 통신을 지원

    (2) 구조

      -  FIFO 구조

      - 생성된 PIPE에 대하여 Write 또는 Read만 가능

    (3) 사용 시기

      - 부모 자식 프로세스간 통신 할때 사용

    (4) 유의사항

      - 쌍방 통신을 위해서는 Write용 PIPE하나 Read PIPE하나 씩 만들어야 한다.

      - read()와 write()가 기본적으로 block 모드로 작동하기 때문으로 프로세스가 read대기중이라면

        read가 끝나기 전에는 write를 할수가 없게 된다.

    (5) 도식화

    (6) 예제 코드 링크 

      - [IPC] pipe 예제 코드

 

Named PIPE

    (1) 정의

      - 이름을 가진 PIPE를 통해서 프로세스들 간에 양 방향 통신을 지원

        기본적으로는 단 반향을 많이 사용합니다. 단 , 양 방향 통신을 위해서는 O_RDWR mode로 열어야 합니다

      - 서로 다른 프로세스들이 PIPE의 이름만 알면 통신이 가능하다.

    (2) 구조

      - FIFO 구조

      - 생성된 PIPE에 대하여 Write 또는 Read만 가능

    (3) 사용 시기

      - 연관이 전혀 없는 프로세스간에 통신을 할때

    (4) 유의사항

      - 쌍방 통신을 위해서는 Write용 PIPE하나 Read PIPE하나 씩 만들어야 한다.

      - read()와 write()가 기본적으로 block 모드로 작동하기 때문으로 프로세스가 read대기중이라면

          read가 끝나기 전에는 write를 할수가 없게 된다.

       - 참고로 nonblock mode로 열면 대기 안하고 넘어갑니다.

    (5) 도식화

    (6) 예제 코드 링크 

      - [IPC] name pipe 예제 코드

 

Message Queue

    (1) 졍의

      - 메모리를 사용한 PIPE이다.

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

    (2) 구조

      - FIFO 구조

      - msgtype에 따라 다른 구조체를 가져올수 있다.

    (3) 사용시기

      - 프로세스간 다양한 통신을 할 때 사용 할수 있다.

    (4) 유의사항

      - 커널에서 제공하는 Message queue 이기 때문에 EnQueue 하는데 제한이 존재 한다.

    (5) 도식화

 

    (6) 예제 코드 링크 

      - [IPC] message queue 예제 코드

 

Shared Memory

    (1) 졍의

      - 시스템 상의 공유 메모리를 통해 통신한다.

    (2) 구조

      - 일정한 크기의 메모리를 프로세스간에 공유하는 구조

      - 공유 메모리는 커널에서 관리 된다,

      * 자세한 정보 : [메모리] share memory 사용법

    (3) 사용시기

      - 프로세스간 Read, Write를 모두 필요로 할때

    (4) 유의사항 

      - 프로세스간의 상요할려면 메모리 크키가 동일 해야 한다.

    (5) 도식화

    (6) 예제 코드 링크 

      - [IPC] shared memory 예제 코드

  

Memory Map

    (1) 정의

      - 파일을 프로세스의 메모리에 일정 부분 맵핑 키셔 사용한다.

    (2) 구조 (위키 설명 : 메모리 맵 파일 )

      - 위키보다 더 잘 설명할 자신이 없기에 위키 내용으로 대체합니다.

메모리 맵 파일을 사용하면 디스크에 있는 파일의 블록들과 프로세스의 페이지가 연결된다. 이 상태에서는 가상 메모리에 사상만 되어 있을 뿐이며, 실제 메모리에 파일을 불러오는 시기는 해당 주소에 읽거나 쓰기 작업을 시도할 때 이루어진다. 이 작업은 운영 체제에서 가상 메모리를 다루는 데 사용하는 페이징 기법과 같이 페이지 부재를 일으키는 방식을 이용한다. 일반적으로 파일에서 불러오는 자료는 페이지 크기와 같은 4KiB이지만, 몇몇 운영 체제에서는 하드디스크의 낮은 임의 접근 시간을 고려해 4KiB보다 많은 자료를 페이지로 올릴 수도 있다.

이 때문에 메모리 맵 파일로 작업 중인 데이터가 실제 파일로 바로 반영되지는 않으며, 페이지 교체 알고리즘에 따라 해당 페이지가 메모리에서 내려갈 경우, 또는 메모리 맵 파일을 닫는 과정에서 반영된다. 이것은 메모리 맵 파일과 파일 입출력 API를 동시에 사용할 때 문제가 되는데, 메모리 맵 파일을 통해 변경된 자료는 즉시 반영되지 않으므로 그 지점에 해당하는 자료를 파일 입출력 API를 사용하여 읽어오려 할 때 동기화 문제가 발생하게 된다. 따라서 메모리 맵 파일을 사용할 때에는 읽기 전용으로만 사용하는 목적이 아닌 이상 파일 입출력 API를 사용하지 않는 것이 좋다.

오른쪽 위의 예제 그림은 메모리 맵 파일을 사용할 때 프로세스의 가상 주소와 물리 주소, 그리고 파일들의 관계를 알 수 있다. 각 블록은 페이지 단위로 나타낸 것이다. 예제에서는 프로세스 2개와 파일 2개가 나오며, 이중 b2는 메모리 맵 파일의 공유를, b3는 사상이 되었으나 아직 메모리에 적재되지 않은 것을 나타낸다.

    (3) 사용시기

      - 파일로 대용량 데이터를 공유 할 때 사용한다.

      - FILE IO가 느릴때 사용하면좋다.

      - 대부분 운영 체제에서는 프로세스를 실행할 때 실행 파일의 각 세그먼트를 메모리에 사상하기 위해 

        메모리 맵 파일을 이용한다.

    (4) 유의 사항

      - write시기는  프로세스의 페이지가 메모리에에서 내려갈 때만 Write된다. 

        이렇게 때문에 메모리와 file Sync가 안맞을수 도있다.

      - IA-32 기반 시스템에서 하나의 프로세스에서 PAE 기술을 사용하지 않고 사용 가능한 최대 크기는

        4GB로 제한된다

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

        파일의 크기를 바꿀 수 있다.

    (5) 도식화

    (6) 예제 코드 링크 

      - [IPC] 메모리 맵 mmap() 예제 코드

 

Socket

    (1) 정의

      - 네트워크 소켓통신을 시용한 데이터 공유

    (2) 구조

      - 네트워크 소켓을 이용하여 Client - Server 구조로 데이터 통신

    (3) 사용시기

      - 원격에서 프로세스간 데이터를 공유 할 때 사용

    (4) 유의 사항

      - 네크워크 프로그래밍이 가능해야 한다.

      - 데이터 세그먼트 처리를 잘해야한다.

    (5) 도식화

 

 

  

 

 

728x90
반응형