프로세스 간 통신을위한 더 많은 두 가지 옵션 중 하나는 다음과 같습니다.
- 공유 메모리
- 소켓
실제로 나는이 두 가지 옵션이 Intellij Idea에 의해 자바 애플 리케이션 디버깅에 노출되는 것을 보았다. 각 접근법의 장단점이 무엇인지 알고 싶습니다.
프로세스 간 통신을위한 더 많은 두 가지 옵션 중 하나는 다음과 같습니다.
실제로 나는이 두 가지 옵션이 Intellij Idea에 의해 자바 애플 리케이션 디버깅에 노출되는 것을 보았다. 각 접근법의 장단점이 무엇인지 알고 싶습니다.
답변:
내 머리 꼭대기에서 각각에 대한 몇 가지 장점. 이러한 항목 중 일부는 모든 경우에 적용되지 않을 수 있습니다. 이것들은 일반적인 관찰입니다.
소켓
간단하고 통제 된. 거의 또는 전혀 수정하지 않고 필요에 따라 네트워크 소켓으로 확장 할 수 있습니다. 프로그래밍 모델은 직렬화가 필요하며, 결과적으로 A에서 B로 실제로 전송되는 데이터를 고려해야합니다. 동기화는 통신 메커니즘에 내장되어 있어야합니다. 다른 동기화가 필요하지 않습니다.
공유 메모리
syscall이 반드시 필요한 것은 아닙니다 (따라서 잠재적으로 더 빠름). 공유는 명시 적으로 데이터를 전송할 필요가 없습니다. 수신자가 검색하지 않은 데이터를 사용할 수 있습니다 (수신자가 사용하지 않는 데이터를 전송하는 데 대역폭을 낭비하지 않아도 됨). 직렬화 / 직렬화 단계가 없다는 것은 통신 오버 헤드에 소요되는 시간이 없음을 의미합니다.
소켓은 일대일입니다. 동일한 프로세스를 여러 프로세스에 보내려면 여러 개의 소켓이 필요합니다. 공유 메모리를 사용하면 여러 판독기 및 여러 작성기를 가질 수 있습니다.
소켓은 리소스를 많이 사용합니다. 각각의 모든 메시지는 OS를 통해 전달됩니다. 공유 메모리를 사용하면 공유 메모리를 응용 프로그램의 메모리에 한 번 매핑 한 다음 사용할 수 있습니다. 그러나 공유 메모리를 사용할 때는 여전히 OS를 거쳐야합니다. 아래를 참조하십시오.
소켓은 동기화됩니다 (UDP를 사용하지 않는 한). 공유 메모리를 사용하면 다른 프로세스에 공유 메모리를 읽거나 쓰는 것이 괜찮거나 괜찮다는 것을 알리는 추가 메커니즘이 거의 필요합니다. 이렇게하지 않으면 손상된 메모리에 문제가 생길 수 있습니다. 예 : 프로세스 A가 청크 공유 메모리를 읽기 시작하지만 읽기 도중에 스왑 아웃된다고 가정하십시오. 프로세스 B는 동일한 공유 메모리 청크에 씁니다. 프로세스 A가 다시 시작되고 공유 메모리를 계속 읽을 때 읽은 것은 이전 및 새 데이터의 혼동입니다. 이를 방지하기 위해 공유 메모리를 사용할 때 여전히 OS를 사용합니다.
소켓 기반 응용 프로그램 집합을 네트워크 소켓을 사용하는 응용 프로그램으로 쉽게 변환 할 수 있습니다. 실험실의 모든 기계 또는 더 멀리 떨어진 곳으로 처리를 분산시킬 수 있습니다. 공유 메모리로는이 작업을 수행 할 수 없습니다. 공유 메모리 기반 솔루션으로 하나의 시스템에 고정되어 있습니다.
소켓은 적은 양의 데이터, 많은 양의 데이터를위한 공유 메모리를위한 것입니다. 다른 문제를 해결하기 위해 다른 메커니즘이 존재합니다.