본문 바로가기
프로그래밍/리눅스

리눅스(Linux) IPC의 종류에 대해서 알아보자

by bantomak 2025. 2. 4.
반응형

IPC(Inter-Process Communication)

어떤 프로그램은 다른 프로그램과 상관없이 독립적으로 작동하고, 어떤 프로그램은 다른 프로그램과 상호작용하며 작동한다. 또 어떤 프로그램은 하나 이상의 프로세스를 실행하기도 한다. 여러 프로그램이 문제없이 작동하려면 프로세스 간 데이터 교환이나 이벤트 발생을 알릴 수단이 필요하다. 이렇게 프로세스 간 통신에 사용하는 도구를 IPC(Inter-Process Communication)라고 한다. 리눅스에서 제공하는 IPC의 종류와 특징에 대해서 알아보자.

파이프(Pipe)

파이프(pipe)는 두 프로세스 간 데이터를 전송할 떄 사용하는 IPC다. 파이프는 데이터를 단방향으로만 전송할 수 있다. 한 프로세스가 데이터를 파이프에 쓰면 다른 파이프가 파이프에서 데이터를 읽어갈 수 있다.

 

전통적인 파이프는 파이프를 지정하는 이름이 없다. 부모-자식 간 프로세스 통신에는 유용하지만, 그 외 관계에서는 사용하기 어렵다. 그래서 파이프에 파일 형식의 이름을 부여할 수 있는 명명된 파이프(named pipe)가 나왔다. 명명된 파이프는 부모-자식 관계가 아닌 프로세스에서도 널리 사용할 수 있다.

메시지 큐(Message Queue)

메시지 큐(message queue)는 정해진 큐에 메시지를 넣고 빼는 방식으로 데이터를 교환한다. 큐는 먼저 들어간 데이터가 먼저 나오는 선입선출(FIFO, First In First Out) 방식으로 작동하는 자료구조이다. 메시지 큐는 메시지 단위로 데이터를 전송할 수 있고, 작은 메시지를 교환할 때 성능이 좋다. 특정 프로세스가 메시지 큐를 점유하는 형태가 아니어서 여러 프로세스가 하나의 메시지 큐를 이용해 데이터를 교환할 수도 있다.

소켓(Socket)

소켓(socket)은 네트워크로 연결된 다른 시스템에서 작동하는 프로세스와 통신할 떄 사용한다. 보통 웹 브라우저로 어떤 사이트에 접속하면 웹 브라우저와 웹사이트의 서버는 소켓으로 통신한다. 소켓을 이용한 통신은 원격 프로세스뿐만 아니라 운영체제 내 다른 프로세스와도 통신할 수 있다.

 

소켓은 TCP(Transmission Control Protocol, 통신 제어 프로토콜)를 기반으로 하는 연결형 통신UDP(User Datagram Protocol, 사용자 데이터그램 프로토콜)를 기반으로 하는 데이터그램 통신이 모두 가능하다. 또한 양방향 통신이 가능하고, 데이터를 쓰는 시점과 읽는 시점에 다르게 동작할 수 있다.

 

네트워크 통신을 위한 인터넷 소켓(Internet socket)은 네트워크에서 인식할 수 있는 ID가 부여된다. TCP/IP 네트워크에서는 IP 주소와 포트 번호가 ID 역할을 한다.

공유 메모리(Shared Memory)

파이프, 메세지 큐, 소켓은 데이터를 교환하는 데 사용하는 IPC이다. 이들은 작동 방식에 차이가 있지만, 데이터를 써넣으면 차례로 데이터를 읽어가는 구조는 동일하다.

 

공유 메모리(shared memory)는 이들과 작동 방식이 전혀 다르다. 데이터를 보내고 받는 개념이 아니라 데이터 자체를 공유하는 개념이다. 일정 영역의 메모리를 복수 프로세스가 공유한다. 공유 메모리는 데이터를 읽거나 쓸 때 다른 프로세스에 알리지 않고, 프로세스 간 순서를 보장하지도 않는다. 그래서 공유 메모리를 사용할 때는 반드시 동기화(synchronazation)를 고려해야 한다. 그래야 공유 메모리의 데이터가 뒤죽박죽 섞이지 않게 관리할 수 있다.

세마포어(Semaphore)

세마포어(semaphore)는 원래 깃발을 이용한 신호 체계인데, 컴퓨터 시스템에서는 임계 영역(critical section)을 보호하기 위한 수단으로 사용된다. 세마포어는 공유 메모리에서 프로세스의 동시 접근을 제한하거나 프로세스의 순서를 조절할 때 사용한다. 세마포어는 단순히 정수 값만 저장하고 있다. 프로세스는 이 정수 값으로 자원에 접근 권한이 있는지를 판단하게 된다.

 

어떤 자원이 있는데, 해당 자원을 n개 프로세스만 사용할 수 있게 할 때는 카운팅 세마포어(counting semaphore)를 사용한다. 카운팅 세마포어는 세마포어의 초기 설정 값을 n으로 설정한다. 한 프로세스가 자원 사용을 요청하면 세마포어의 값을 1만큼 감소시킨다. 자원 사용이 끝나면 세마포어의 값을 1만큼 증가시킨다. 세마포어의 값이 0인 상태에서 자원을 요청하는 프로세스는 다른 프로세스가 자원 사용을 멈출 때까지 기다려야 한다.

 

자원을 독점적으로 사용할 수 있도록 세마포어의 초기 설정 값을 1로 설정하는 세마포어를 바이너리 세마포어(binary semaphore) 또는 뮤텍스(mutex, mutual exclusion)라고 한다. 바이너리 세마포어는 한 번에 한 프로세스만 자원을 사용하므로 자원을 독점할 수 있다.

함께 읽으면 좋은 글

 

IPC(Interprocess Communication)

프로세스들이 서로에 대해 완전히 독립된 환경을 갖는다는 것은 운영체제를 공부해 보았다면 자명하다. 하지만 경우에 따라 프로세스 간 통신을 허용하고 싶을 수 있다. 예를 들어 로컬에서 구

one-armed-boy.tistory.com

 

[리눅스 프로그래밍] - (IPC) SYSV Message Queue 다루기

메세지 기반 커뮤니케이션으로 pipe 나 Named pipe와는 달리 하나의 메세지를 기준으로 전송한다.IPC Key를 기반으로 데이터를 전송한다.POSIX와는 달리 mtype을 사용하여 메세지 큐에 있는 데이터를 구

velog.io

댓글