• 병행 프로세스(2) - 생산자-소비자, 판독기-기록기, IPC

    2025. 3. 31.

    by. haong_

    병행 프로세스의 문제와 일반적인 해결 방법

    병행 프로세스 중 협력 프로세스에서 여러 프로세스가 공유 자원을 사용할 때 다음과 같은 문제가 발생할 수 있다.

    • 상호배제 (Mutual Exclusion): 동시에 접근하면 안 되는 자원 보호 필요
    • 동기화 (Synchronization): 프로세스 실행 순서가 중요한 경우 제어 필요
    • 기아 상태 (Starvation): 특정 프로세스가 자원을 무한정 기다리는 상황 발생 가능성

    생산자-소비자 문제 

    두 협력 프로세스 사이에 버퍼를 두고 생산자와 소비자의 상황을 다루는 문제 

     

    • 생산자는 데이터를 버퍼에 넣고, 소비자는 버퍼에서 데이터를 꺼내 사용
    • 버퍼는 유한 크기이며, 버퍼가 가득 찼거나 비어 있을 때 동기화 문제 발생
    • 버퍼에 여러 프로세스가 동시에 접근할 수 없도록 상호배제 필요

    버퍼(Buffer)란? 

    • 생산자 소비자 프로세스 간에 데이터를 임시로 저장하는 공유 메모리 영역

     

    세마포어 설정

    • mutex: 상호배제 (초기값 1)
    • empty: 빈 버퍼의 개수 관리 (초기값 n, 버퍼 크기)
    • full: 찬 버퍼의 개수 관리 (초기값 0)
    // 생산자 프로세스
    while (true) {
        데이터를 생산;
    
        P(empty);  
        P(mutex);  
    
        버퍼에 데이터를 넣음;
    
        V(mutex); 
        V(full);   
    }
    
    // 소비자 프로세스
    while (true) {
        P(full);   
        P(mutex);  
    
        버퍼에서 데이터를 꺼냄;
    
        V(mutex);  
        V(empty);  
    
        데이터를 소비;
    }

    판독기-기록기 문제 

    여러 협력 프로세스 사이에 공유자원을 두고 판독기와 기록기의 상황을 다루는 문제

    • 판독기(Reader): 공유 데이터를 읽기만 하는 프로세스
    • 기록기(Writer): 공유 데이터에 쓰기(변경)를 하는 프로세스
    • 판독기는 여러 개가 동시에 접근 가능하지만, 기록기가 접근할 땐 반드시 단독 접근 필요
    • 판독기-기록기 문제는 판독기 우선기록기 우선 두 가지 형태로 구분

    제1 판독기-기록기 문제(판독기 우선)

     

    • 판독기 접근 중이면 기록기는 기다림
    • 기록기 기아 상태 가능성 존재
    • 사용되는 변수와 세마포어
      • 일반 변수: rcount (판독기 수, 초기값 0)
      • 세마포어:
        • mutex (rcount 접근 보호, 초기값 1)
        • wrt (기록기의 공유 자원 접근 보호, 초기값 1)

     

    // 판독기 프로세스
    while (true) {
        P(mutex);
        rcount++;
        if (rcount == 1) P(wrt);  // 첫 판독기면 기록기 접근 방지
        V(mutex);
    
        데이터를 읽음;
    
        P(mutex);
        rcount--;
        if (rcount == 0) V(wrt);  // 마지막 판독기면 기록기 접근 허용
        V(mutex);
    }
    
    // 기록기 프로세스
    while (true) {
        P(wrt);  // 다른 판독기, 기록기 접근 차단
    
        데이터에 기록;
    
        V(wrt);  // 접근 허용
    }

    제 2 판독기-기록기 문제(기록기 우선) 

     

    • 기록기가 접근 대기 중이라면 새로운 판독기 접근을 제한함
    • 판독기 병행성 감소 및 판독기 기아 상태 발생 가능성 존재
    • 사용되는 변수와 세마포어
      • 일반 변수:
        • rcount (판독기 수, 초기값 0)
        • wcount (기록기 수, 초기값 0)
      • 세마포어:
        • mutex1 (rcount 보호, 초기값 1)
        • mutex2 (wcount 보호, 초기값 1)
        • mutex3 (판독기 진입 조절, 초기값 1)
        • rd (판독기 접근 제한, 초기값 1)
        • wrt (기록기 접근 보호, 초기값 1)

     

    // 판독기 프로세스
    while (true) {
        P(mutex3);
          P(rd);
            P(mutex1);
            rcount++;
            if (rcount == 1) P(wrt);
            V(mutex1);
          V(rd);
        V(mutex3);
    
        데이터를 읽음;
    
        P(mutex1);
        rcount--;
        if (rcount == 0) V(wrt);
        V(mutex1);
    }
    
    // 기록기 프로세스
    while (true) {
        P(mutex2);
        wcount++;
        if (wcount == 1) P(rd);
        V(mutex2);
    
        P(wrt);
        데이터에 기록;
        V(wrt);
    
        P(mutex2);
        wcount--;
        if (wcount == 0) V(rd);
        V(mutex2);
    }
    • 조금 복잡하지만 > 판독기가 기록기가 우선순위 가짐, 기록기 접근 중이면 판독기 추가 진입 불가능하게 제한

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

    • 병행 프로세스가 데이터를 서로 공유하는 방법 
      • 공유 메모리 방법
      • 메시지 전달 방법
    • 하나의 운영체제에서 두 방법 함께 사용가능

    공유 메모리 방법

    • 두 개 이상의 협력 프로세스가 공통의 메모리 영역을 공유하여 데이터를 교환
    • 프로세스는 해당 메모리 공간을 자신의 주소 공간처럼 접근
    • ex) 생산자-소비자 문제의 유한 버퍼, 판독기-기록기 문제의 공유 자원 
    [프로세스 A] ⇄ [공유 메모리] ⇄ [프로세스 B]

    메시지 전달 방법

    • 협력 프로세스 간에 메시지 형태로 데이터를 주고받는 방식
    • 운영체제가 제공하는 시스템 호출 (ex. send(), receive()) 이용
    • 데이터를 메시지 형태로 주고받기 때문에 동기화가 상대적으로 간편
    • 주로 소량 데이터 교환에 적합
    [프로세스 A] --send()--> [운영체제 (메시지 큐)] --receive()--> [프로세스 B]

    메시지 전달 방법의 논리적 구조

    통신 링크

    • 메시지가 전송되는 논리적 통로
    • 운영체제가 관리하며, 물리적이 아닌 논리적 개념 

    통신 링크 구현 형태


    구분 유형 특징
    연결 대상 두 프로세스 1:1 통신 링크
    셋 이상의 프로세스 1:N 또는 N:M 다자간 통신 링크
    링크 개수 하나 하나의 링크로만 연결
    둘 이상 프로세스 간 여러 개 링크 가능
    통신 방향 단방향 한 방향으로만 메시지 전송 가능
    양방향 양쪽 방향으로 전송 가능
    링크 용량 무한 송신자 프로세스가 대기할 필요 없음
    유한 큐가 가득 차면 송신자 대기
    0 수신자가 받을 때까지 송신자 대기

    메시지 전달 방식의 두가지 유형

    직접 통신

    • 송신 프로세스가 수신 프로세스를 직접 지정하여 메시지 전송
    • 프로세스 간 링크가 자동 설정 (하나의 링크는 두 프로세스 사이에만 설정됨)
    • 양방향 통신 링크 형태로 설정됨

    주소 지정 방식

    • 대칭형 (Symmetric)
      • send(P1, message) : P1에 메시지 전송
      • receive(P2, message) : P2로부터 메시지 수신
      • 송신자와 수신자가 서로 상대방 프로세스를 명시적으로 지정
    • 비대칭형 (Asymmetric)
      • send(P1, message) : P1에 메시지 전송
      • receive(id, message) : id는 발신자를 지정하지 않고 수신 대기

    간접 통신

    • 프로세스가 **공유 우편함(mailbox, 포트)**을 통해 간접적으로 통신
    • 메시지는 프로세스 간이 아닌 우편함을 통해 전달됨
    • 하나의 우편함에 여러 프로세스가 연결될 수 있음

    통신 링크의 특성

    • 우편함이 여러 개면 프로세스 간 여러 링크 존재 가능
    • 한 링크가 여러 프로세스와 연관 가능

    우편함 소속에 따른 특징

    • 우편함이 수신 프로세스에 소속된 경우
      • 수신 프로세스는 하나만 존재
      • 통신 링크는 단방향 (송신 → 수신 프로세스)
    • 우편함이 운영체제에 소속된 경우
      • 여러 수신 프로세스 연결 가능
      • 통신 링크는 양방향 (여러 프로세스 사이에서 상호 전송 가능)

     

    댓글