2010-02-18 5 views
9

메시지 대기열과 공유 메모리의 차이점에 대해 많은 기사를 읽었습니다. 그러나 어느 것이 좋은 성능을 달성하기에 좋은지 아직 명확하지 않습니다.메시지 큐와 공유 메모리의 차이점은 무엇입니까?

공유 메모리와 마찬가지로 대기열보다 좋지만 동기화 할 때 성능 문제가 있습니다.

+0

중복 http://stackoverflow.com/questions/2275909/whats-the-advantage-of-queues-over-pipes-when-communicating-between-processes/2276157#2276157 – t0mm13b

+0

속는하지 않습니다. 하나는 파이프에 관한 것이고, 하나는 shm에 관한 것입니다. – kennytm

답변

1

메시지 큐는 고유의 동기화 오버 헤드를 가지므로 성능 저하로 인한 안전성을 보장합니다. 공유 메모리에는 안전 장치가 없습니다. 두 스레드가 동시에 액세스하는 경우 스레드 안전을 보장하지 않는 한 충돌 할 수 있습니다 (일관성없는 데이터 쓰기). 사소한 오류가 허용되는 경우 (예 : 데이터가 아날로그 출력으로 이동하고 일부 잡음은 수용 가능), 오류 검사를 건너 뛰고 상당히 높은 성능으로 "충분히 좋은"방법을 사용할 수있는 경우 중요하지 않습니다. 또한 공유 메모리는 많은 양의 데이터를 교환하고 메모리 저장을 절약하는 여러 앱에 공통적 인 공통적 인 데이터 저장 장치를 허용합니다. 메시지 대기열은 처리량이 적습니다. 예를 들어 공유 메모리에 대한 액세스를 보호하는 데 사용할 수 있습니다.

29

프로세스간에 정보를 교환하는 데 공유 메모리 및 메시지 큐를 사용할 수 있습니다. 차이점은 입니다. 어떻게 사용합니까입니다.

공유 메모리은 정확히 생각할 수 있습니다. 이것은 하나 이상의 프로세스에서 읽고 쓸 수있는 저장 영역입니다. 고유 한 동기화를 제공하지 않습니다. 즉, 한 프로세스가 다른 프로세스의 데이터를 손상시키지 않도록하는 것은 프로그래머의 몫입니다. 그러나 처리량면에서 효율적입니다. 읽기 및 쓰기는 비교적 빠른 작업입니다.

메시지 큐은 단방향 파이프입니다. 하나의 프로세스가 큐에 쓰고 다른 프로세스는 데이터 끝 조건이 발생할 때까지 쓰여진 순서대로 데이터를 읽습니다. 대기열이 만들어지면 메시지 크기 (일반적으로 매우 작은 메시지 당 바이트) 및 대기열 길이 (대기중인 최대 메시지 수)가 설정됩니다. 각 읽기/쓰기 작업은 일반적으로 단일 메시지이므로 액세스는 공유 메모리보다 느립니다. 그러나 큐는 각 작업이 전체 메시지를 성공적으로 처리하거나 큐를 변경하지 않고 실패 할 것을 보장합니다. 따라서 작가는 부분적인 메시지 만 작성한 후에 결코 실패 할 수 없으며 독자는 완전한 메시지를 검색하거나 아무 것도 검색하지 않습니다.

+0

예, 좋은 지적입니다. 고맙습니다. – khushi

+0

+1. 나는이 텍스트가 매우 유익하다는 것을 알았다. – gotqn

2

하나의 프로세스가 그것에 쓰고 다른 프로세스가 읽는 경합 조건을 고려하여 공유 메모리를 사용할 때 염두에 두어야 할 것이 있습니다. 전자를 사용하는 데 따르는 위험이 있습니다. 두 프로세스가 사용하고 있다고 가정합니다. 하나는 쓰기 작업이고 다른 하나는 읽기 작업이고 다른 하나는 비정상적인 상태로 인해 쓰고있는 프로세스가 멈추거나 충돌 할 수 있습니다.

공유 메모리는 더 빠르며 (낮은 오버 헤드, 높은 데이터 전달량) 대기열로 간주 될 수 있습니다. 그러나 다른 한편으로는 대기열은 적은 양의 데이터로 높은 오버 헤드 (대기열을 영구적으로 유지하기위한 설정)를 필요로합니다.

공유 메모리가있는 onus는 스레드 안전을 위해 동기화를 구현해야한다는 것입니다. IPC에있는 Beej의 우수 기사를 살펴보십시오.

큐를 사용하는 경우 스레드 안전성이 뛰어나며 결과에 관계없이 메시지가 대기열에 보관되므로 두 프로세스가 큐를 사용하고 있다고 가정합니다. 메시지)에서 읽으려는 다른 프로세스가 그 상황에서 충돌 또는 비정상적인 조건으로 인해 죽거나 죽을 때 해당 메시지가 그대로 유지되고 다른 프로세스가 다시 시작되면 대기열에서 읽을 수 있습니다. 데이터가 손실되지 않습니다.

두 가지의 차이점은 다음과 같습니다.

호프가 도움이 되었으면 안녕하세요, 탐.

+0

그 (beej) 기사 주셔서 감사합니다. 정말 제멋대로. – khushi

0

Message Queue 및 공유 메모리는 두 프로세스간에 데이터를 공유하는 데 사용됩니다. 메시지 큐를 사용하려면 데이터를 특정 형식으로 공유해야합니다. 두 프로세스 모두 이것에 동의하고 메시지를 공유해야합니다. 커널은 전체 메시지를 읽거나 메시지 대기열에 대해 아무 것도 읽지 못하게합니다. 공유 메모리는 세그먼트의 일부가 2 개의 프로세스간에 공유되어야한다는 것을 요구합니다. 둘 다 일부 동기화 기술을 수행하고 프로세스간에 데이터를 공유 할 수 있습니다. 공유 할 데이터를 다른 프로세스에 복사 할 필요가 없으므로 공유 메모리가 더 빠릅니다.

관련 문제