Unix / Linux IPC 비교


78

Unix / Linux는 파이프, 소켓, 공유 메모리, dbus, 메시지 큐 등 많은 IPC를 제공합니다.

각각에 가장 적합한 응용 프로그램은 무엇이며 어떻게 수행합니까?


1
DBUS 다른 IPC 종류의 상단에 구현됩니다 : 유닉스 도메인 소켓, TCP / IP 및 파이프 ... 멀리 할
판사 Maygarden

답변:


100

유닉스 IPC

다음은 빅 7입니다.

  1. 파이프

    부모 / 자식과 관련된 프로세스 사이에서만 유용합니다. 전화 pipe(2)fork(2). 단방향.

  2. FIFO 또는 명명 된 파이프

    무관 한 두 개의 프로세스는 일반 파이프와 달리 FIFO를 사용할 수 있습니다. 에게 전화하십시오 mkfifo(3). 단방향.

  3. 소켓Unix 도메인 소켓

    양방향. 네트워크 통신을 의미하지만 로컬에서도 사용할 수 있습니다. 다른 프로토콜에 사용할 수 있습니다. TCP에는 메시지 경계가 없습니다. 에게 전화하십시오 socket(2).

  4. 메시지 큐

    OS는 개별 메시지를 유지합니다. sys / msg.h를 참조하십시오 .

  5. 신호

    Signal은 정수를 다른 프로세스로 보냅니다. 다중 스레드와 잘 맞지 않습니다. 에게 전화하십시오 kill(2).

  6. 신호기

    욕실을 기다리는 사람들의 대기열과 유사한 다중 프로세스 또는 스레드에 대한 동기화 메커니즘입니다. sys / sem.h를 참조하십시오 .

  7. 공유 메모리

    자신의 동시성 제어를 수행하십시오. 에게 전화하십시오 shmget(2).

메시지 경계 문제

한 방법을 다른 방법보다 선택할 때 결정적인 요소 중 하나는 메시지 경계 문제입니다. "메시지"는 서로 분리되어있을 것으로 예상 할 수 있지만 TCP 또는 파이프와 같은 바이트 스트림에는 해당되지 않습니다.

에코 클라이언트와 서버 쌍을 고려하십시오. 클라이언트는 문자열을 보내고 서버는 문자열을 받아 바로 다시 보냅니다. 클라이언트가 "Hello", "Hello"및 "How about an answer?"를 전송한다고 가정합니다.

바이트 스트림 프로토콜을 사용하면 서버는 "Hell", "oHelloHow"및 "about an answer?"로 수신 할 수 있습니다. 또는 더 현실적으로 "HelloHelloHow에 대한 답변?" 서버는 메시지 경계가 어디에 있는지 전혀 알지 못합니다.

노년 트릭에 메시지 길이를 제한하는 것입니다 CHAR_MAXUINT_MAX하고 먼저 메시지 길이를 보내 동의 charuint. 따라서 수신 측에 있다면 먼저 메시지 길이를 읽어야합니다. 이것은 또한 한 번에 하나의 스레드 만 메시지 읽기를 수행해야 함을 의미합니다.

UDP 또는 메시지 큐와 같은 개별 프로토콜을 사용하면이 문제에 대해 걱정할 필요가 없지만 프로그래밍 방식으로 바이트 스트림은 파일 및 stdin / out처럼 동작하기 때문에 처리하기가 더 쉽습니다.


거기에 세마포어를 포함시킬 수 있다고 생각하지만 프로세스 간 통신 도구보다 동시성 도구로 더 많이 봅니다.
Eugene Yokota

2
btw, 유닉스 도메인 소켓을 통해 파일 설명자를 보낼 수 있습니다 [ linux.die.net/man/7/unix]
Hasturkun

2
하나의 사소한 nit : pipe (2)는 형제 프로세스에서도 사용할 수 있습니다. 예를 들어, 쉘은 파이프 라인의 모든 프로세스의 상위입니다.
Hudson

5
메시지 지향 유닉스 도메인 소켓을 가질 수 있습니다. 인터넷과 달리 신뢰할 수 있습니다.
Tom Anderson

2
이러한 접근 방식에 대한 벤치 마크 또는 정 성적 성능 비교가 있습니까?
kakyo 2013 년

17

