생산자 소비자 문제 개요
- 생산자 소비자 문제는 두 개의 협력 프로세스가 하나의 버퍼를 공유하는 상황을 다룸
- 한 프로세스는 데이터를 생성하여 버퍼에 넣는 역할을 수행
- 다른 프로세스는 버퍼에서 데이터를 꺼내 사용하는 역할을 수행
- 생산자는 생산자 프로세스
- 소비자는 소비자 프로세스
- 가운데 저장 공간은 버퍼
생산자 프로세스 역할
- 데이터를 생성
- 생성한 데이터를 버퍼에 저장
- 버퍼가 가득 찬 경우에는 추가 저장 불가 상태가 됨
소비자 프로세스 역할
- 버퍼에 저장된 데이터를 꺼냄
- 꺼낸 데이터를 실제 처리에 사용함
- 버퍼가 비어 있는 경우에는 데이터를 가져올 수 없음
생산자 소비자 문제 조건
- 버퍼에는 한 번에 하나의 프로세스만 접근 가능
- 생산자와 소비자가 동시에 버퍼를 조작하면 안 됨
- 버퍼의 크기는 유한함
- 버퍼가 가득 차면 생산자는 대기 필요
- 버퍼가 비어 있으면 소비자는 대기 필요
버퍼 접근 상호배제 필요
- 생산자가 버퍼에 데이터를 넣는 동안 소비자가 동시에 접근하면 안 됨
- 소비자가 버퍼에서 데이터를 꺼내는 동안 생산자가 동시에 접근하면 안 됨
- 따라서 버퍼 자체는 임계 영역에 해당함
- 생산자 코드의 버퍼 저장 부분과 소비자 코드의 버퍼 추출 부분 모두 상호배제 대상이 됨
버퍼 상태 동기화 필요
- 버퍼가 가득 찬 상태에서는 생산자가 더 이상 진행하면 안 됨
- 버퍼가 비어 있는 상태에서는 소비자가 더 이상 진행하면 안 됨
- 이 조건은 상호배제와 별도로 동기화까지 필요함
생산자 소비자 문제 해결용 세마포어 구성
- 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로 상호배제 해결empty와full로 동기화 해결- 세마포어 세 개 조합으로 유한 버퍼 문제 처리 가능
판독기 기록기 문제 개요
- 판독기 기록기 문제는 협력 프로세스들이 하나의 공유 자원을 함께 사용하는 상황을 다룸
- 일부 프로세스는 공유 자원에서 데이터를 읽기만 함
- 일부 프로세스는 공유 자원에 데이터를 기록함
- 읽기 프로세스는 판독기
- 쓰기 프로세스는 기록기
판독기 역할
- 공유 자원의 데이터를 읽음
- 읽기 동작은 공유 자원의 내용을 변경하지 않음
- 따라서 여러 판독기가 동시에 읽는 것은 가능함
기록기 역할
- 공유 자원에 데이터를 기록함
- 쓰기 동작은 공유 자원의 내용을 변경함
- 기록 중에는 다른 기록기나 판독기 접근 허용 불가
판독기 기록기 문제 조건
- 기록기가 공유 자원을 쓰는 동안에는 누구도 접근하면 안 됨
- 판독기가 읽는 동안에는 다른 판독기는 동시에 접근 가능
- 판독기가 읽는 동안에는 기록기 접근 불가
- 우선순위를 누구에게 줄지에 따라 문제 유형이 달라짐
제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 기본 방식 구분
- 공유 메모리 방식
- 메시지 전달 방식
두 방식은 서로 배타적이지 않음
- 한 시스템 안에서 둘 다 함께 사용 가능
- 상황에 따라 적절한 방식 선택 가능
공유 메모리 방식 개요
- 여러 프로세스가 동일한 메모리 영역을 함께 사용하는 방식
- 공통된 변수나 버퍼를 두고 데이터를 주고받음
- 프로세스는 해당 공유 메모리를 직접 읽고 직접 씀
공유 메모리 방식 동작 원리
- 공통 변수 하나를 공유 메모리에 배치
- 한 프로세스가 값 기록
- 다른 프로세스가 그 값 읽기
- 별도 메시지 복사 과정 없이 데이터 공유 가능
공유 메모리 방식 장점
- 대량 데이터 교환에 유리
- 속도가 빠름
- 직접 읽기와 쓰기 방식이므로 효율적임
- 버퍼 기반 협력 문제에 적합함
공유 메모리 방식 단점
- 동기화 문제를 응용 프로그램이 직접 해결해야 함
- 상호배제와 순서 제어를 프로그래머가 직접 구현해야 함
- 잘못 처리하면 경쟁 상태와 같은 문제 발생 가능
메시지 전달 방식 개요
- 프로세스가 직접 메모리를 공유하지 않고 메시지를 주고받는 방식
- 운영체제가 제공하는 통신 기능을 이용함
- 대표 동작은 send와 receive
메시지 전달 방식 동작 원리
- 송신 프로세스가 메시지를 보냄
- 운영체제 커널이 메시지 전달 관리 수행
- 수신 프로세스가 메시지를 받음
- 메시지 교환 과정마다 운영체제가 개입함
메시지 전달 방식 장점
- 통신 구조가 명확함
- 운영체제가 통신 문제를 더 많이 관리함
- 응용 프로그래머의 부담이 줄어듦
- 상호배제와 동기화 일부를 커널 수준에서 관리 가능
메시지 전달 방식 단점
- 공유 메모리보다 상대적으로 오버헤드가 큼
- 대량 데이터 교환에는 비효율적일 수 있음
- 시스템 호출을 반복하므로 속도 측면에서 불리할 수 있음
통신 링크 개념
- 메시지 전달 방식에서는 논리적인 전달 통로를 생각할 수 있음
- 이 가상의 전달 통로를 통신 링크라고 볼 수 있음
- 프로세스와 프로세스 사이
- 또는 프로세스와 우편함 사이
- 메시지가 이동하는 논리적 경로 역할을 함
통신 링크 구성 가능성
통신 링크는 상황에 따라 다음처럼 달라질 수 있음
- 두 프로세스 사이 한 개 링크 구성
- 여러 프로세스가 하나의 링크 공유
- 두 프로세스 사이 여러 링크 구성
- 단방향 링크 구성
- 양방향 링크 구성
통신 링크 버퍼 용량 유형
메시지 전달 시 운영체제 내부에는 메시지 저장 공간이 필요할 수 있음
무한 버퍼 용량
- 송신자는 계속 메시지 보낼 수 있음
- 수신자는 나중에 받아도 됨
유한 버퍼 용량
- 저장 공간이 한정됨
- 공간이 가득 차면 송신자는 대기 가능
버퍼 없음
- 송신과 수신이 직접 맞물려야 함
- 수신 준비가 되어 있어야 송신 가능
직접 통신 방식 개요
- 송신 프로세스가 수신 프로세스를 직접 지정하는 방식
- 메시지 전달 대상이 명확하게 정해짐
예시 의미
- A가 B에게 보냄
- B가 A로부터 받음
직접 통신 방식 특성
- 프로세스들이 서로를 직접 식별함
- 프로세스 쌍마다 보통 하나의 통신 링크 형성
- 양방향 통신도 가능
- 상대 프로세스 이름이나 식별자에 의존함
직접 통신 주소 지정 유형
대칭형 주소 지정
- 송신 시 대상 프로세스 명시
- 수신 시 송신 프로세스도 명시
비대칭형 주소 지정
- 송신 시 대상 프로세스 명시
- 수신 시 송신자를 변수로 받아 확인
비대칭형 의미
- 여러 송신자 가운데 누가 보냈는지 유연하게 처리 가능
간접 통신 방식 개요
- 프로세스가 직접 상대를 지정하지 않음
- 중간의 우편함을 통해 메시지 교환
- 우편함은 메시지 저장과 전달의 중간 매개 역할 수행
간접 통신 방식 특성
- 송신자는 우편함에 메시지 보냄
- 수신자는 우편함에서 메시지 받음
- 프로세스와 프로세스가 직접 연결되지 않아도 됨
- 우편함 하나를 여러 프로세스가 함께 사용할 수 있음
간접 통신 링크 특징
- 두 프로세스 사이에 여러 개의 우편함 사용 가능
- 하나의 우편함을 셋 이상의 프로세스가 공유할 수도 있음
- 직접 통신보다 구조가 더 유연함
우편함 소속 방식
프로세스 소속 우편함
- 특정 수신 프로세스에 종속됨
- 해당 프로세스 종료 시 우편함도 함께 사라질 수 있음
- 단방향 구조 형성 가능
운영체제 소속 우편함
- 운영체제가 우편함 관리
- 수신자 관리 방식이 더 유연함
- 상황에 따라 양방향 구조 구성 가능
IPC 방식 비교
공유 메모리 방식
- 빠름
- 대량 데이터 처리에 유리
- 동기화 부담이 응용 프로그램에 있음
메시지 전달 방식
- 구조가 명확함
- 운영체제 개입이 많음
- 응용 프로그램 부담 감소
- 상대적으로 오버헤드 큼
정리
- 생산자 소비자 문제는 유한 버퍼를 공유하는 협력 프로세스 문제임
- 생산자 소비자 문제 해결에는
mutex,empty,full세마포어 사용 - 판독기 기록기 문제는 읽기와 쓰기 프로세스가 같은 공유 자원을 다루는 문제임
- 제1 판독기 기록기 문제는 판독기 우선 정책 사용
- 제2 판독기 기록기 문제는 기록기 우선 정책 사용
- 프로세스 간 통신은 공유 메모리 방식과 메시지 전달 방식으로 구분 가능
- 공유 메모리는 빠르지만 동기화 부담이 큼
- 메시지 전달은 운영체제 개입이 많고 구조가 명확함
- 직접 통신은 상대 프로세스를 직접 지정함
- 간접 통신은 우편함을 통해 메시지를 교환함