안녕하세요~~! 이번 포스팅은 IPC 통신입니다!

 

IPC 통신에 대해 배우기 전에 IPC란 바로! 프로세스의 통신 방법인 만큼 먼저 프로세스의 동작 방식에 대해서 간단히 설명드리겠습니다.

운영체제에서 프로그램은 여러 프로세스 단위(실제는 쓰레드단위)로 데이터가 처리가 진행됩니다. 이 때 각각의 프로세스는 서로 다른 독립적인 메모리 공간을 가지고 있습니다. 하지만 하나의 프로세스가 작업을 처리할 때 다른 프로세스의 자원이 필요한 경우가 있는데 독립적으로 분리된 메모리는 해당 프로세스가 다른 프로세스의 자원에 접근하는 것을 불가능하게 만듭니다.

 

예를들어 A 프로세스가 B 프로세스의 메모리에 존재하는 자원이 필요하지만 메모리 공간이 분리되어 각각 독립적이기 때문에 B 프로세스의 메모리 공간에 직접적으로 접근이 불가능 한 것! 입니다.

그럼 '메모리를 접근 가능하도록 OS 설정을 만들면 되지 않을까?'

라는 생각이 드실 수 있으실 겁니다.

 

하지만 이는 좋지 않은 생각입니다. 왜냐하면 만약 위와 같이 다른 프로세스 메모리 공간에 직접적인 접근을 제한하지 않는다면 해커가 만든 악성 프로세스가 존재할 때 해당 프로세스는 PC 내의 다른 프로세스 메모리에 접근이 가능할 것이고 이는 곧 PC의 보안적인 측면에서 치명적인 문제를 발생시킬 수 있을 것입니다.

때문에 기본적으로 프로세스간 타 프로세스 메모리에 직접 접근하는 행위는 제한되는 것이 올바른 방법이라고 할 수 있습니다. 그럼 다시 본론으로 들어와서 필요한 자원을 사용하지 못하는 문제점은 어떻게 극복이 가능한지에 대해서 설명하겠습니다.

 

이미 눈치채신 분들도 계시겠지만 바로 이 때 사용하는 방법이 IPC 입니다.

일종의 프로세스 간 대화하는 프로토콜이라고 생각하시면 됩니다. 그리고 프로세스 간의 통신 방법은 1개가 아닌 여러 개가 존재합니다.

 

1. PIPE 방식

가장 먼저 PIPE 방식입니다. 가장 기본적인 기존의 PIPE 방식은 부모 프로세스와 자식 프로세스간의 통신 방법입니다. 하지만 최근에는 부모와 자식관계없이 사용되는 PIPE 방식도 존재합니다. PIPE 방식은 말그대로 통신하는 두 프로세스 사이에 가상의 PIPE를 만드는 것입니다.

PIPE 방식은 위와 같이 두 프로세스 사이에 송신 PIPE와 수신 PIPE를 각가 만들어 데이터를 전송하는 방법입니다 이 때 주의할 부분은 송신과 수신이 동시에 이루어지지 않는 반이중 특징을 가지고 있는 것과 상대적으로 파이프를 만들어 직접적으로 1대1 통신이 이루어지기 때문에 신뢰 측면에서 있어서는 좋은 성능을 보이는 방식입니다.

 

2. Message

메시지 방식은 우편함과 같은 방식입니다. 통신하는 프로세스는 메시지 함을 만들어 해당 메시지 함으로 데이터를 전송하거나 메시지함을 확인해서 메시지를 수신하는 방법입니다.

메시지 큐 방식은 위와 같이 메시지를 구분하기 위해 메시지에 태그(번호)를 달아 메시지를 구분 합니다. 위 그림의 동작을 보면 프로세스 A에서는 송신 함수를 통해 메시지 #3을 메시지 큐로 송신하는 과정이고 프로세스 B는 recv(수신 함수)를 통해서 메시지 #2를 프로세스 B의 메모리 공간으로 가져오는 작업입니다.

 

3. Shared Memory

Shared Memory는 말 그대로 메모리 공간을 공유하는 방법입니다.

즉 기존의 서로 다른 프로세스 메모리 공간에 접근 불가능하다는 제약을 없앤 것입니다. 이 경우 메시지 큐를 거치거나 pipe 생성 등의 과정이 필요하지 않아 다른 방법보다 빠르게 필요한 리소스를 가져올 수 있는 장점이 존재합니다. 하지만 위에서 언급한 바와 같이 보안적인 측면에 있어 취약한 위험성을 가지고 있습니다.

 

4. Memory MAP

해당 방법의 경우 오픈된 파일에 한해서 메모리를 공유하는 방법입니다.

이 부분을 이해하기 위해서는 우선 File open과정의 이해가 필요합니다!

-> FILE OPEN

파일이 오픈되면 해당 파일의 데이터가 메모리에 올라가게 됩니다. 그리고 해당 메모리에 접근을 통해 데이터를 읽고 쓸 수 있습니다. 여기서 만약 파일이 이미 오픈되어 있는 상황인데 같은 파일을 또 다시 열게 된다면 어떻게 될까요?

그렇습니다. 이 경우 같은 파일을 또 메모리에 올린다면 이는 극심한 메모리 낭비가 일어나며 또 데이터 일관성 부분에서도 큰 문제가 발생될 수 있습니다. 그래서 이런 경우 기존의 메모리 공간에 같이 접근해서 데이터를 읽고 쓰는 작업을 진행하는데 이러한 방법을 Memory MAP이라고 할 수 있습니다. (참고로 Windows의 경우 파일이 열린 경우 파일을 open하고 count를 증가시켜 file과 연결된 프로세스의 개수를 체크합니다. 즉 이미 열린 파일을 새로운 프로세스가 또 open한다면 같은 메모리 공간을 공유하며 count를 1증가시켜 2로 만들어 줍니다. 여기서 프로세스가 파일을 close 하면 count를 1씩줄여나가며 count가 0이되면 해당 메모리 공간을 부담 없이 다른 데이터로 대체할 수 있습니다.)

 

5. Socket

소켓을 만들어 통신하는 방법입니다. 소켓 통신은 흔히 네트워크 통신 기법으로 많이 사용되며 데이터 교환을 위해 양쪽 PC에서 각각 임의의 포트를 정하고 해당 포트 간의 대화를 통해 데이터를 주고받는 방식입니다. 이 때 각각 PC의 PORT를 담당하는 소켓은 각각 하나의 프로세스라고 생각하시면 됩니다. 즉 해당 프로세스는 임의의 PORT를 맡아 데이터를 송수신 하는 역할을 진행하는 프로세스인 것 입니다.

위과 같이 각각의 PC에서 프로세스를 통해 타 PC PORT에 연결하라는 명령을 보내게 되면 두 프로세스는 서로 확인과정을 거쳐 연결을 진행하고 연결 후 마치 PIPE와 같이 1대1로 데이터를 주고받는 방식입니다.

 

6. RPC
RPC 방법은 분산 네트워크 망에서 많이 사용되는 방식입니다. 해당 방법은 분리된 PC에 저장된 데이터를 마치 내 PC에 존재하는 것처럼 데이터를 가져와 사용하는 통신방법입니다. 해당 방법은 stub을 통해서 마치 자신의 디스크에 존재하는 것 처럼 착각을 일으켜 사용하는 방식입니다.

+ Recent posts