공유 메모리는 그 위에 고유 한 통신 체계를 구축하기 때문에 가장 효율적일 수 있지만 많은주의와 동기화가 필요합니다. 공유 메모리를 다른 시스템에 배포 할 수있는 솔루션도 있습니다.

소켓은 요즘 가장 이식성이 좋지만 파이프보다 더 많은 오버 헤드가 필요합니다. 소켓을 로컬로 또는 네트워크를 통해 투명하게 사용하는 기능은 큰 보너스입니다.

메시지 큐 및 신호는 하드 실시간 애플리케이션에 적합 할 수 있지만 유연하지는 않습니다.

이러한 방법은 자연스럽게 프로세스 간의 통신을 위해 만들어졌으며 프로세스 내에서 여러 스레드를 사용하면 특히 신호와 관련하여 상황이 복잡해질 수 있습니다.


내 경험상 명명 된 파이프는 다른 거의 모든 방법보다 빠르고 안전합니다.
Erik Aronesty

10

다음은 간단한 벤치 마크가있는 웹 페이지입니다. https://sites.google.com/site/rikkus/sysv-ipc-vs-unix-pipes-vs-unix-sockets

내가 말할 수있는 한, 각각의 장점은 다음과 같습니다.

  • 파이프 I / O가 가장 빠르지 만 작동하려면 상위 / 하위 관계가 필요합니다.
  • Sysv IPC에는 정의 된 메시지 경계가 있으며 서로 다른 프로세스를 로컬로 연결할 수 있습니다.
  • UNIX 소켓은 서로 다른 프로세스를 로컬로 연결할 수 있으며 대역폭이 더 높지만 고유 한 메시지 경계는 없습니다.
  • TCP / IP 소켓은 네트워크를 통해서도 모든 프로세스를 연결할 수 있지만 오버 헤드가 높고 고유 한 메시지 경계가 없습니다.

이것이 될 수 있습니다. sites.google.com/site/rikkus/...
scythargon

dbus를 다른 것과 어떻게 비교합니까?
BЈовић

DBUS는 이러한 메커니즘 중 하나 또는 여러 가지를 사용합니다. DBUS1 (또는 KDBUS ...)이라는 자체 IPC 메커니즘에 대한 오랜 작업이 있지만 여전히 메인 라인 커널에 병합되지 않았습니다.
Phillip Whelan

8

많은 라이브러리가 한 가지 유형을 다른 유형 위에 구현한다는 점은 주목할 가치가 있습니다.

공유 메모리는 끔찍한 sysv 공유 메모리 함수를 사용할 필요가 없습니다. mmap ()을 사용하는 것이 훨씬 더 우아합니다 (이름을 지정하려면 tmpfs / dev / shm에있는 파일을 mmap, 원하는 경우 mmap / dev / zero). 익명으로 상속하기 위해 실행되지 않은 프로세스를 분기합니다). 그렇긴하지만, 문제를 피하기 위해 동기화가 필요한 프로세스를 남겨 둡니다. 일반적으로 다른 IPC 메커니즘을 사용하여 공유 메모리 영역에 대한 액세스 동기화를 수행합니다.


mmaping / dev / zero에 대해 들어 본 적이 없습니다. 영리한! 자녀와 만 공유 할 수 있다고 언급했지만, 사용중인 파일 설명자를 유닉스 도메인 소켓을 통해 cmsg / SCM_RIGHTS를 사용하여 관련없는 프로세스로 보내고 거기서 공유 매핑으로 끝낼 수 있습니까? 아니면 파일 설명자가 아니라 상속받은 매핑입니까? 작동하더라도 파일 시스템 어딘가에 소켓이 필요하므로 매핑이 익명이더라도이를 설정하는 데 사용 된 소켓은 그렇지 않습니다. 구. IPC는 어렵습니다. 쇼핑하러 가자!
Tom Anderson

mmaping / dev / zero는 실제로 어떤 종류의 메모리 할당에 사용됩니다. 그러나 장점은 MAP_SHARED를 사용하면 fork () 하위 프로세스와 공유된다는 것입니다 (일반적으로 메모리는 논리적으로 복사 됨). 관련없는 프로세스와 공유 할 수 있습니까? 나는 그렇게 생각하지 않는다. mmap () 호출이 파일 설명자가 아니라 공유되어야한다고 생각합니다.
MarkR
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.