본문 바로가기
CS 공부/운영체제

IPC(Inter Process Communication)

by 횰쓰 2022. 8. 7.

 

프로세스는 독립적으로 실행된다. 즉, 독립 되어있다는 것은 다른 프로세스에게 영향을 받지 않는다고 말할 수 있다. (스레드는 프로세스 안에서 자원을 공유하므로 영향을 받는다) 때문에, 원칙적으로 다른 프로세스의 주소 공간을 참조할 수 없다. 

하지만, 이런 독립적 구조를 가진 프로세스 간의 통신을 해야 하는 상황이 있을 것이다. 이를 가능하도록 해주는 것이 바로 IPC(Inter Process Communication) 통신이다.

 

프로세스는 커널이 제공하는 IPC 설비를 이용해 프로세스간 통신을 할 수 있게 된다.

 

커널이란?

운영체제의 핵심적인 부분으로, 다른 모든 부분에 여러 기본적인 서비스를 제공해준다.

 


 

IPC 종류

 

공유메모리 방식

 

통신을 이용한 설비가 있지만, 데이터 자체를 공유하도록 지원하는 방식이다. 스레드처럼 메모리를 공유하도록 해준다면 더욱 편할 것이다라는 게 포인트이다.

 

프로세스들이 주소 공간의 일부를 공유한다. 공유한 메모리 영역에 읽기/쓰기를 통해서 통신을 수행한다. 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해준다. 공유 메모리 영역이 구축된 이후에는 모든 접근이 일반적인 메모리 접근으로 취급되기 때문에 더이상 커널의 도움없이도 각 프로세스들이 해당 메모리 영역에 접근할 수 있다. 따라서 초기에 공유 메모리 할당을 제외하면 커널의 관여없이 데이터를 통신할 수 있기 때문에(=중개자없이 곧바로 메모리에 접근할 수 있어서) IPC 속도가 빠르다장점이 있다.

 

 

공유메모리 방식은 프로세스간의 통신을 수월하게 만들지만 동시에 같은 메모리 위치에 접근하게 되면 일관성 문제가 발생할 수 있다. 이에 대해서 커널은 관여하지 않기 때문에 프로세스들끼리 직접 공유 메모리 접근에 대한 동기화 문제를 책임져야 해서 별도의 동기화 과정이 필요하다는 단점이 있다. 예시로는 공유메모리와 메모리 맵(POSIX) 등이 있다. 

 

 

1. 메모리 맵

- 공유 메모리처럼 메모리를 공유해준다. 메모리 맵은 열린 파일을 메모리에 맵핑시켜서 공유하는 방식이다.

(즉 공유 매개체가 파일+메모리)

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

- POSIX에서는 mmap이라는 함수를 통해 메모리 맵 파일 기능을 제공하고 있다.

 

 

 

메시지 전달 방식

 

통상 system call을 사용하여 구현된다. 커널을 통해 send(message)와 recevie(message)라는 두가지 연산을 제공받는다. 예를 들어, 프로세스1이 커널로 message를 보내면 커널이 프로세스2에게 message를 보내주는 방식으로 동작한다. 공유 메모리 방식보다는 속도가 느리다단점이 있지만, 충돌을 회피할 필요가 없기 때문에 적은 양의 데이터를 교환하는 데 유용하고, 구현하기가 쉽고, 커널에서 제어해주기 때문에 안전하며 커널이 동기화를 제공해준다는 장점이 있다. 예시로는 파이프, 소켓, 메시지 큐 등이 있다. 

 

 

 

 

 

 

1. 익명 PIPE

- 파이프는 두 개의 프로세스를 연결하는데 하나의 프로세스는 데이터를 쓰기만 하고, 다른 하나는 데이터를 읽기만 할 수 있다.

- 한쪽 방향으로만 통신이 가능한 반이중 통신이라고도 부른다.

- 따라서 양쪽으로 모두 송/수신을 하고 싶으면 2개의 파이프를 만들어야 한다.

- 매우 간단하게 사용할 수 있는 장점이 있고, 단순한 데이터 흐름을 가질 땐 파이프를 사용하는 것이 효율적이다.

- 단점으로는 전이중 통신을 위해 2개를 만들어야 할 때는 구현이 복잡해지게 된다.

 

 

2. Named PIPE(FIFO)

- 익명 파이프는 통신할 프로세스를 명확히 알 수 있는 경우에 사용하는 것이지만, (부모-자식 프로세스 간 통신처럼) Named 파이프는 전혀 모르는 상태의 프로세스들 사이 통신에 사용한다.

- 즉, 익명 파이프의 확장된 상태로 부모 프로세스와 무관한 다른 프로세스도 통신이 가능한 것이다.

- 하지만, Named 파이프 역시 읽기/쓰기가 동시에 불가능하다. 따라서 전이중 통신을 위해서는 익명 파이프처럼 2개를 만들어야 가능하다. 

 

 

3. 메시지 큐(Message Queue)

- 입출력 방식은 Named 파이프와 동일하다. 

- 다른점은 Message Queue는 파이프처럼 데이터의 흐름이 아니라 메모리 공간이다.

- 사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.

 

 

4. 소켓(Socket)

- 네트워크 소켓 통신을 통해 데이터를 공유한다.

- 클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용한다.

 

 

 

 

※참고

이러한 IPC 통신에서 프로세스 간 데이터를 동기화하고 보호하기 위해 세마포어와 뮤텍스를 사용한다.

(공유된 자원에 한번에 하나의 프로세스만 접근시킬 때)

 

뮤텍스(Mutex)와 세마포어(Semaphore) / 동기화문제와 임계영역

동기화 문제를 해결하기 위해 뮤텍스(mutex), 세마포어(Semaphore) 기법 등을 사용할 수 있다. 뮤텍스와 세마포어를 설명하기 위해 알아야 할 용어는 동기화 문제와 임계영역이다. 동기화 문제란 무

hyolls100.tistory.com

 

댓글