운영체제

05강-병행 프로세스02

2026-03-17

생산자 소비자 문제 개요

  • 생산자 소비자 문제는 두 개의 협력 프로세스가 하나의 버퍼를 공유하는 상황을 다룸
  • 한 프로세스는 데이터를 생성하여 버퍼에 넣는 역할을 수행
  • 다른 프로세스는 버퍼에서 데이터를 꺼내 사용하는 역할을 수행
  • 생산자는 생산자 프로세스
  • 소비자는 소비자 프로세스
  • 가운데 저장 공간은 버퍼

생산자 프로세스 역할

  • 데이터를 생성
  • 생성한 데이터를 버퍼에 저장
  • 버퍼가 가득 찬 경우에는 추가 저장 불가 상태가 됨

소비자 프로세스 역할

  • 버퍼에 저장된 데이터를 꺼냄
  • 꺼낸 데이터를 실제 처리에 사용함
  • 버퍼가 비어 있는 경우에는 데이터를 가져올 수 없음

생산자 소비자 문제 조건

  • 버퍼에는 한 번에 하나의 프로세스만 접근 가능
  • 생산자와 소비자가 동시에 버퍼를 조작하면 안 됨
  • 버퍼의 크기는 유한함
  • 버퍼가 가득 차면 생산자는 대기 필요
  • 버퍼가 비어 있으면 소비자는 대기 필요

버퍼 접근 상호배제 필요

  • 생산자가 버퍼에 데이터를 넣는 동안 소비자가 동시에 접근하면 안 됨
  • 소비자가 버퍼에서 데이터를 꺼내는 동안 생산자가 동시에 접근하면 안 됨
  • 따라서 버퍼 자체는 임계 영역에 해당함
  • 생산자 코드의 버퍼 저장 부분과 소비자 코드의 버퍼 추출 부분 모두 상호배제 대상이 됨

버퍼 상태 동기화 필요

  • 버퍼가 가득 찬 상태에서는 생산자가 더 이상 진행하면 안 됨
  • 버퍼가 비어 있는 상태에서는 소비자가 더 이상 진행하면 안 됨
  • 이 조건은 상호배제와 별도로 동기화까지 필요함

생산자 소비자 문제 해결용 세마포어 구성

  • mutex
  • empty
  • full

사용 의미

  • mutex: 버퍼 접근 상호배제 용도
  • empty: 비어 있는 버퍼 칸 수 표현
  • full: 데이터가 들어 있는 버퍼 칸 수 표현

mutex 세마포어 역할

  • 버퍼에 대한 상호배제 처리 담당
  • 생산자와 소비자 모두 버퍼 접근 전 P(mutex) 수행
  • 버퍼 작업 완료 후 V(mutex) 수행
  • 초기값은 1 사용

의미

  • 한 프로세스가 버퍼 사용 중이면 다른 프로세스는 진입 불가
  • 버퍼 사용 종료 후에만 다른 프로세스 진입 가능

empty 세마포어 역할

  • 현재 비어 있는 버퍼 칸 수 관리
  • 생산자가 버퍼에 데이터를 넣기 전에 확인 대상이 됨
  • 초기값은 버퍼 전체 크기 사용

의미

  • 비어 있는 칸이 하나라도 있으면 생산 가능
  • 값이 0이면 버퍼가 가득 찬 상태이므로 생산자는 대기

full 세마포어 역할

  • 현재 데이터가 들어 있는 버퍼 칸 수 관리
  • 소비자가 버퍼에서 데이터를 꺼내기 전에 확인 대상이 됨
  • 초기값은 0 사용

의미

  • 데이터가 하나라도 있으면 소비 가능
  • 값이 0이면 버퍼가 비어 있는 상태이므로 소비자는 대기

생산자 측 처리 흐름

  • P(empty) 수행
  • P(mutex) 수행
  • 버퍼에 데이터 저장
  • V(mutex) 수행
  • V(full) 수행

처리 의미

  • 빈칸 여부 확인 후 진입
  • 버퍼 접근 중에는 상호배제 유지
  • 저장 완료 후 버퍼 사용 종료
  • 데이터 개수 증가 반영

