운영체제 studyIPC

운영체제 study March 20, 2024
운영체제  studyIPC

IPC란?

  • 프로세스는 독립적으로 실행된다.
  • 이처럼 독립적인 공간을 가진 프로세스 간 통신에 사용되는 기법이 IPC 통신이다.
  • 프로세스는 커널이 제공하는 IPC 설비를 이용해 프로세스 간의 통신을 할 수 있게 된다.
  • IPC = Inter-Process Communication
  • 프로세스들 사이에 서로 데이터를 주고받는 행위

  • 위 그림처럼 우리가 사용하는 프로세스들은 모두 유저공간(user-space, user-mode)에서 개별로 OS로부터 할당받은 독립된 공간에서 운행중에 있다
  • 말한것 처럼 프로세스는 독립된 공간에서 운행하다보니 서로간에 통신이 어렵다는 문제가 있다
  • 이를 해결하고자 커널 영역(kernel-space, kernel-mode)에서 IPC(Inter-Process Communication)라는 프로세스들 간에 통신을 제공하고 있다
  • 이처럼 프로세스들은 커널이 제공하는 IPC 기술을 통해 프로세스간에 통신을 할 수 있다

Q) 프로세스 간의 통신은 왜 어렵나요?

프로세스끼리의 통신이 어려운 이유를 이해하기 위해서는 프로세스와 스레드의 차이에 대해서 먼저 이해해야합니다.우리는 fork와 같은 함수로 프로세스를 pthread_create와 같은 함수로 쓰레드를 각각 생성해주는데, 둘을 만드는 과정에서큰 차이가 존재합니다.
프로세스는 생성되면서 * PC 를 포함하여 메모리 공간 등을 복사하여 자원을 할당하지만 쓰레드는 메모리 공간와 자원들을 공유하기 때문에 그렇습니다. 즉, 우리가 프로세스와 쓰레드를 생성하기 전에 a라는 변수를 선언해 놓았다고 한다면 프로세스는 a를 각각 1개씩 갖게 되지만 쓰레드는 a를 공유합니다.
그래서 프로세스는 통신을 할 공간이 없기 때문에 별도의 공간을 만들어주어야 하기 때문에 프로세스간의 통신은 쓰레드 간의 통신보다 어렵습니다.
* PC(Program Counter) : 여기서의 PC는 Personal Computer가 아니라 프로그램 카운터로 다음에 수행해야하는 명령어의 주소를 가리키는 레지스터입니다. 어느 line을 실행할 지에 대한 주소를 저장하고 있는 포인터로 쉽게 이해하면 됩니다!

IPC 종류

  1. 익명 PIPE
    파이프는 두 개의 프로세스를 연결하는데 하나의 프로세스는 데이터를 쓰기만 하고, 다른 하나는 데이터를 읽기만 할 수 있다.

    한쪽 방향으로만 통신이 가능한 반이중 통신이라고도 부른다.

    따라서 양쪽으로 모두 송/수신을 하고 싶으면 2개의 파이프를 만들어야 한다.

    매우 간단하게 사용할 수 있는 장점이 있고, 단순한 데이터 흐름을 가질 땐 파이프를 사용하는 것이 효율적이다. 단점으로는 전이중 통신을 위해 2개를 만들어야 할 때는 구현이 복잡해지게 된다.

  1. Named PIPE
    익명 파이프는 통신할 프로세스를 명확히 알 수 있는 경우에 사용한다. (부모-자식 프로세스 간 통신처럼)

    Named 파이프는 전혀 모르는 상태의 프로세스들 사이 통신에 사용한다.

    즉, 익명 파이프의 확장된 상태로 부모 프로세스와 무관한 다른 프로세스도 통신이 가능한 것 (통신을 위해 이름있는 파일을 사용)

    하지만, Named 파이프 역시 읽기/쓰기 동시에 불가능함. 따라서 전이중 통신을 위해서는 익명 파이프처럼 2개를 만들어야 가능

  1. Message Queue
    입출력 방식은 Named 파이프와 동일함

    다른점은 메시지 큐는 파이프처럼 데이터의 흐름이 아니라 메모리 공간이다.
    어디서나 물건을 꺼낼 수 있는 컨테이너 벨트와 같다 보면 된다
    Message Queue에 쓸 데이터에 번호를 붙힘으로써 다수의 프로세스가 동시에 데이터를 쉽게 다룰 수 있다

장점

  • 비동기 방식이기에 방대한 처리량이 있다면 큐에 넣은 후 나중에 처리 할 수 있다
  • 다수의 프로세스들이 큐에 메시지를 보낼 수 있고 다수의 프로세스들이 큐로부터 메시지를 꺼낼 수 있다
  • 분산처리 및 경쟁처리 방식에 사용할 수 있다
  • (비동기, 비동조, 탄력성, 과잉, 확장성이 있는데 이건 다른 포스트 참조해도 충분할 거 같다)

단점

  • 메시지가 정말 잘 전달되었는지 알 수 없다
  • 큐에 데이터를 넣고 나오는 과정에서 오버헤드가 발생 할 수 있다
  • 데이터가 많이 쌓일수록 추가적인 메모리 자원이 필요하다
  1. 공유 메모리

    파이프, 메시지 큐가 통신을 이용한 설비라면, 공유 메모리는 데이터 자체를 공유하도록 지원하는 설비다.

    프로세스의 메모리 영역은 독립적으로 가지며 다른 프로세스가 접근하지 못하도록 반드시 보호되야한다. 하지만 다른 프로세스가 데이터를 사용하도록 해야하는 상황도 필요할 것이다. 파이프를 이용해 통신을 통해 데이터 전달도 가능하지만, 스레드처럼 메모리를 공유하도록 해준다면 더욱 편할 것이다.

    공유 메모리는 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용해준다.

    프로세스가 공유 메모리 할당을 커널에 요청하면, 커널은 해당 프로세스에 메모리 공간을 할당해주고 이후 모든 프로세스는 해당 메모리 영역에 접근할 수 있게 된다.

    중개자 없이 곧바로 메모리에 접근할 수 있어서 IPC 중에 가장 빠르게 작동함

  2. 메모리 맵
    공유 메모리처럼 메모리를 공유해준다. 메모리 맵은 열린 파일을 메모리에 맵핑시켜서 공유하는 방식이다. (즉 공유 매개체가 파일+메모리)

    주로 파일로 대용량 데이터를 공유해야 할 때 사용한다.

  1. 소켓
    네트워크 소켓 통신을 통해 데이터를 공유한다.

    클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용한다.

    서버(bind, listen, accept), 클라이언트(connect)

이러한 IPC 통신에서 프로세스 간 데이터를 동기화하고 보호하기 위해 세마포어와 뮤텍스를 사용한다. (공유된 자원에 한번에 하나의 프로세스만 접근시킬 때)

댓글 (0)

댓글 작성