[운영체제] 프로세스간 통신(IPC)

Letmegooutside·2022년 1월 13일
0

운영체제

목록 보기
9/16

IPC (Inter Process Communication)

독립적인 구조를 가진 프로세스 간의 통신을 가능하게 해주는 것

프로세스는 독립적으로 실행되어 다른 프로세스에게 영향을 받지 않기 때문에 별도의 설비 없이 통신을 할 수 없다.
따라서 프로세스는 커널이 제공하는 IPC 설비를 이용해 프로세스 간 통신을 할 수 있게 된다.

파이프 (PIPE)

여러 개의 프로세스가 공통으로 사용하는 임시공간

파이프는 파일 시스템에 생성되는 임시파일이다.
하나의 프로세스가 파이프에 쓰게 되면 다른 프로세스는 그 파이프에서 읽는 방식으로 통신이 이루어진다.

특징

  • 파이프는 단방향 통신을 지원한다.
    쌍방향 통신을 위해서는 읽기 전용 파이프와 쓰기 전용 파이프 두 개의 파이프를 생성해서 통신을 해야 한다.

  • 파이프는 fork() 함수에 의해 복사되지 않는다.
    fork() 함수에 의해서 프로세스가 생성되면, 자식 프로세스는 부모가 사용하던 변수를 복사하게 된다.
    하지만 파이프의 경우 복사되는 것이 아니라 파일 디스크립터를 공유하게 되면서 자식 프로세스와 부모 프로세스가 같은 파이프를 가리키게 된다.

익명 파이프

통신할 프로세스를 명확히 알 수 있는 경우에 사용한다. (부모-자식 프로세스 간 통신처럼)
파이프에 접근 가능한 방법은 파일 디스크립터를 공유하는 방법만 존재하는데, 익명 파이프는 부모와 자식 프로세스만이 파일 디스크립터를 공유하므로 다른 프로세스끼리는 익명 파이프를 사용한 통신이 불가능 하다.

명명된 파이프 (Named PIPE)

서로 무관한 프로세스들 사이의 통신에 사용한다.
지정한 이름으로 파일 디스크립터를 열 수 있기 때문에 부모 자식 프로세스가 아닌 서로 무관한 프로세스 사이에서도 사용하여 통신을 할 수 있다.

메세지 큐 (Message Queue)

입출력 방식으로는 익명 파이프와 동일하지만 커널에서 관리하며 메모리를 사용한 파이프이다. 구조체를 기반으로 통신한다.

파이프와 차이점은 메시지 큐는 파이프처럼 데이터의 흐름이 아니라 메모리 공간이다.
큐에서 사용할 데이터에 번호를 붙여 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.

공유메모리 (Shared Memory)

공유 메모리가 데이터 자체를 공유하도록 지원하는 설비

프로세스의 메모리 영역을 스레드에서 처럼 공유하여 데이터를 함께 사용할 수 있도록 하는 방식이다.
프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해주고, 이후 어떤 프로세스든 해당 메모리 영역에 접근할 수 있다.
중개자 없이 곧바로 메모리에 접근할 수 있기 때문에 IPC 중에서 가장 빠르게 작동한다.

메모리 맵 (Memory Map)

열린 파일을 메모리에 매핑시켜서 공유하는 방식이다.

공유 메모리와 마찬가지로 메모리를 공유한다는 측면에서는 비슷하다.
하지만 메모리 맵에서는 열린 파일을 메모리에 매핑시켜서 공유한다. 즉 공유 매개체는 파일과 메모리가 된다.
주로 파일로 대용량 데이터를 공유해야 할 때 사용한다.

소켓 (Socket)

서버와 클라이언트가 특정 포트를 통해 실시간으로 양방향 통신을 하는 방식

범용적인 IPC로써 양방향 통신이 가능하며 패킷 단위로 주고 받음으로서 직관적으로 이해하기 쉬운 코드를 만들 수 있다.

소켓통신의 흐름

클라이언트 프로그램과 서버 프로그램은 각각 자신의 포트를 통해 통신해야 한다. 연결을 할 때도 포트를 사용하고 데이터를 교환할 때도 포트를 사용한다.

  • 서버 소켓
    서버 프로그램에서만 사용하는 소켓이다. 클라이언트로부터 연결 요청이 오기를 기다렸다가 연결 요청이 들어오면 클라이언트와 연결을 맺고 다른 소켓을 만드는 일을 한다.
  1. socket() 함수를 이용하여 소켓을 생성

  2. bind() 함수로 소켓에 ip와 port번호를 지정 (소켓을 통신에 사용할 수 있도록 준비)

  3. listen() 함수로 최대 허용 클라이언트 수를 지정하고 클라이언트의 연결 대기

  4. accpet() 함수를 사용하여 클라이언트의 연결 요청 수락

  • 클라이언트 소켓
    클라이언트 소켓은 기다릴 필요가 없기 때문에 바로 클라이언트 소켓을 생성한다.
    클라이언트 프로그램에서 클라이언트 소켓은 서버 프로그램으로 연결 요청을 하는 것과 데이터를 전송하는 일을 한다. 실제로 송수신이 일어나는 소켓이다.
  1. socket() 함수로 가장먼저 소켓을 연다.

  2. connect() 함수를 이용하여 통신할 서버의 ip와 port번호에 통신을 시도한다. (연결 요청)

  3. 통신을 시도하면 서버가 accept() 함수를 이용하여 클라이언트의 socket descriptor를 반환한다

  4. 이를 통해 클라이언트와 서버가 서로 recv(), send() 하며 통신한다.




Reference

https://heeonii.tistory.com/13
https://m.blog.naver.com/akj61300/80130589983

0개의 댓글