본문 바로가기

CS/운영체제

프로세스간 통신 IPC(Inter Process Communication)

협력 프로세스는 다른 프로세스와 데이터를 공유하거나 어떤 방식으로든 서로 영향을 주고받는 프로세스를 의미합니다. 이러한 프로세스들은 시스템 내에서 서로 정보를 교환하거나 동기화를 수행해 작업을 수행합니다.

이렇게 협력 프로세스는 프로세스 간 통신(Inter Process Communication) 메커니즘을 통해 서로 데이터를 주고받거나 상태 정보를 공유합니다.

이러한 방법은 총 7가지의 프로세스 통신이 존재합니다.

1. 파이프(Pipes) : 단방향 통신을 위한 기본적인 IPC 메커니즘입니다. 한 프로세스의 출력이 다른 프로세스의 입력으로 직접 연결됩니다. 파이프는 일반적으로 부모-자식 프로세스 간에 사용되며, 데이터 스트림을 전송하는 데 사용됩니다.


2. 이름 있는 파이프(Named Pipes) : 이름 있는 파이프(또는 FIFO)는 양방향 통신을 지원하며, 시스템 내의 어떤 프로세스 간에도 사용될 수 있습니다. 파일 시스템 내에 특정 이름을 가진 파일 형태로 존재하며, 이를 통해 서로 다른 프로세스가 데이터를 주고받을 수 있습니다.


3. 메시지 큐(Message Queues) : 프로세스 간에 메시지(데이터 블록)를 전송하기 위한 메커니즘입니다. 메시지는 FIFO(First In, First Out) 순서로 전송되며, 프로세스는 비동기적으로 메시지를 송수신할 수 있습니다. 복잡한 데이터 구조를 전송하고, 메시지의 우선순위를 설정할 수 있는 기능을 제공합니다.


4. 공유 메모리(Shared Memory) : 두 개 이상의 프로세스가 시스템 메모리의 동일한 부분을 공유하여 데이터를 접근하고 변경할 수 있게 합니다. 매우 빠른 데이터 접근과 전송이 가능하지만, 동기화 메커니즘(예: 세마포어)을 별도로 사용해야 하는 단점이 있습니다.


5. 세마포어(Semaphores) : 주로 동기화 목적으로 사용되지만, 간접적으로 프로세스 간의 통신에도 사용됩니다. 공유 자원에 대한 접근을 제어하여, 데이터의 일관성과 동시성을 유지합니다.


6. 소켓(Sockets) : 네트워크를 통한 프로세스 간 통신을 가능하게 하는 메커니즘입니다. TCP/IP와 UDP 프로토콜을 사용하여, 같은 시스템 내의 프로세스 또는 다른 시스템에 있는 프로세스 간에 데이터를 주고받을 수 있습니다.


7. 시그널(Signals) : 프로세스에 특정 이벤트가 발생했음을 알리는 간단한 메시지입니다. 주로 운영 체제 또는 다른 프로세스로부터 프로세스에 비동기적으로 알림을 전달하는 데 사용됩니다.



위 과정중에서는 IPC를 통해서 독립적인 프로세스 간 데이터를 전달하기 위해 다양한 메커니즘을 사용하는데, 이 과정에서 여러 종류의 오버헤드가 발생하게 됩니다. 오버헤드를 편하게 풀이하자면, 저는 컴퓨터에 짐을 좀 더 실어준다는 느낌으로 생각하고 있습니다. 



Context Switching

Context Switching은 프로세스의 실행 상태를 전환하는 과정으로, 다음과 같은 이유로 커널 모드로 전환되게 됩니다.

PCB의 상태가 저장되어 있는 Process Table에 접근이 필요합니다. Process Table은 시스템에서 관리되는 모든 프로세스의 정보를 저장한 테이블입니다. 각 프로세스는 PCB를 통해 상태, 레지스터, 메모리 위치, 스케줄링 정보 등을 저장하게 됩니다.

Context Switching시 현재 프로세스의 PCB 정보를 업데이트하고, 전환될 프로세스의 PCB에서 데이터를 읽어와야 하는데요. 이 작업은 보호된 메모리 공간에 저장된 시스템 자원에 접근해야 하기 때문에 Kernel Mode에서만 가능하게 됩니다. 그래서 User Mode에서 Kernel Mode로 전환이 필수가 되겠죠?

또한, 현재 PCB의 상태에 따라 CPU가 구성되어 있는데 이러한 CPU의 레지스터 정보 저장 및 복구와 같은 작업은 운영 체제의 제어 하에서 이루어지게 됩니다. 이 또한 Kernel Mode에서 수행됩니다.


데이터 복사(Data Copying)


IPC 메커니즘에서 데이터를 송신 프로세스에서 수신 프로세스로 전송할 때 발생하는 복사는 아래와 같은 단계를 포함하게 됩니다.

커널 버퍼(Kernel Buffer)를 이용한 복사가 있습니다. 대부분의 IPC는 사용자 프로세스의 데이터를 커널 버퍼에 복사한 후, 이를 수신 프로세스의 메모리로 다시 복사합니다. 이 복사 작업은 두 번의 데이터 전송이 이뤄지게 되는데요.
User Mode -> Kernel Mode -> User Mode(애매한 내용) 로 전환되며 각 User 공간, Kernel 공간으로 데이터가 이동하며 메모리가 전송됩니다.


