내부 프로세스 간의 통신 방법
IPC(Inter Process Communication), 운영체제에서의 프로세스 간의 통신에 대해 알아봅니다.
IPC란? (Inter Process Communication)
IPC는 영어 그대로 해석해도 뜻에 대해 쉽게 이해할 수 있습니다
내부 프로세스간 통신을 하는 것
내부 프로세스 간의 통신을 하는 것이라는 뜻인데, 프로세스 간의 통신이 가능하다는 것은 프로세스들이 공유하는 메모리가 필요하다는 뜻입니다.
즉, 컴퓨터 내부에서 보다 더 효율적으로 정보를 주고받기 위한 통신의 일종이며, 이를 위해 PIPE라는 개념이 등장하게 되었습니다.
IPC의 종류와 특징
PIPE
프로세스는 메모리 공간을 사용하기 때문에, 통신을 하기 위해서 메모리 공간을 할당해주어야 합니다.
그래서 등장한 기술이 PIPE이며, 통신을 위한 메모리 공간을 생성하여 프로세스 간 데이터를 주고받을 수 있게 해줍니다.
PIPE를 이용하면 외부 프로세스와의 통신에도 사용이 가능하지만 단방향의 통신이라는 단점이 존재합니다. (하나의 파이프를 사용하면 데이터의 중복 등의 문제가 발생할 수 있기 때문)
익명파이프 (Anonymous Pipe)
일반적인 PIPE 함수로 생성시킨 파이프는 이름이 없는 익명파이프입니다.
외부 프로세스에서 이 파이프를 사용할 수 없어 익명파이프라고 하는 것입니다. 이름이 없기 때문에 외부 프로세스에서는 이 파이프를 사용할 수 없지만, 부모 프로세스가 자식 프로세스를 생성하는 경우에 파일 지정 번호를 상속받아 익명파이프로 통신할 수 있습니다.
네임드파이프 (Named Pipe)
익명파이프와 반대로 이해하면 되는 네임드파이프입니다. 외부 프로세스와 통신을 하기 위해 익명파이프에 이름을 붙히자는 생각으로 등장했습니다. 각 파이프에 이름과 권한을 부여하여 생성해줍니다.
네임드파이프는 읽기와 쓰기가 모두 가능하지만 한 번에 한 방향으로만 통신이 가능하기 때문에 전이중통신을 위해서는 읽기, 쓰기 파이프 각각 총 2개를 생성해줘야 합니다.
즉, 다수의 프로세스를 처리하기에는 비효율적입니다.
공유 메모리 (Shared Memory)
데이터를 공유하는 방법에는 두 가지가 있습니다. 하나는 통신으로 데이터를 주고 받는 것이고 다른 하나는 아예 데이터를 공유해서 함께 사용하는 것입니다.
프로세스는 자신만의 메모리 영역을 가지고 있습니다. 이 메모리는 커널에 의해서 보호되는데, 만약 데이터를 다른 프로세스에서 사용할 경우 PIPE를 등을 이용해서 데이터를 전달하는 방식도 있겠지만 Thread 처럼 메모리 영역을 공유한다면 더 편하게 데이터를 함께 사용할 수 있을 것입니다.
Shared Memory(공유 메모리)는 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용합니다. 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해줍니다. 이후 어떤 프로세스건 해당 메모리영역에 접근할 수 있습니다.
공유메모리는 중개자가 없이 곧바로 메모리에 접근할 수 있기 때문에 다른 모든 IPC들 중에서 가장 빠르게 작동할 수 있습니다.
소켓 (Socket)
Socket은 프로세스와 시스템의 기초적인 부분이며, 프로세스 들 사이의 통신을 가능하게 합니다.
서버 단에서는 bind, listen, accept를 해주어 소켓 연결을 위한 준비를 해주어야 하고 , 클라이언트 단에서는 connect를 통해 서버에 요청하며, 연결이 수립 된 이후에는 Socket을 send함으로써 데이터를 주고 받게 됩니다. 연결이 끝난 후에는 반드시 Socket 을 close()해주어야 합니다
소켓은 서버/클라이언트 환경을 구축하는데 용이하며 중대형 애플리케이션에서 주로 사용합니다.
Leave a comment