[OS] 프로세스 - 2

본 포스팅 글은 이전 게시글에 대해 이어지는 내용을 작성합니다. 해당 게시글을 확인하지 않으신 분은 먼저 이전 글을 읽고 오시기 바랍니다.



프로세스 통신

개요

프로세스 종류

  • 독립적으로 작동하는 프로세스
  • 협력적으로 작동하는 프로세스
    • 협력적으로 작동하는 프로세스는 서로 영향을 준다.


협력 프로세스를 사용하는 이유

  • 정보 공유
  • 연산속도 향상
  • 모듈화
  • 편의성


IPC

  • IPC: Interprocess Communication
  • 협력 프로세스가 원활하게 동작하기 위한 방법을 의미한다.
  • IPC의 종류
    • Shared Memory
    • Message Passing



프로세스 통신 모델

Message Passing vs Shared Memory

Untitled

  • Message Passing
    • Message Queue를 통해 메시지를 주고받는다.
    • Kernel을 통해, Message를 교환하여 Kernel Overhead가 발생할 수 있다.
    • 프로세스간 직접적으로 통신을 하지 않는다.
  • Shared Memory
    • 공유메모리를 통해 프로세스가 서로 소통한다.
    • 동기화(Sync)를 통해서 동시성 문제를 극복한다.



공유 메모리

공유 메모리 원리

Untitled


생산자 소비자 문제

  • 생산자, 소비자는 협력 프로세스가 서로 통신하기 위해 필요하다.
  • 생산자: 공유할 데이터를 생산(Write)한다.
  • 소비자: 공유할 데이터를 소비(Read)한다.
  • 시각화

    Untitled

    읽고 쓰는 속도가 동일해야 한다.



버퍼

버퍼의 종류

  • 무한 버퍼
  • 유한 버퍼


유한 버퍼

  • 유한 버퍼는 공유 메모리에서 사용된다.
  • 시각화

    Untitled

  • 유한 버퍼 소스코드

      #define BUFFER_SIZE 10
      typedef struct {
      	//...
      } item;
        
      item buffer[BUFFER_SIZE];
      int in = 0; //Write 할 곳의 index
      int out = 0; //Read 할 곳의 index
    
    • 즉, 유한버퍼는 큐 형태를 가진다.
  • 버퍼 상태
    • empty 상태
      • “in == out” 일 때, 버퍼는 빈 상태가 된다.
    • full 상태
      • ”((in+1)%BUFFER_SIZE) == out” 일 때, 버퍼는 꽉 찬 상태가 된다.
    • 원형 큐의 상태와 동일하다.


유한버퍼: 생산자

  • 아래 코드는 버퍼에 생산자가 공유할 데이터를 생산하는 예시코드이다.

      item next_producted;
      while(((in+1)%BUFFER_SIZE)==out) { //buffer가 full상태인 경우
      	//Do Nothing
      }
      buffer[in] = next_produced; //비어있는 곳(변수 in)에 item을 삽입(생산)한다.
      in = (in+1) % BUFFER_SIZE; //변수 in이 다음 비어 있는 원소를 가리키도록 한다.
    
    • ((in+1)%BUFFER_SIZE)==out
      • 해당 조건은 원형 큐 형태인 버퍼가 full 상태인지 판단한다.
      • while 문을 통해, 버퍼가 꽉 차있으면 공유할 데이터를 삽입하지 않도록 한다.
  • 환형 버퍼(원형 버퍼) 예시

    • 사용자는 최대 ‘BUFFER_SIZE-1’개 만큼의 버퍼를 사용할 수 있다.
    • 마지막 공간까지 데이터가 채워진다면, full 상태와 empty 상태를 구분할 수 없기 때문이다.

    자세한 내용은 이전에 포스팅한 글 “[데이터구조] 큐“를 참고하자.

    Untitled


유한버퍼: 소비자

  • 아래 코드는 버퍼에 소비자가 공유할 데이터를 소비하는 예시코드이다.

      item next_consumed;
      while (true) {
      	while (in==out) { //공백 상태일 때
      		//Do Nothing
      	}
        
      	next_consumed = buffer[out]; // 읽기
      	out = (out+1) % BUFFER_SIZE; // 변수 out이 다음에 읽을 위치를 가르키도록
      }
      buffer[in] = next_produced; //비어있는 곳(변수 in)에 item을 삽입한다.
      in = (in+1) % BUFFER_SIZE; //변수 in이 다음 비어 있는 원소를 가리키도록 한다.
    
    • in==out
      • 해당 조건은 원형 큐 형태인 버퍼가 empty 상태인지 판단한다.
      • while 문을 통해, 버퍼가 비어있으면 공유할 데이터를 소비하지 않도록 한다.



Message Passing (메시지 전달)

개요

  • Message Passing은 IPC의 한 종류이다.
    • 또다른 종류로는 Shared Memory (공유 메모리)가 존재한다.
  • Message Passing에서 사용하는 동작들
    • send(message)
      • 메시지 송신
    • receive(message)
      • 메시지 수신
  • Message Passing을 위해 준비해야하는 것
    • 프로세스 간의 통신 링크 만들기
    • send와 receive를 통해, 메시지 교환하기
    • 주요 이슈
      • 어떻게 링크를 만들 것인가?
      • 링크는 단방향인가, 양방향인가?
    • 통신 링크의 종류
      • 물리적 링크
        • Shared Memory
        • Hardware Bus
        • Network
      • 논리적 링크
        • 동기, 비동기 링크
        • 자동적, 명시적 버퍼


