Devlog_by_0giru

[운영체제] 프로세스의 통신 본문

[기타]

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

0giru_kim 2021. 5. 17. 21:14
  • 프로세스간 통신 IPC(Inter-Process Communication)

프로세스는 다른 프로세스와 독립적(Independent)으로 동작하거나, 협력적(Cooperating)으로 동작할 수 있다.

 

프로세스가 Independent 하다면, 이는 다른 프로세스와 데이터를 공유하지 않는 다는 것을 의미하고, Cooperating 하다면 이는 다른 프로세스와 데이터를 공유함을 의미한다.

 

Cooperating 하는 프로세스는 IPC 메커니즘을 필요로 하고, 크게 두가지 IPC 모델이 있다.

  • Shared Memory : 하나의 공유 메모리를 생성해 공유 메모리에 공유할 데이터를 송신, 수신하는 방법이다.

생산 프로세스와 소비 프로세스가 차례로 프로세서를 점유하며 생산 프로세스는 버퍼(Shared Memory)에 생산한 데이터를 저장하고 소비 프로세스는 버퍼에 저장된 데이터를 소비한다.

Shared Memory 방법은 프로그래머가 매번 프로세스간 데이터를 공유할 수 있도록 메모리 영역에 쓰고 지우는 것을 직접 프로그래밍 해주어야 한다는 번거로움이 있다.

 

  • Message Passing : 프로세스는 운영체제에 메시지만 전달하고, 데이터 공유는 OS에서 전담하는 방법이다.

Message Passing 방법은 Send와 Receive 두가지 명령을 이용한다.

프로세스는 Communication Link를 이용해 송수신 하는데, 송수신 방법에 따라 크게 4가지로 구분할 수 있다.

  • Direct / Indirect Communication
  • Synchronous / Asynchronous Communication

 

  • Direct Communication

Direct Communication의 경우 통신할 프로세스는 각각 어떤 프로세스와 통신할 것인지를 명시적으로 표시해야 한다.

통신하는 두 프로세스는 오직 하나의 링크를 통해서만 통신한다.

  • 송신 : send(P, message) - send a message to process P
  • 수신 : receive(Q, message) - receive a message to process Q.

  • Indirect Communication

Indirect Communication의 경우 메시지는 mailbox 혹은 Port를 통해 교환된다.

둘 이상의 프로세스가 하나의 mailbox(port)를 사용할 수 있다.

  • 송신 : send(A, message) - send a message to mailbox A
  • 수신 : receive(A, message) - receive a message to mailbox A

 

  • Synchronous / Asynchronous Communication

Synchronous 혹은 Asynchronous는 Blocking / Non-Blocking을 의미한다.

  • Blocking Send : 송신 프로세스는 메시지 수신이 완료될 때 까지 막히게 된다.
  • Non-Blocking Send : 송신 프로세스는 메시지를 보내고 작업을 재시작 한다.
  • Blocking Receive : 수신 프로세스는 메시지가 수신 가능할 때 까지 막히게 된다.
  • Non-Blocking Send : 수신 프로세스는 자유롭게 메시지를 수신할 수 있다. 유효한 메시지를 받거나 NULL 을 받는다.

 

  • 또 다른 프로세스간 통신 방법들
    • 소켓(Socket) 통신

소켓은 통신의 EndPoint를 의미한다. 두 프로세스가 네트워크 상에서 통신으로 하려면 총 두개의 소켓이 필요하다.

각 소켓은 IP주소와 포트 번호를 접합해 구별한다.

 

 

    • 원격 프로시저 호출 (Remote Procedure Calls)

IPC가 로컬 프로세스간 통신이라고 한다면, RPC는 네트워크를 이용해 원격에 있는 프로시저를 호출하는 방법이다.

클라이언트가 마치 자신의 프로시저를 호출하는 것 처럼 원격에 있는 호스트의 프로시저를 호출할 수 있게 해준다.

 

클라이언트 쪽에 Stub을 제공하여 통신에 필요한 자세한 사항들을 숨겨준다. 클라이언트가 원격 프로시저를 호출하면 RPC 시스템은 그에 대응하는 스텁을 호출하고 원격 프로시저가 필요로 하는 매개변수를 건네준다. 스텁이 원격 서버의 포트를 찾고 매개변수를 정리해 네트워크로 전송하기 위한 적절한 형태로 변환한다. 이를 Marshall이라고 한다.

  •  
    • 파이프

파이프는 두 프로세스가 통신할 수 있게 하는 전달자로서 동작한다. 초기 유닉스 시스템에서의 IPC 방법 중 한가지였다.

파이프는 통신할 때 여러가지 제약을 받는데, 파이프를 구현하기 위해서는 아래 4가지 문제를 고려해야 한다.

  1. 파이프가 단방향 또는 양방향 통신을 허용하는지
  2. 양방향 통신이라면 반이중 방식인지 혹은 전이중 방식인지
  3. 통신 프로세스 간 부모-자식과 같은 특정 관계가 필요한지
  4. 파이프 통신은 로컬 프로세스간 통신만 가능한지 혹은 네트워크를 통해 통신이 가능한지

+) 보통의 파이프 (Ordinary Pipe)

Ordinary Pipe는 생성-피생성 프로세스간 사용하는 방법이다. 통상적으로 부모-자식 프로세스 통신에 사용된다.

생산자는 파이프의 한쪽 끝에 쓰고(write end, fd[1]), 소비자는 파이프의 다른 한쪽 끝에서 데이터를 읽는다(read end, fd[0])

이는 단방향 통신을 의미하고, 양방향 통신을 하고싶다면 두개의 파이프를 사용하면 된다.

 

+) 지명 파이프 (Named Pipe)

보통의 파이프는 오직 프로세스가 서로 통신하는 동안에만 존재한다. 프로세스간 통신이 끝나게 되면 보통의 파이프는 모두 사라지게 된다.

지명 파이프는 보통의 파이프보다 강력한 통신 도구로서 동작하는데, 양방향 통신이 가능하며 부모-자식 관계가 필요하지 않다. 지명 파이프가 구축되면, 여러 프로세스들이 이를 사용해 통신할 수 있다.

'[기타]' 카테고리의 다른 글

[운영체제] 스레드  (0) 2021.05.18
[운영체제] 프로세스  (0) 2021.05.17
Mac OS 패키지 관리자 Homebrew 이용해보기  (0) 2021.03.11