소비자 측 처리 흐름

  • P(full) 수행
  • P(mutex) 수행
  • 버퍼에서 데이터 추출
  • V(mutex) 수행
  • V(empty) 수행

처리 의미

  • 데이터 존재 여부 확인 후 진입
  • 버퍼 접근 중에는 상호배제 유지
  • 추출 완료 후 버퍼 사용 종료
  • 빈칸 개수 증가 반영

생산자 소비자 문제 해결 핵심

  • mutex로 상호배제 해결
  • emptyfull로 동기화 해결
  • 세마포어 세 개 조합으로 유한 버퍼 문제 처리 가능

판독기 기록기 문제 개요

  • 판독기 기록기 문제는 협력 프로세스들이 하나의 공유 자원을 함께 사용하는 상황을 다룸
  • 일부 프로세스는 공유 자원에서 데이터를 읽기만 함
  • 일부 프로세스는 공유 자원에 데이터를 기록함
  • 읽기 프로세스는 판독기
  • 쓰기 프로세스는 기록기

판독기 역할

  • 공유 자원의 데이터를 읽음
  • 읽기 동작은 공유 자원의 내용을 변경하지 않음
  • 따라서 여러 판독기가 동시에 읽는 것은 가능함

기록기 역할

  • 공유 자원에 데이터를 기록함
  • 쓰기 동작은 공유 자원의 내용을 변경함
  • 기록 중에는 다른 기록기나 판독기 접근 허용 불가

판독기 기록기 문제 조건

  • 기록기가 공유 자원을 쓰는 동안에는 누구도 접근하면 안 됨
  • 판독기가 읽는 동안에는 다른 판독기는 동시에 접근 가능
  • 판독기가 읽는 동안에는 기록기 접근 불가
  • 우선순위를 누구에게 줄지에 따라 문제 유형이 달라짐

제1 판독기 기록기 문제 정의

  • 판독기에게 우선순위를 부여하는 방식
  • 어떤 판독기가 이미 읽고 있으면 새로운 판독기도 계속 진입 가능
  • 기록기가 기다리는 중이어도 추가 판독기 진입 허용

제1 판독기 기록기 문제 특성

  • 판독기 병행성 유지 가능
  • 읽기 성능이 높아짐
  • 기록기는 계속 뒤로 밀릴 수 있음
  • 결과적으로 기록기 기아 상태 가능

제1 판독기 기록기 문제 해결 변수 구성

  • write
  • mutex
  • readCount

사용 의미

  • write: 기록기와 판독기 사이 공유 자원 보호
  • mutex: readCount 보호
  • readCount: 현재 읽고 있는 판독기 수 기록

readCount 역할

  • 현재 공유 자원을 읽는 판독기 수를 저장함
  • 첫 번째 판독기 진입 시 기록기 차단 시작
  • 마지막 판독기 종료 시 기록기 차단 해제

제1 판독기 처리 흐름

  • P(mutex) 수행
  • readCount 증가
  • readCount == 1이면 P(write) 수행
  • V(mutex) 수행
  • 공유 자원 읽기 수행
  • P(mutex) 수행
  • readCount 감소
  • readCount == 0이면 V(write) 수행
  • V(mutex) 수행

처리 의미

  • 첫 번째 판독기만 기록기 차단 시작
  • 중간 판독기들은 추가 진입 가능
  • 마지막 판독기가 끝날 때 기록기 차단 해제

제1 기록기 처리 흐름

  • P(write) 수행
  • 공유 자원 기록 수행
  • V(write) 수행

처리 의미

  • 기록 중에는 누구도 공유 자원 접근 불가
  • 기록 종료 후에만 판독기 또는 다른 기록기 접근 가능

제2 판독기 기록기 문제 정의

  • 기록기에게 우선순위를 부여하는 방식
  • 기록기가 기다리고 있으면 새로운 판독기 진입 제한
  • 먼저 대기 중인 기록기 처리를 우선 보장

제2 판독기 기록기 문제 특성

  • 기록기의 대기 시간 감소 가능
  • 기록기 기아 문제 완화 가능
  • 판독기의 병행성 저하 가능
  • 판독기가 오래 기다리는 상황 발생 가능

