[운영체제] CH03-3. 프로세스 간 통신

PikminProtectionAssociation·2024년 11월 9일

행성 탈출기

목록 보기
11/21
post-thumbnail

Interprocess Communication

  • 프로세스는 independent하거나 cooperating함
    • independent : 한 프로세스삭 다른 프로세스의 실행에 영향을 주거나 받지 않음
    • cooperating : 다른 프로세스의 실행에 영향을 주기도 하고 받기도 함
  • IPC (Interprocess Communication)
    • 데이터나 여러가지 정보를 교환하기 위해 프로세스 간 통신 기법이 필요
    • Shared memory
    • Message passing

Shared Memory

  • 통신을 하고자 하는 두 프로세스가 일정한 메모리 영역을 공유함으로써 데이터를 주고받는 방법
  • 각 프로세스는 공유 메모리 영역을 자기 자신의 주소 공간의 일부로 간주
    → 데이터 송수신을 위해 별도의 송수신 함수가 필요하지 않음
    → 프로세스가 메모리에 데이터를 쓰는 것이 송신, 메모리에서 데이터를 읽는 것이 수신
  • 통신 과정에서 송신, 수신 동작은 OS가 아닌 사용자 프로세스의 통제 하에 이루어짐
  • 공유 메모리 기법에서 가장 큰 이슈 중 하나는 사용자 프로세스가 통신을 하기 위해 공유 메모리를 접근할 때 서로의 동작을 동기화할 수 있는 mechanism이 필요하다는 것
    • 프로세스 A와 B는 독립적인 프로세스이므로 A의 송신 동작이 B의 수신 동작보다 먼저 이루어진다는 보장이 없음
    • OS가 제공하는 기능을 통해 동기화

Producer-Consumer Problem

  • 두 개의 프로세스인 producer와 consumer가 buffer라는 공간을 공유
  • producer는 데이터를 생산해서 buffer에 채우고 consumer는 buffer에 들어있는 데이터를 꺼내서 소비
  • unbounded-buffer : 공유 buffer 크기에 제한이 없음
  • bounded-buffer : 공유 buffer 크기가 고정됨

Bounded-Buffer → Shared-Memory Solution

  • Shared data

    #define BUFFER_SIZE 10
     typedef struct {
       ...
     } item;
     
     item buffer[BUFFER_SIZE];
     
     int int = 0;
     int out = 0;
    • bounded-buffer 크기를 10으로 정의
    • 정수형 변수 in과 out은 buffer의 특정 위치를 가리키는 포인터 역할
      • in : producer 프로세스가 생산한 데이터를 저장할 위치
      • out : consumer가 소비할 데이터 위치
  • 그림처럼 buffer는 처음 칸과 마지막 칸이 이어져 있는 형태 (circular list)

  • in과 out 포인터는 생산과 소비가 이루어질 때마다 시계 방향으로 한칸씩 이동

  • in 포인터가 out 포인터보다 늘 앞선 위치에 있음

  • 데이터 개수 : in - out

  • Producer

    item next_produced;
    
     while (true) {
       /* produce an item */
       
       while (((int+1) % BUFFER_SIZE) == out)
         ; /* do nothing */
       buffer[in] = next_produced;
       in = (in+1) % BUFFER_SIZE;
     }
    • 데이터를 생산해서 이를 bounded-buffer에 넣는 동작을 반복하는 구조
    • 데이터를 저장하기 전 buffer의 상태를 살펴보고, 빈 공간이 없으면 빈 공간이 생기기를 기다리며 자신의 실행을 지연시킴 (동기화)
  • Consumer

      item next_consumed;
      
       while (true) {
         while (in == out)
           ; /* do nothing */
         next_consumed = buffer[out];
         out = (out+1) % BUFFER_SIZE;
         
         /* consume the item */
      }
    • buffer에서 데이터를 꺼내어 소비하는 동작을 반복
    • 데이터를 꺼내기 전 buffer의 상태를 살펴보고, buffer가 비어있으면 buffer에 하나 이상의 데이터가 채워질 때까지 자신의 실행을 지연시킴 (동기화)

Message Passing

  • 프로세스 간 통신을 하거나 동기화를 하기 위한 대표적인 IPC mechanism
  • 메모리를 공유하지 않고 통신 가능
  • kernel이 두 개의 연산을 제공
    • send(message)
    • receive(message)
  • 송신할 메시지를 kernel에 있는 queue에 매달고, 수신 프로세스는 이를 꺼내어 수신함
  • 메시지 공유 공간은 kernel 내에 있고 messaage queue 형태로 존재

Direct Communication

  • naming : 통신을 원하는 프로세스들이 서로를 가리키는 방법
  • 통신을 원하는 프로세스가 통신의 송수신자 이름을 명시
    • send(P, message) : 프로세스 P에 송신
    • receive(Q, message) : 프로세스 Q로부터 수신
  • 특징
    • 연결은 자동으로 이루어짐 (send와 receive를 할 때마다 상대방을 지정하기 때문)
    • 연결은 오직 두 프로세스 간에만 이루어짐
    • 단방향 혹은 양방향 연결

Indirect Communication

  • 프로세스 간의 mailbox 혹은 port를 두고, mailbox로 메시지를 보내고 mailbox로부터 메시지를 받는 방식
  • 각 mailbox마다 고유한 id 보유
  • 프로세스들은 통신을 위해 mailbox를 공유
  • 특징
    • 공통의 mailbox를 가지는 프로세스들끼리만 연결
    • 하나의 link를 통해 여러 프로세스가 통신 가능
    • 한 쌍의 프로세스 간에 여러 개의 link를 공유할 수도 있음
    • 단방향 혹은 양방향 연결
  • 연산 : mailbox 생성, 제거 및 mailbox로부터 송수신
    • send(A, message) : mailbox A에 송신
    • receive(A, message) : mailbox A로부터 수신

Synchronization

  • Blocking
    • Blocking send : 보낸 메시지를 수신자가 수신할 때까지 send가 block 되는 방식 (프로세스가 대기 상태에 있게 됨)
    • Blocking receive : 수신하고자 하는 메시지가 available 할 때까지 receive가 block 되는 방식
  • Non-Blocking
    • Non-blocking send : 메시지를 보내고 수신 여부에 상관없이 다음 동작을 이어나감 (호출 후 바로 return 가능)
    • Non-blocking receive : 수신하고자 하는 메시지가 없는 경우 null 메시지를 받음
  • rendezvous(랑데뷰) : Blocking send와 receive로 송수신하는 것

Buffering

  • direct 또는 indirect 커뮤니케이션에 관계없이 커뮤니케이션 link마다 메시지들을 위한 queue가 있으며, 프로세스들이 주고받는 메시지는 이 임시 queue에 머물게 됨
  • message queue 구현 방식
    1. Zero capacity
      • 큐의 길이가 최대 0
      • link는 중간에 대기하는 메시지들을 가질 수 없으며, sender는 receiver가 수신할 때까지 무조건 기다려야 함
    2. Bounded capacity
      • 큐에 최대 n개의 메시지를 넣을 수 있음
      • 송신할 때 큐가 가득차 있지 않은 경우 sender가 송신 후 즉시 수행을 이어나갈 수 있음
      • 큐가 가득차 있으면 큐가 비기를 기다림
    3. Unbounded capacity
      • 큐의 길이에 제약이 없음
      • sender가 기다리는 경우가 없음



참고 자료 : Operating System Concepts Essentials
*이미지 자료는 교재 자료를 직접 다시 만든 것으로 무단 불펌 금지입니다




끗!!

0개의 댓글