티스토리 뷰
1. 생산자 - 소비자 문제 정의
- 두 협력 프로세스 사이에 버퍼를 두고 생산자와 소비자의 상황을 다루는 문제
- 생산자 : 버퍼에 데이터를 넣는 프로세스
- 소비자 : 버퍼에서 데이터를 꺼내는 프로세스
2. 생산자 - 소비자 문제 조건
- 버퍼에 여러 프로세스가 동시에 접근할 수 없음
- 버퍼에 데이터를 넣는 동안에는 데이터를 꺼낼 수 없음
- 버퍼에서 데이터를 꺼내는 동안에는 데이터를 넣을 수 없음
- → 상호배제 필요
- 버퍼의 크기가 유한 ( 유한 버퍼 문제 )
- 버퍼가 가득 찬 경우 생산자는 대기해야 함
- 버퍼가 빈 경우 소비자는 대기해야 함
- → 동기화 필요
3. 세마포어를 이용한 해결 ( 생산자 - 소비자 문제 )
- 상호배제 : 세마포어 mutex ( 초기값 : 1 )
- 버퍼에 데이터를 넣는 부분과 버퍼에서 데이터를 꺼내는 부분은 임계영역에 해당
- 생산자 코드
While(true) {
// 데이터를 생산
P(mutex); // mutex --;
// 버퍼에 데이터를 넣음
V(mutex); // mutex ++;
}
- 소비자 코드
While(true) {
P(mutex);
// 버퍼에서 데이터를 꺼냄
V(mutex);
// 데이터를 소비
}
- 버퍼가 가득 찬 경우 동기화 : 세마포어 empty ( 초기값 : n [n은 버퍼의 크기] )
- n은 버퍼에 빈 공간이 얼만큼 남았는지 나타낸다.
- 생산자 코드
While(true) {
// 데이터를 생산
P(empty); // 버퍼에 빈 공간이 남았는지 확인
P(mutex);
// 버퍼에 데이터를 넣음
V(mutex);
}
- 소비자 코드
While(true) {
P(mutex);
// 버퍼에서 데이터를 꺼냄
V(mutex);
V(empty); // 버퍼에 빈 공간이 생겼음을 알림
// 데이터를 소비
}
- 버퍼가 빈 경우 동기화 : 세마포어 full ( 초기값 : 0 )
- 생산자 코드
While(true) {
// 데이터를 생산
P(empty);
P(mutex);
// 버퍼에 데이터를 넣음
V(mutex);
V(full); // 버퍼에 하나 공간이 채워졌음을 알림
}
- 소비자 코드
While(true) {
P(full); // 버퍼가 비어있는지 확인
P(mutex);
// 버퍼에서 데이터를 꺼냄
V(mutex);
V(empty);
// 데이터를 소비
}
- 3개의 세마포어 : 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);
// 데이터를 소비
}
4. 판독기 - 기록기 문제 정의
- 여러 협력 프로세스 사이에 공유자원을 두고 판독기와 기록기의 상황을 다루는 문제
- 판독기 : 데이터를 읽는 프로세스
- 판독기는 공유자원에 영향을 주지 않는다.
- 기록기 : 데이터를 쓰는 프로세스
- 기록기는 공유자원에 영향을 준다.
- 판독기 : 데이터를 읽는 프로세스
5. 판독기 - 기록기 문제 조건
- 하나의 기록기가 공유자원에 데이터를 쓰는 중에는 다른 기록기나 판독기는 공유자원에 접근할 수 없음
- 공유자원에 데이터를 쓰는 동안에는 누구도 접근할 수 없음
- 공유자원에서 데이터를 읽는 동안에는 데이터를 쓸 수 없음
- → 상호배제 필요
- 여러 판독기는 동시에 공유자원에서 데이터를 읽을 수 있음
- 판독기가 읽는 중 새로운 판독기 읽기 시도 → 가능
- 판독기가 읽는 중 기록기 대기 → 새로운 판독기 읽기 시도 → 가능/불가능
6. 제 1 판독기 - 기록기 문제
- 판독기가 공유자원에 접근 중이라면 기록기보다 판독기에 우선순위를 줌
- 즉, 새로운 판독기는 즉시 공유자원에 접근 가능
- 문제점
- 기록기의 기아상태 유발 가능
7. 세마포어를 이용한 해결 ( 제 1 판독기 - 기록기 )
- 상호배제 : 세마포어 wrt ( 초기값 : 1 )
- 기록기 코드
P(wrt);
// 공유자원에 쓰기
V(wrt);
- 판독기 코드
P(wrt);
// 공유자원에서 읽기
V(wrt);
- 판독기 우선 : 일반변수 rcount ( 초기값 : 0 ), 세마포어 mutex ( 초기값 : 1 )
- rcount는 읽으려고 하는 판독기의 개수를 의미
- mutex를 사용하는 이유는 동시에 2개 이상의 판독기가 들어온 경우 rcount가 잘못된 값이 들어갈 수 있기에 상호배제를 위해서이다.
- rcount는 임계영역에 해당
- 기록기 코드
P(wrt);
// 공유자원에 쓰기
V(wrt);
- 판독기 코드
P(mutex);
rcount = rcount + 1;
// rcount가 1일때는 기록기 판단을 하지만
// 1이 아닐때, 즉, 이미 다른 판독기가 읽는 중이라면
// 기록기 판단을 패스하고 바로 공유자원에서 읽는다.
if (rcount == 1) P(wrt);
V(mutex);
// 공유자원에서 읽기
P(mutex);
rcount = rcount - 1;
// 마지막 판독기까지 끝난 경우
if (rcount == 0) V(wrt);
V(mutex);
- 세마포어를 이용한 해결 wrt ( 초기값 : 1 ), mutex ( 초기값 : 1 ), 일반변수 rcount ( 초기값 : 0 )
- 기록기 코드
P(wrt);
// 공유자원에 쓰기
V(wrt);
- 판독기 코드
P(mutex);
rcount = rcount + 1;
if (rcount == 1) P(wrt);
V(mutex);
// 공유자원에서 읽기
P(mutex);
rcount = rcount - 1;
if (rcount == 0) V(wrt);
V(mutex);
8. 제 2 판독기 - 기록기 문제
- 판독기가 공유자원에 접근 중이라면 판독기보다 기록기에 우선순위를 줌
- 즉, 대기 중인 기록기가 있다면 새로운 판독기는 공유자원에 접근 불가능
- 문제점
- 판독기의 병행성이 떨어짐
- 판독기의 기아상태 유발 가능
9. 세마포어를 이용한 해결 ( 제 2 판독기 - 기록기 )
- 5개의 세마포어를 이용한 해결
- rd ( 초기값 : 1 )
- wrt ( 초기값 : 1 )
- mutex1, mutex2, mutex3 ( 초기값 : 1 )
- 기록기 코드
P(mutex2);
wcount = wcount + 1;
if (wcount == 1) P(rd); // 기록기가 대기 중임을 알림
V(mutex2);
P(wrt);
공유자원에 쓰기
V(wrt);
P(mutex2);
wcount = wcount - 1;
if (wcount == 0) V(rd);
V(mutex2);
- 판독기 코드
P(mutex3);
P(rd); // 기록기가 대기 중인지 확인
P(mutex1);
rcount = rcount + 1;
if (rcount == 1) P(wrt); V(mutex1);
V(rd);
V(mutex3);
공유자원에서 읽기
P(mutex1);
rcount = rcount - 1;
if (rcount == 0) V(wrt);V(mutex1);
10. 프로세스 간 통신 ( IPC )
- Inter Process Communication
- 병행 프로세스가 데이터를 서로 공유하는 방법
- 종류
- 공유 메모리 방법
- 메시지 전달 방법
- 하나의 운영체제에서 두 방법 함께 사용 가능
11. 공유 메모리 방법
- 협력 프로세스가 동일한 변수를 사용
- 동일한 변수 : 공유자원인 메모리 공간 사용
- 해당 예시
- 생산자 - 소비자 문제의 유한 버퍼
- 판독기 - 기록기 문제의 공유 자원
- 대량 데이터 교환하기에 편리
- 고속 통신 가능
- 통신상 발생 가능 문제 해결
- 응용 프로그래머
12. 메세지 전달 방법
- 협력 프로세스가 메세지를 주고 받음
- 시스템 호출 send( ), receive( )
- ex ) 프로세스 A에서 send(M)를 통해 메세지 전달 → 커널 → receive(M)을 통해 프로세스 B에서 메세지 받음
- 소량 데이터 교환에 적합
- 통신상 발생 가능 문제 해결
- 운영체제
13. 메시지 전달 방법의 논리적 구조
- 통신 링크
- 메시지가 지나다니는 통로
- ex ) 프로세스A ← 통신 링크 → 프로세스B
- 통신 링크의 구현 형태
- 연결 대상
- 두 프로세스인지, 셋 이상 프로세스인지
- 두 프로세스 사이 링크 개수
- 하나? 둘 이상?
- 방향성
- 단방향? 양방향?
- 용량
- 무한? 유한? 0?
- 연결 대상
14. 통신 링크의 용량
- 무한 ( 큐의 크기가 무한 )
- 송신자는 대기 없음
- 유한 ( 큐의 크기가 유한 )
- 송신자는 큐가 가득 차면 대기
- 0 ( 큐가 없음 )
- 큐가 없기에 송신자가 보내면 수신자가 바로 받아야 한다.
- 송신자는 수신자가 메시지를 받을 수 있을 때까지 대기
15. 직접 통신
- 두 프로세스가 직접 서로를 지정하여 메세지 전달
- send와 receive 함수에서 직접 상대방을 지정
- 오직 하나의 통신 링크가 자동 설정
- 하나의 통신 링크는 오직 두 프로세스 사이에만 연관
- 통신 링크는 양방향
- 종류
- 대칭형 주소 지정
- send와 receive 함수에서 직접 상대방을 지정
- 비대칭형 주소 지정
- send에서는 상대방을 지정하지만, receive에서는 상대방을 지정하지 X
- 수신자가 여러 송신자와 통신 링크를 갖는 경우 사용
- 대칭형 주소 지정
16. 간접 통신
- 프로세스 사이에 둔 우편함을 통해 메세지 전달
- 같은 우편함을 이용하는 경우 통신 링크가 설정
- 여러 우편함을 이용하면 여러 개의 통신 링크 존재
- 하나의 통신 링크가 여러 프로세스와 연관 가능
- 통신 링크는 단방향 또는 양방향
- 구분
- 우편함이 수신 프로세스에 소속
- 수신자 하나
- 통신 링크는 단방향
- 수신 프로세스가 종료하면 우편함도 사라짐
- 우현함이 운영체제에 소속 ( 독립된 우편함 )
- 수신자 여럿
- 한순간에 하나의 수신자만 가능
- 운영체제가 수신자 관리
- 통신 링크는 양방향
- 우편함이 수신 프로세스에 소속
728x90
'방송대 > 운영체제' 카테고리의 다른 글
7강. 교착상태(2) (0) | 2025.04.07 |
---|---|
6강. 교착상태 (1) (0) | 2025.03.25 |
4강. 병행 프로세스의 개요 (0) | 2025.03.10 |
3강. 프로세스 스케줄링 (0) | 2025.03.03 |
2강. 프로세스와 스레드 (0) | 2025.02.18 |
댓글