제2 판독기 기록기 문제 추가 고려사항

  • 이미 읽고 있는 판독기는 계속 수행 가능
  • 그러나 기록기가 대기 중이라면 새로운 판독기 진입 차단 필요
  • 따라서 제1 문제보다 제어 구조가 더 복잡해짐

제2 판독기 기록기 문제 해결 구조 특징

  • 판독기 진입 자체를 통제하는 별도 세마포어 필요
  • 기록기 대기 여부를 관리하는 별도 개수 변수 필요
  • 판독기용 상호배제와 기록기용 상호배제를 분리하여 관리함

제2 판독기 기록기 문제 핵심 이해 포인트

  • 제1 문제는 판독기 우선
  • 제2 문제는 기록기 우선
  • 두 방식 모두 세마포어 사용 가능
  • 우선순위 정책에 따라 병행성과 기아 가능성이 달라짐

프로세스 간 통신 개요

  • 협력 프로세스는 서로 데이터를 주고받아야 함
  • 이를 위한 방법이 IPC
  • IPC는 Inter-Process Communication
  • 운영체제는 프로세스 간 데이터 교환을 위한 여러 통신 방식을 제공함

프로세스 간 통신 필요성

  • 협력 프로세스는 상태 정보 공유 필요
  • 데이터 전달 필요
  • 작업 결과 전달 필요
  • 버퍼, 공유 자원, 메시지 교환 등 다양한 형태로 통신 발생

IPC 기본 방식 구분

  • 공유 메모리 방식
  • 메시지 전달 방식

두 방식은 서로 배타적이지 않음

  • 한 시스템 안에서 둘 다 함께 사용 가능
  • 상황에 따라 적절한 방식 선택 가능

공유 메모리 방식 개요

  • 여러 프로세스가 동일한 메모리 영역을 함께 사용하는 방식
  • 공통된 변수나 버퍼를 두고 데이터를 주고받음
  • 프로세스는 해당 공유 메모리를 직접 읽고 직접 씀

공유 메모리 방식 동작 원리

  • 공통 변수 하나를 공유 메모리에 배치
  • 한 프로세스가 값 기록
  • 다른 프로세스가 그 값 읽기
  • 별도 메시지 복사 과정 없이 데이터 공유 가능

공유 메모리 방식 장점

  • 대량 데이터 교환에 유리
  • 속도가 빠름
  • 직접 읽기와 쓰기 방식이므로 효율적임
  • 버퍼 기반 협력 문제에 적합함

공유 메모리 방식 단점

  • 동기화 문제를 응용 프로그램이 직접 해결해야 함
  • 상호배제와 순서 제어를 프로그래머가 직접 구현해야 함
  • 잘못 처리하면 경쟁 상태와 같은 문제 발생 가능

메시지 전달 방식 개요

  • 프로세스가 직접 메모리를 공유하지 않고 메시지를 주고받는 방식
  • 운영체제가 제공하는 통신 기능을 이용함
  • 대표 동작은 sendreceive

메시지 전달 방식 동작 원리

  • 송신 프로세스가 메시지를 보냄
  • 운영체제 커널이 메시지 전달 관리 수행
  • 수신 프로세스가 메시지를 받음
  • 메시지 교환 과정마다 운영체제가 개입함

메시지 전달 방식 장점

  • 통신 구조가 명확함
  • 운영체제가 통신 문제를 더 많이 관리함
  • 응용 프로그래머의 부담이 줄어듦
  • 상호배제와 동기화 일부를 커널 수준에서 관리 가능

메시지 전달 방식 단점

  • 공유 메모리보다 상대적으로 오버헤드가 큼
  • 대량 데이터 교환에는 비효율적일 수 있음
  • 시스템 호출을 반복하므로 속도 측면에서 불리할 수 있음

통신 링크 개념

  • 메시지 전달 방식에서는 논리적인 전달 통로를 생각할 수 있음
  • 이 가상의 전달 통로를 통신 링크라고 볼 수 있음
  • 프로세스와 프로세스 사이
  • 또는 프로세스와 우편함 사이
  • 메시지가 이동하는 논리적 경로 역할을 함

통신 링크 구성 가능성

