IT 프로그래밍/운영체제

[운영체제] 프로세스 통신 구현

기술1 2025. 4. 2. 14:54

물론이죠! 전체적으로 프로세스 간 통신(IPC, Inter-Process Communication)과 관련된 내용을 다루고 있는 것 같아요. 흐름을 유지하면서 좀 더 명확하고 자연스럽게 정리해드릴게요:


공유 메모리(shared memory) 객체는, 해당 이름을 가진 객체가 존재하지 않을 경우 새로 생성되며, 읽기와 쓰기가 모두 가능한 형태로 생성됩니다. 이때, 공유 메모리 객체의 접근 권한은 0666으로 설정되어, 모든 사용자에게 읽기 및 쓰기 권한을 부여합니다.

이러한 공유 메모리는 파일 디스크립터(file descriptor)를 통해 접근하며, 이는 시스템 콜(system call)의 반환값으로 할당됩니다. 사용자 애플리케이션에서는 직접 하드웨어나 커널을 제어할 수 없기 때문에, 시스템 콜을 통해 커널에 요청을 보내고, 커널은 해당 요청을 처리하여 하드웨어 자원을 제어합니다.


메일박스(mailbox) 시스템은 커널 또는 커널 공간에서 생성된 메모리 공간을 통해, 한 프로세스가 특정 데이터를 기록하면 다른 프로세스가 이를 확인하고 동작할 수 있도록 설계된 통신 방식입니다. 예를 들어, A 프로세스가 메일박스에 메시지를 작성하면, B 프로세스는 이를 감지하고 응답할 수 있습니다.


Windows 운영체제에서는 메시지 패싱(message passing) 시스템을 사용합니다. 고급 로컬 프로시저 호출(ALPC, Advanced Local Procedure Call)을 통해 동일 시스템 내의 프로세스 간 통신을 수행합니다. 한국어로는 "고급 로컬 설비"로 번역되기도 하나, 의미가 다소 애매하므로, 영어 원어 그대로 이해하는 것이 더 정확합니다.

ALPC는 동일 시스템 내 프로세스 간 통신을 위한 방식으로, 포트(port)를 통해 통신 채널을 유지합니다.

  1. 클라이언트 프로세스는 핸들을 열고 connection port object를 생성하여 서버에게 연결 요청을 보냅니다.
  2. 서버 프로세스는 두 개의 communication port를 생성하여, 그 중 하나를 클라이언트에 전달하고 나머지 하나는 서버 측에서 유지합니다.
  3. 이러한 포트를 통해 메시지를 주고받으며, 요청(request)은 항상 클라이언트가 보내고, 응답(response)은 서버가 수행합니다.

데이터가 256바이트를 초과하면, 이 메시지들은 포트를 통해 직접 주고받는 방식으로 처리됩니다.

 

소켓

소켓(Socket)

  • 소켓은 네트워크 통신에서 양쪽 끝단(Endpoint) 역할을 합니다.
  • 두 프로세스 간의 데이터 통신을 가능하게 하는 핵심 요소이며, 인터넷이나 네트워크를 통한 통신에서 널리 사용됩니다.

 

remote procedure call

원격 프로시저 호출 (Remote Procedure Call, RPC)

  • *RPC(Remote Procedure Call)은 네트워크를 통해 다른 컴퓨터의 함수를 호출하는 기술입니다.
  • 클라이언트가 마치 로컬 함수를 호출하듯이 원격 함수를 호출하면, 파라미터는 네트워크를 통해 서버로 전달되고, 실행 결과 역시 네트워크를 통해 반환됩니다.

RPC 구조

  • 클라이언트 stub: 로컬에 존재하며, 원격 호출인지를 판단하고 파라미터를 네트워크를 통해 전달합니다.
  • 서버 stub: 전달받은 파라미터를 분리(tokenize)하여 서버 측 함수를 실행하고, 그 결과를 다시 클라이언트에 전달합니다.

바이트 순서 (Endianness)

  • 시스템 아키텍처에 따라 상위 비트(MSB)와 하위 비트(LSB)의 저장 순서가 다릅니다.
    • 예: Windows는 little-endian, 일부 UNIX 시스템은 big-endian
  • 서로 다른 시스템 간 통신 시, 바이트 순서를 맞춰주는 작업이 필요합니다.
  • 이를 처리하는 표준이 XDR(External Data Representation)이며, 데이터를 공통된 포맷으로 직렬화/역직렬화합니다.

 

파이프

파이프 (Pipe)

  • 파이프는 한 프로세스의 출력 결과를 다른 프로세스의 입력값으로 전달하는 통신 수단입니다.
  • 흔히 사용하는 쉘 명령어 a | b에서 볼 수 있듯이, a의 출력이 b의 입력으로 전달됩니다.

단방향 vs 양방향

  • Ordinary Pipe:
    • 단방향 통신
    • 일반적으로 부모-자식 관계에서만 사용 가능
    • 외부 프로세스가 접근할 수 없습니다 (보안성 높음)
  • Named Pipe (FIFO):
    • 양방향 통신 가능
    • 부모-자식 관계가 없어도 사용 가능
    • 이름을 가진 파이프이기 때문에 여러 프로세스가 동시에 접근 가능
    • 유닉스/윈도우 모두 지원

Producer & Consumer

  • Producer: 파이프에 데이터를 write(쓰기) 하는 주체
  • Consumer: 파이프에서 데이터를 read(읽기) 하는 주체
  • 데이터는 FIFO(First In First Out) 방식으로 흐릅니다.