직접 통신

  • P2P 방식의 통신이다.
  • 행동
    • send(P, message)
      • 프로세스 P에게 메시지를 보낸다.
    • receive(Q, message)
      • 프로세스 Q로부터 온 메시지를 받는다.
  • 통신 링크의 속성
    • 자동 링크 연결
    • 한 쌍의 통신 프로세스만 연관되어 있다.
    • 단방향, 양방향 링크 존재
  • 시각화

    Untitled


간접 통신

  • 메일박스(포트)를 통해서 통신하는 방법이다.
  • 프로세스가 서로 직접적으로 통신하지는 않는다.
  • 메일박스
    • Mailbox는 port라고 불리기도 한다.
    • 각 메일박스는 유일한 식별자를 가지고 있다.
  • 시각화

    Untitled

  • 특징
    • 링크가 여러 프로세스와 연결되어 있을 수 있다.

      Untitled

    • 프로세스들이 여러 개의 링크를 가질 수 있다.

      Untitled

  • 연산의 종류
    • 새 메일박스(포트) 만들기
    • 메일박스를 통해서 send, receive 하기
    • 메일박스 삭제하기


Message Passing 종류

Message Passing은 여러가지 종류가 있다.

  • Message Passing의 종류
    • 봉쇄형
    • 비봉쇄형


봉쇄형

  • 봉쇄(Blocking)을 통해, 동기(Sync)를 할 수 있다.
  • 봉쇄형의 종류
    • 봉쇄형 송신
      • sender는 보낸 메시지가 받아질 때까지 Block된다.
    • 봉쇄형 수신
      • receiver는 메시지가 도착할 때까지 Block된다.
  • 시각화

    Untitled


비봉쇄형

  • 비봉쇄(Unblocking)을 통해, 비동기(async)를 할 수 있다.
  • 비봉쇄형의 종류
    • 비봉쇄형 송신
      • sender는 메시지를 보내고, 할일을 계속한다.
    • 비봉쇄형 수신
      • receiver는 ‘유효한 메시지를 받거나’, ‘Null 메시지라도 받아서’ 작업을 계속한다.
  • 시각화

    Untitled


랑데부

  • 랑데부란?
    • send와 receive가 동시에 Block인 상태를 뜻한다.



버퍼링

버퍼링이란

  • 직접, 간접 통신 모두 프로세스 간에 교환되는 메시지는 임시 큐에 들어간다. 이것을 버퍼링이라고 한다.
  • 버퍼링 종류
    • Zero Capacity
      • 오직 한개씩만 주고 받는다.
      • Queue의 길이가 1인 것
      • 즉, 큐잉이 불가능하다.
    • Bounded Capacity
      • 유한 용량
    • Unbounded Capacity
      • 무한 용량
  • 시각화

    Untitled



IPC 예시

Mach 시스템

Untitled

  • msg_send() : 메시지를 메일박스에 보낸다.
  • msg_receive() : 메일박스에서 메시지를 수신한다.


윈도우즈 시스템

  • 윈도우즈는 “advanced local procedure call (LPC)”을 통해 Message Passing을 사용한다.
  • 즉, 고급 로컬 프로시저 호출 기능에 기반한 윈도우즈는 메시지 전달 기법을 사용한다.



Client-Server 시스템

주요 포인트

  • Socket
  • Remote Procedure Calls (RPC)
  • Pipes
  • Remote Method Invocation (Java에서)


소켓

  • 소켓은 연결의 종단점을 뜻한다.
  • 소켓의 구성요소
    • Ip
    • Port
  • 포트
    • 1024번 이하 포트는 주로 사용되는 메인 포트이다.
    • 개발, 테스트 용으로 포트를 사용할 때는 1024번 이상 포트를 사용해야 한다.
  • Loopback 주소
    • localhost
    • 127.0.0.1
    • 자기 자신으로 돌아오는 주소이다.


  • 시각화

    Untitled


  • 자바에서의 소켓

    Untitled


Remote Procedure Calls

  • RPC란?
    • 원격지에 존재하는 프로시저를 호출하는 방법이다.
    • 프로시저: 일종의 로직
  • Big-endian
    • 최상위 바이트를 먼저 저장한다.

    Untitled

  • Little-endian
    • 최하위 바이트를 먼저 저장한다.

    Untitled

  • Big-endian과 Little-endian을 서로 변환, 해석할 해석기가 필요하다.
    • 왜냐하면, 통신하는 시스템들이 Big-endian과 Little-endian 을 모두 사용하기 때문이다.


Pipes

  • 파이프는 두 프로세스가 통신할 수 있게 하는 전달자 역할을 한다.
  • 초기 UNIX에서 제공한 것으로 현재는 윈도우에서도 사용한다.
  • 고려사항
    • 단방향 vs 양방향
    • 반이중 vs 전이중
      • 반이중: 동시에 양방향 통신 X, 시점을 구분하여 송신과 수신을 따로 진행한다.
      • 전이중: 동시에 양방향 통신 O
  • 파이프의 종류
    • Ordinary Pipes
      • 일반 파이프
    • Named Pipes
      • 지명 파이프


일반 파이프

  • 부모-자식 프로세스 간의 통신시 아래 그림처럼 fd가 구분되어 사용된다.
    • fd : file descriptor

Untitled


지명 파이프

  • 양방향 통신이 가능하다.
  • 통신할 프로세스가 부모-자식 관계여야만 사용할 수 있다는 제한도 존재하지 않는다.


RMI

  • RMI란?
    • Remote Method Invocation
    • RMI 방식의 원리와 RPC 방식의 원리는 서로 같다.





  • 성결대학교 컴퓨터 공학과 강영명 교수님 (2021)
  • Siberschatz et. al., 『Operating System Concepts 10th Ed.』
본 게시글은 위 강의 및 교재를 기반으로 정리한 글입니다.