통신 링크는 상황에 따라 다음처럼 달라질 수 있음

  • 두 프로세스 사이 한 개 링크 구성
  • 여러 프로세스가 하나의 링크 공유
  • 두 프로세스 사이 여러 링크 구성
  • 단방향 링크 구성
  • 양방향 링크 구성

통신 링크 버퍼 용량 유형

메시지 전달 시 운영체제 내부에는 메시지 저장 공간이 필요할 수 있음

무한 버퍼 용량

  • 송신자는 계속 메시지 보낼 수 있음
  • 수신자는 나중에 받아도 됨

유한 버퍼 용량

  • 저장 공간이 한정됨
  • 공간이 가득 차면 송신자는 대기 가능

버퍼 없음

  • 송신과 수신이 직접 맞물려야 함
  • 수신 준비가 되어 있어야 송신 가능

직접 통신 방식 개요

  • 송신 프로세스가 수신 프로세스를 직접 지정하는 방식
  • 메시지 전달 대상이 명확하게 정해짐

예시 의미

  • A가 B에게 보냄
  • B가 A로부터 받음

직접 통신 방식 특성

  • 프로세스들이 서로를 직접 식별함
  • 프로세스 쌍마다 보통 하나의 통신 링크 형성
  • 양방향 통신도 가능
  • 상대 프로세스 이름이나 식별자에 의존함

직접 통신 주소 지정 유형

대칭형 주소 지정

  • 송신 시 대상 프로세스 명시
  • 수신 시 송신 프로세스도 명시

비대칭형 주소 지정

  • 송신 시 대상 프로세스 명시
  • 수신 시 송신자를 변수로 받아 확인

비대칭형 의미

  • 여러 송신자 가운데 누가 보냈는지 유연하게 처리 가능

간접 통신 방식 개요

  • 프로세스가 직접 상대를 지정하지 않음
  • 중간의 우편함을 통해 메시지 교환
  • 우편함은 메시지 저장과 전달의 중간 매개 역할 수행

간접 통신 방식 특성

  • 송신자는 우편함에 메시지 보냄
  • 수신자는 우편함에서 메시지 받음
  • 프로세스와 프로세스가 직접 연결되지 않아도 됨
  • 우편함 하나를 여러 프로세스가 함께 사용할 수 있음

간접 통신 링크 특징

  • 두 프로세스 사이에 여러 개의 우편함 사용 가능
  • 하나의 우편함을 셋 이상의 프로세스가 공유할 수도 있음
  • 직접 통신보다 구조가 더 유연함

우편함 소속 방식

프로세스 소속 우편함

  • 특정 수신 프로세스에 종속됨
  • 해당 프로세스 종료 시 우편함도 함께 사라질 수 있음
  • 단방향 구조 형성 가능

운영체제 소속 우편함

  • 운영체제가 우편함 관리
  • 수신자 관리 방식이 더 유연함
  • 상황에 따라 양방향 구조 구성 가능

IPC 방식 비교

공유 메모리 방식

  • 빠름
  • 대량 데이터 처리에 유리
  • 동기화 부담이 응용 프로그램에 있음

메시지 전달 방식

  • 구조가 명확함
  • 운영체제 개입이 많음
  • 응용 프로그램 부담 감소
  • 상대적으로 오버헤드 큼

정리

  • 생산자 소비자 문제는 유한 버퍼를 공유하는 협력 프로세스 문제임
  • 생산자 소비자 문제 해결에는 mutex, empty, full 세마포어 사용
  • 판독기 기록기 문제는 읽기와 쓰기 프로세스가 같은 공유 자원을 다루는 문제임
  • 제1 판독기 기록기 문제는 판독기 우선 정책 사용
  • 제2 판독기 기록기 문제는 기록기 우선 정책 사용
  • 프로세스 간 통신은 공유 메모리 방식과 메시지 전달 방식으로 구분 가능
  • 공유 메모리는 빠르지만 동기화 부담이 큼
  • 메시지 전달은 운영체제 개입이 많고 구조가 명확함
  • 직접 통신은 상대 프로세스를 직접 지정함
  • 간접 통신은 우편함을 통해 메시지를 교환함