캐시 일관성(Cache Coherence)


멀티 코어 환경에서 공유 메모리를 사용할 때 발생됩니다. 캐시 라인이 무효화됩니다. 한 프로세스가 공유 메모리를 수정하게 되면, 수정된 데이터가 저장된 캐시 블록이 다른 CPU 코어에서 무효화가 됩니다. 무효화된 캐시 라인은 다른 코어가 이 데이터를 요청할 경우 메인 메모리(RAM) 또는 수정된 코어의 캐시에서 데이터를 다시 가져와야 합니다.

캐시 메모리에 저장되는 방식
캐시 메모리는 CPU 근처에 있는 엄청난 속도의 메모리입니다. 자주 사용되거나 최근에 접근된 데이터를 저장하게 되는데요. 근데 캐시 메모리에 저장할 때 단 하나의 메모리만 가져오게 될까요?

캐시는 시간 지역성(locality)으로 최근에 접근한 데이터나 명령어는 다시 접근할 가능성이 굉장히 높다고 판단하여 캐시에 저장하게 됩니다. 그리고 공간 지역성(locality)으로 하나의 메모리 주소가 접근되면, 그 근처의 메모리 주소도 곧 접근될 가능성이 높습니다. 이와 같은 방식으로 지속적인 캐시 미스가 발생되는것을 방지합니다.


틀린 내용

  • 캐시 메모리 저장 방식에 대한 약간의 부정확성
    • 캐시 메모리가 "근처의 메모리 주소도 곧 접근될 가능성이 높다"는 공간 지역성(Locality of Space)의 개념을 설명한 부분은 일반적으로 맞지만, 캐시가 정확히 "근처 메모리를 무조건 가져오는 방식"이라는 뉘앙스는 다소 과장된 표현입니다.
      • 실제로 캐시는 CPU 설계와 알고리즘에 따라 데이터를 가져오는 방식이 달라질 수 있습니다.
      • 예를 들어, 특정 상황에서는 공간 지역성이 낮거나 무작위적인 접근 패턴(Random Access)이 나타날 수 있으며, 이 경우 캐시 효율성이 떨어집니다.

애매한 내용

  • "IPC에서 커널 복사가 2단계로 이루어진다(User → Kernel → User)"
    • 이 설명은 기본적으로 맞지만, IPC 메커니즘마다 복사 방식이 다를 수 있습니다.
      • 공유 메모리는 커널 복사를 우회하여 데이터를 전송하므로, 이 설명이 적용되지 않습니다.
      • 파이프와 메시지 큐 등은 커널 복사를 포함하므로 맞습니다.
    • 이 내용은 데이터 전송 방식에 따라 다르기 때문에 일반적인 설명으로 적용하기엔 애매합니다.

더 알아봐야 할 것들

  1. IPC 메커니즘별 상세 구현 방식
    • 각 IPC 메커니즘(파이프, 공유 메모리, 소켓 등)의 세부 구현 방식, 성능 비교, 사용 사례를 명확히 설명할 필요가 있습니다.
  2. 캐시 일관성 프로토콜
    • 캐시 일관성 프로토콜(MESI, MOESI 등)이 구체적으로 어떻게 공유 메모리와 캐시 무효화를 처리하는지 기술적인 설명이 추가적으로 필요합니다.
  3. 커널 버퍼 사용과 데이터 복사
    • "커널 버퍼를 통한 복사" 과정이 IPC 메커니즘마다 다르게 동작하므로 이를 분류해 설명해야 합니다.
  4. 컨텍스트
    • 컨텍스트 스위칭이 멀티스레드 환경에서의 캐시 미스, TLB 플러시와 같은 추가적인 오버헤드를 유발하는지 확인할 필요가 있습니다.

Summary

  1. IPC 개념 및 주요 메커니즘
    • IPC는 프로세스 간 데이터를 공유하거나 동기화하기 위해 사용되며, 주요 메커니즘에는 파이프, 메시지 큐, 공유 메모리, 세마포어, 소켓, 시그널 등이 있습니다.
    • 공유 메모리는 가장 빠른 통신 방식이지만, 동기화 비용이 높고 설정이 복잡합니다.
  2. Context Switching
    • 컨텍스트 스위칭은 프로세스 실행 상태를 전환하는 작업으로, PCB 정보를 저장 및 복구하는 과정에서 커널 모드 전환이 필수적입니다.
    • PCB는 보호된 메모리 공간에 저장되며, 이로 인해 커널 모드에서만 접근할 수 있습니다.
  3. 캐시 일관성 문제
    • 공유 메모리를 사용하는 멀티 코어 시스템에서 한 코어가 데이터를 수정하면, 다른 코어의 캐시가 무효화됩니다.
    • 캐시 일관성 프로토콜(MESI 등)은 이 문제를 해결하지만, 추가적인 메모리 접근 오버헤드를 유발합니다.
  4. 데이터 복사와 오버헤드
    • 대부분의 IPC는 사용자 공간 데이터를 커널 버퍼로 복사한 후 수신 프로세스로 전송합니다. 공유 메모리는 커널 복사가 필요 없으므로 더 효율적입니다.