티스토리 뷰

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
댓글
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
최근에 올라온 글
Total
Today
Yesterday
공지사항