본 게시글은 대학 전공수업을 들으며 노션에 정리한 내용을 블로그로 옮긴 게시글 입니다.
5강 - 생산자-소비자 / 판독기/기록기 문제
생산자-소비자 문제
두 협력 프로세스 사이에 버퍼를 두고, 생산자와 소비자의 상황을 다루는 문제
- 생산자 : 데이터를 넣는 프로세스
- 소비자 : 데이터를 꺼내는 프로세스
무엇이 문제?
- 버퍼에 여러 프로세스가 동시에 접근할 수 없음
- 버퍼에 데이터를 넣는 동안에는 데이터를 꺼낼수가 없음
- 버퍼에서 데이터를 꺼내는 동안에는 데이터를 넣을 수 없음
- ⇒ 상호 배제 필요!
- 버퍼의 크기가 유한함
- 버퍼가 가득찼다면 생산자는 대기 해야함.
- 버퍼가 빈 경우 소비자는 대기해야함
- ⇒ 동기화 필요!
이 문제는 4강에서 배운 세마포어를 이용해 해결 가능
버퍼란?
유튜브를 볼 때
해결방법
상호배제
: 세마포어 mutex(초깃값1)
생산자의 ‘생산()’과 소비자의 ‘소비()’ 앞 뒤에 P(mutex)와 V(mutex)를 붙여줌
동기화 - 버퍼가 가득 찬 경우
: 세마포어 empty(초기값 n = 버퍼 크기)
empty 값의 의미: 버퍼의 ‘빈 칸’이 몇개나 있는가?
즉, 초기에는 empty값이 버퍼 크기만큼 있는 것이고, 가득찼다면 0이 된다!
버퍼가 가득 찼다면 생산자는 기다려야하고(P) 소비자는 소비(V)해야한다.
동기화 - 버퍼가 빈 경우
: 세마포어 full(초기값 0)
버퍼가 비었다면 생산자는 채워야 하고, 소비자는 기다려야한다.
이떄는 생산자가 행동(V), 소비자가 대기(P)
판독기 -기록기 문제
여러 협력 프로세스 사이에 공유자원을 두고 판독기와 기록기의 상황을 다루는 문제
- 판독기 : 데이터를 읽는 프로세스(Read)
- 기록기: 데이터를 쓰는 프로세스(Write)
생산자-소비자랑 똑같은 문제 아닌가요?
생산자-소비자는 여기서는 모두 데이터를 쓰는 프로세스이므로, ‘기록기’라고 볼 수 있다.
무엇이 문제?
- 하나의 기록기가 공유 자원에 데이터를 쓰는 중에는, 다른 기록기나 판독기는 공유 자원에 접근할 수 없음
- 공유자원에 데이터를 쓰는 동안에는 누구도 접근할 수 없음
- 공유자원에서 데이터를 읽는 동안에는 데이터를 쓸 수 없음
- 즉, 상호 배제 필요!
- 여러 판독기는 동시에 공유자원에서 데이터를 읽을 수 있음
- 판독기가 읽는 중 새로운 판독기 읽기 시도 → 가능하다.
- 판독기가 읽는 중이라 기록기가 대기 중.→ 가능? 불가능??
- → 새로운 판독기가 읽기 시도
이때 가능하다고 하면 아래의 제1문제이고, 불가하다고 하면 제2문제 이다.
제1 판독기-기록기 문제
판독기가 공유 자원에 접근중이라면 기록기보다 판독기에 우선순위를 줌.
즉, 새로운 판독기는 즉시 공유자원에 접근 가능!
문제점
- 기록기의 기아상태 유발 가능(기아상태: 꼬리물기 때문에, 진행하지 못하는 상황이라고 생각)
해결 : 세마포어
1단계: 상호배제 세마포어 wrt(1) : *괄호 안은 초기값
⇒ 읽기와 쓰기의 동시접근 문제
2단계: 판독기 우선 반영 : 일반변수 rcount(0) : 읽으려고 하는 판독기
세마포어 mutex(1))
===========
(1)판독기가 들어옴 → rcount 값이 1 이됨 → 조건문 → P(wrt)에 걸림
(2)판독 중 다른 판독기가 들어옴 → rcount = 2 → 조건문 패스 → 대기없이 바로 읽음
(3)판독기가 다 읽음 → rcount 값이 0 이 됨 → V(wrt) → 기록기 실행
===========
그런데, 만약 rcount 부분에 대해서 동시에 2개의 판독기가 들어오게 된다면 조건문(rcount==1) 에 걸리지 않으면서 문제가 발생한다. 따라서 rcount와 관련한 작업을 임계작업으로 두고 또 다른 세마포어를 만든게 mutex이다.
제2 판독기-기록기 문제
판독기가 공유 자원에 접근중이라면, 판독기보다 기록기에 우선순위를 줌.
즉, 대기중인 기록기가 있다면 새로운 판독기는 공유자원에 접근 불가능
문제점
- 판독기의 병행성이 떨어짐
- 판독기의 기아상태 유발 가능
wrt : 쓰기/읽기에 대한 세마포어
mutex : 판독기 실행 중에는 다른 판독기가 접근 가능하도록 하는 세마포어
rd : 판독기 실행중이라 하더라도, 기록기가 대기중이라면 새 판독기도 대기해야하는 세마포어
mutex2, 3 : rd에 대한 세마포어
프로세스간 통신
IPC: InterProcess Communication
병행 프로세스가 데이터를 서로 공유하는 방법
공유 메모리 방법
- 협력 프로세스가 동일한 변수를 사용
- 동일한변수 → 공유 자원인 메모리 공간 사용
- 예
- 생산자-소비자 문제의 유한버퍼
- 판독기-기록기 문제의 공유자원
- 대량 데이터 교환 : 고속 통신 가능(메모리 공간 사용하므로)
- 통신상 발생 가능 문제 : 응용 프로그래머가 해결
메시지 전달 방법
협력 프로세스가 메시지를 주고 받음
- 시스템 호출 send(), receive()
소량 데이터 교환에 적합
통신상 발생 가능 문제 해결 : 운영체제가 해결
메시지 전달 방법의 구조
운영체제는 어떻게 메시지를 전달하도록 구현했는가? 에 대한 답
- 통신링크 : 프로세스간 메시지가 지나다니는 통로
- 연결대상: 둘, 셋….이상
- 링크 개수 : 하나, 둘 이상
- 방향성 : 단방향 / 양방향
- 용량 : 무한, 유한
- 무한인 경우, 대기가 없음
- 유한인경우, 큐가 가득 차게 되면 대기해야함.
- 0인경우, 수신자가 받을 수 있을 때 까지 대기.
직접통신
두 프로세스가 직접 서로를 지정하여 메시지 전달
- 오직 하나의 통신 링크가 자동 설정
- 하나의 통신 링크는 오직 두 프로세스 사이에만 연관
- 통신 링크는 양방향
💬A와 B의 카카오톡 채팅방을 생각하면 쉽다.
간접통신
프로세스 사이에 둔 우편함을 통해 메시지 전달
- 같은 우편함을 이용하는 경우 통신 링크가 설정
- 여러 우편함을 이용하면 여러개의 통신 링크 존재
- 하나의 통신 링크가 여러 프로세스와 연관 가능
- 통신 링크는 단방향 또는 양방향
💬그룹 채팅방을 생각하면 된다.
'Computer Science > 운영체제' 카테고리의 다른 글
[운영체제] 교착 상태(정의, 필요조건, 예방, 회피, 탐지-복구) (0) | 2024.06.22 |
---|---|
[운영체제] 병행프로세스, 상호배제, 동기화, 세마포어 (0) | 2024.06.22 |