mir.pe (일반/밝은 화면)
최근 수정 시각 : 2023-11-23 12:02:09

프로세스간 통신

1. 설명2. 종류
2.1. 메일슬롯2.2. 파이프2.3. 소켓2.4. 시그널2.5. 공유메모리

1. 설명

Inter-Process Communication, IPC

운영체제 상에서 실행 중인 프로세스 간에 정보를 주고받는 것을 프로세스간 통신이라고 한다. 프로세스는 자신에게 할당된 메모리 내의 정보만 접근할 수 있고, 이를 벗어나서 접근할 경우, C언어를 배우는 사람이라면 누구나 한 번쯤은 봤을 Segmentation Fault 등의 오류가 발생하게 된다. 이는 안전성을 위해 운영체제에서 자기 프로세스의 메모리만 접근하도록 강제하고 있다는 것이다.

따라서 한 프로그램에서 병렬성을 키우면서 공유되는 데이터를 사용하기 위해 메모리 공간을 공유하는 스레드를 이용하는 경우가 많다 (물론 스레드를 쓰는 이유는 이것 말고도 매우 다양하다). 하지만 이것은 하나의 프로그램에서만 의미가 있는 것이고, 서로 다른 프로그램(즉, 서로 다른 프로세스)의 데이터를 공유하려면 결국 다른 프로세스의 메모리를 접근할 필요가 발생한다. 따라서 이 때는 IPC라는 것을 사용하게 된다.

다른 것도 있다. 바로 LPC(Local Inter-Process Communication, 로컬 컴퓨터 프로세스간 통신)라는 게 있는데 프로세스가 다른 프로세스와 정보를 주고 받을 때 빠른 속도로 데이터를 교환하기 위해 사용한다. 다만 이건 커널에서만 쓸 수 있으며 일반 프로그램은 LPC를 사용할 수 없다.

2. 종류

2.1. 메일슬롯

메일슬롯은 단방향 메시지 전송이 가능한 메모리 상의 가상파일이다. 크기 제한이 424바이트로 꽤 작지만, 쉽게 만들 수 있고, 디스크 파일과는 다르게 휘발성이라는 점, 그리고 브로드캐스팅이 가능하다는 것이 장점이다.

2.2. 파이프

파일:상세 내용 아이콘.svg   자세한 내용은 파이프(UNIX) 문서
번 문단을
부분을
참고하십시오.

2.3. 소켓

소켓(Socket)은 일반적으로 두 네트워크 프로그램 사이에서 데이터의 입출력의 관문, 또는 그를 위한 운영체제의 API의 이름으로써 많이 쓰인다. 이 소켓을 통해 TCP 연결이 수립되면 스트림 소켓(Stream socket), UDP를 사용하면 데이터그램 소켓(Datagram socket)이라고 불린다. 하지만 꼭 다른 네트워크로 가지 않고 소켓을 생성한 두 프로세스가 같은 컴퓨터 내의 같은 운영체제 상에서 실행되고 있다면 프로세스 간 통신이 가능하게 된다. 이에 더해, 아예 하나의 컴퓨터 상에서 IPC를 위해 유닉스 도메인 소켓(Unix Domain Socket)이란 것도 존재한다. 이것도 앞선 네트워크 소켓과 마찬가지로 같은 소켓 API로 사용 가능하다.

연결하기 위해서는 접근 권한이 필요한 파이프[1]와 달리 소켓은 포트만 알면 접근 권한 없이 연결할 수 있다. 물론 허용된 프로세스만 연결하도록 하겠다면 서버에 별도의 인증 절차를 추가시켜줘야 한다.

2.4. 시그널

시그널(Signal)은 유닉스 시스템에서 쓰이는 IPC 구현 중 하나이다. 소켓은 소켓을 생성해서 그것을 접근하기 위해 별도의 식별자(파일 디스크립터, file descriptor라고 한다)가 필요하지만, 시그널은 그러한 것들이 필요하지 않고, 바로 다른 프로세스로 정보를 보낼 수 있다 (관리자, 혹은 root 권한이 필요할 수는 있다). 하지만 소켓처럼 임의의 데이터를 보낼 수는 없고, 이름 그대로 일종의 신호만을 보낼 수 있다. 앞서 개요에서 말한 Segmentation Fault의 예가 바로 시그널과 관련이 있다. 이는 프로세스가 할당받지 않은 영역의 메모리를 접근할 때 발생한다고 했는데, 구체적으로 그러한 메모리 영역을 접근하면 운영체제 커널이 그것을 감지하고 프로세스에게 이를 알리는 시그널을 보낸다 (SIGSEGV라는 것을 보낸다). 그러면 프로세스가 이를 받고 강제로 자신을 종료시켜 버린다. 따라서 Segmentation Fault 시에는 프로세스가 죽어버리는 것이다. 이러한 시그널의 기본 동작을 바꿀 수도 있는데, 이것을 "시그널을 잡는다(catch)"라고 한다.

2.5. 공유메모리

말 그대로 메모리의 일정 영역을 공유하는 것이다. 일정 메모리 영역을 공유 가능하게 바꿔 주는 방식이랑, 하나의 파일을 열고 이를 메모리에 매핑하여(memory-mapped file), 이 영역을 공유 가능하게 하는 방식이 있다.


[1] root 권한으로 실행한 프로세스가 생성한 파이프인 경우 따로 조치를 취하지 않는다면 일반 사용자 권한으로 실행되는 프로세스는 해당 파이프에 연결할 수 없다.

분류