IPC(Inter Process Communition) 란?
프로세스들간의 의사소통을 하는 것을 IPC라고 한다. 프로세스가 통신 가능하다는 것을 서로 다른 프로세스가 데이터를 주고 받을 수 있다는 것이며, 동시에 접근 가능한 메모리 즉, 프로세스들이 공유하는 메모리가 필요하다는 뜻이다.
따라서 컴퓨터 내부에서 보다 효울적으로 정보를 주고 받기 위한 통신의 일종이 라고 생각하면 되고, 인터넷 통신을 IPC의 확장으로 이해 할 수 있다. (프로세스 간 통신이 서버-클라이언트 간 통신과 유사하기 때문)
⭐ 스레드간 통신보다 프로세스 간 통신이 어려운 이유
프로세스와 스레드의 차이를 알고 있다면 이해하기 쉽다. 우리는 fork와 같은 함수로 프로세스를 pthread_create와 같은 함수로 쓰레드를 각각 생성해주는데, 이 과정에서 큰 차이가 존재한다.
프로세스는 생성되면서 PC를 포함하여 메모리 공간 등을 복사하여 별도의 자원을 할당하지만, 스레드는 메모리 공간과 자원을 공유하기 때문이다.
따라서 프로세스는 통신할 수 있는 공간이 없기 때문에 통신을 위한 별도의 공간을 만들어주어야 하기 때문에 스레드 간 통신 보다 어렵다고 할 수 있다.
이를 위해서 커널 영역에서 IPC라는 내부 프로세스간 통신(Inter Process Communication)을 제공하게 되고, 프로세스는 커널이 제공하는 IPC 설비를 이용해서 프로세스간 통신을 할 수 있게 된다.
IPC 종류
공유 메모리(Sharead Memory)
- 공유 메모리가 데이터 자체를 공유하도록 지원하는 설비. 프로세스간 메모리 영역을 공유해서 사용 할 수 있도록 허용한다.
- 프로세스가 공유 메모리할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당한다. 이후 어떤 프로세스건 해당 메모리 영역에 접근 할 수 있다.
- 공유 메모리가 각 프로세스에게 첨부(attach)하는 방식으로 작동하게 된다.
- = 각 프로세스가 메모리 영역에 첨부됨
- 프로세그간 Read, Write를 모두 필요로 할때 사용한다.
- 대량의 정보를 다수의 프로세스에게 배포 가능
- 중개자 없이 곧바로 메모리에 접근 할 수 있기 때문에 모든 IPC 중에서 가장 빠르게 작동할 수 있다.
파이프(pipe)
- 통신을 위한 메모리 공간(버퍼)을 생성하여 프로세스가 데이터를 주고 받게 끔한다.
익명 파이프(Anonymous PIPE)
- 일반적인 파이프
- 통신할 프로세스가 명확하게 알 수 있는 경우 사용.
- 부모-자식 or 형제 프로세스 간 통신에 사용
- 외부 프로세스에서 사용할 수 없다
- 파이프는 두개의 프로세스를 연결하고, 하나의 프로세스는 데이터를 쓰기만, 다른 하나는 데이터를 읽기만 할 수 있다. 한 족 방향으로만 통신이 가능한 파이프의 특징 때문에 반이중(Half-Duplex) 통신이라고 한다.
- 송/수신을 모두 하기 원하다면 두개의 파이프를 만들어야 가능
- 간단하게 사용할 수 있다.
- pipe 함수로 생성
네임드 파이프(Named PIPE)
- 전혀 모르는 상태의 프로세스들 사이의 통신에 사용
- 익명 파이프의 확장된 상태로 부모 프로세스와 무관한 다른 프로세스도 통신 가능
- 프로세스 통신을 위해 이름이 있는 파일을 사용하기 때문에 가능
- FIFO 라 불리는 특수 파일을 이용해 서로 관련없는 프로세스간 통신에 사용한다.
- = 외부 프로세스와 통신 가능
- mkfifo or mknod 함수로 생성
- 단점
- 반이중 통신 -> 전이중 통신을 위해서는 익명 파이프 처럼 2개를 만들어야 가능하다.
소켓(Socket)
- Unix 도메인 소켓 또는 IPC 소켓은 동일한 호스트 운영 체제에서 실해되는 프로세스간 데이터를 교환하기 위한 데이터 통신 엔드 포인트이다.
- 네트워크 소켓 통신을 통해 데이터를 공유한다.
- 데이터 교환을 위해 양쪽 PC 에서 각각 임의의 포트를 정하고 해당 포트 간의 대화를 통해 데이터를 주고 받는 방식이다.
- 이 때 각각 PC의 PORT를 담당하는 소켓은 각각 하나의 프로세스이다.
- 즉 해당 프로세스는 임의의 PORT를 맡아 데이터를 송수신 하는 역활을 진행하는 프로세스이 다.
- 각각의 PC에서 프로세스를 통해 타 PC PORT에 연결하는 명령을 보내게 되면 두 프로세스는 서로 확인과정을 거쳐 연결을 진행하고 연결 후 마치 PIPE와 같이 1대1로 데이터를 주고받는 방식이다.
- 클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스간 데이터를 공유할 때 사용한다.
- 전이중(Full Duplex 양방향) 통신이 가능하다.
- 서버/클라이언트 환경을 구촉하는데 용이하다.
- 서버(blind, listen, accept), 클라이언트(connect)
- 중대형 애플리케이션에서 주로 사용
메시지 큐(Message Queue)
- 입출력 방식은 Named 파이프와 동일
- 차이점
- 메시지 큐는 파이프처럼 데이터의 흐름이 아니라 메모리 공간(메모리를 사용한 PEPE)
- PIPE나 FIFO와 달리, 다수의 프로세스간 메시지를 전달 할 수 있음
- 사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
- 메시지의 접근을 위해서는 키(key)가 필요하다.
메모리 맵(Memory Map)
- 공유 메모리처럼 메모리를 공유해준다.
- 메모리 맵은 열린 파일을 메모리에 맵핑시켜서 공유하는 방식이다.(즉 공유 매개체가 파일 + 메모리)
- 주로 파일로 대용량 데이터를 공유해야 할 때 사용한다.
- FILE IO가 느릴 때 사용하면 좋다.
- 대부분 운영 체제에서는 프로세스를 실행할 때 실행 파일의 각 세그먼트를 메모리에 사상하기 위해 메모리 맵 파일을 이용
- 메모리 맵 파일은 파일의 크기를 바꿀 수는 없으며 메모리 맵 파일을 사용하기 이전, 또는 이후에만 파일의 크기를 바꿀 수 있다.
RPC(Remote Procedure Call)
- RPC 방법은 분산 네트워크 망에서 많이 사용되는 방식이다.
- 별도의 원격 제어를 위한 코딩없이 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게하는 프로세스간 통신 기술이다. 다시 말해, 원격 프로시저 호출을 이용하면 프로그래머는 함수가 실행 프로그램에 로컬 위치에 있든 원격 위치에 있뜬 동일한 코드를 이용할 수 있다.
- 해당 방법은 분리된 PC에 저장된 데이터를 마치 내 PC에 존재하는 것처럼 데이터를 가져와 사용하는 통신방법이다.
- 스텀(stub)을 통해서 마치 자신의 디스크에 존재하는 것 처럼 착가을 일으켜 사용하는 방식이다.
- 스텁 : 리눅스에서 공유 라이브러리의 일부분 중 하나
- 프로시저 : 루틴, 서브루틴, 함수와 같은 뜻으로 사용되며 하나의 프로시저는 특정 작업을 수행하기 위한 프로그램의 일부이다. 또는 어떤 행동을 수행하기 위한 일련의 작업 순서를 말한다.
이러한 IPC 통신에서 프로세스간 데이터를 동기화하고 보호하기 위해 세마포어와 뮤텍스를 사용한다. (공유된 자원에 한번에 하나의 프로세스만 접근 시킬때)
세마포어(Semaphore)
- 위의 다른 IPC 설비들이 대부분 프로세스간 메시지 전송을 목적으로 하는 것에 반해, 세마포어는 프로세스간 데이터를 동기화하고 보호하는데 목적을 둔다.
- 공유된 자원에 여러개의 프로세스가 동시에 접근하면 안되며, 한번에 하나의 프로세스만 접근 가능하도록 할 때 사용.
정리
'CS > Computer Science' 카테고리의 다른 글
멀티태스킹, 멀티 스레딩, 멀티 프로세싱 (1) | 2024.12.10 |
---|---|
02/07 함수형 프로그래밍 (0) | 2023.02.07 |
2/2 애자일 방법론 (0) | 2023.02.06 |
01/31 TDD(Test driven development) (0) | 2023.01.31 |
01/18 [OS]프로세스 와 스레드(Process VS Thread) (0) | 2023.01.18 |