[운영체제 실습보고서] 모니터(Monitor) 구현
본 자료는 4페이지 의 미리보기를 제공합니다. 이미지를 클릭하여 주세요.
닫기
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
해당 자료는 4페이지 까지만 미리보기를 제공합니다.
4페이지 이후부터 다운로드 후 확인할 수 있습니다.

소개글

[운영체제 실습보고서] 모니터(Monitor) 구현에 대한 보고서 자료입니다.

목차

• 실습 목표
• 모니터의 정의
• 자바 모니터
동기화 방법 - <메서드 단위의 예>
⑴ Producer and Consumer 문제 실습
* 문제분석
* 문제해결책
* 문제실습
⑵ Readers and Writers
* 문제분석
* 문제해결책
* 문제실습
⁃ 실습결과 분석

본문내용

y = null; // 객체의 생성
private static final int
THINKING = 0, HUNGRY = 1, STARVING = 2, EATING = 3;
//상태별로 번호를 먹임
public DiningServer(int numPhils, boolean checkStarving) {
//생성자 호출
name = "DiningServer";
this.numPhils = numPhils;
this.checkStarving = checkStarving;
state = new int[numPhils];
for (int i = 0; i < numPhils; i++) state[i] = THINKING;
convey = new Object[numPhils];
for (int i = 0; i < numPhils; i++) convey[i] = new Object();
System.out.println("DiningServer: checkStarving="
+ checkStarving);
}
//i의 왼쪽과 오른쪽 철학자
private final int left(int i) { return (numPhils + i-1) % numPhils; }
private final int right(int i) { return (i+1) % numPhils; }
public void takeForks(int i) { // 포크를 집는 메서드
synchronized (convey[i]) {
// 포크를 집는 동안 다른 쓰레드는 포크를 집을 수 없다.
if (hungryAndGetForks(i)) return;
// 만약 철학자가 배고프고 포크를 집을 수 있다면 종료
else while (true) // 아니면 대기한다.
try { convey[i].wait(); break; }
// notify() after interrupt() race condition ignored
catch (InterruptedException e) { continue; }
}
}
public synchronized void putForks(int i) {
// 포크를 내려놓는 메서드
state[i] = THINKING;
// 포크를 내려놓으면, 생각하는 상태가 된다.
test(left(i), checkStarving); // 왼쪽철학자가 굶었는지
test(right(i), checkStarving); // 오른쪽 철학자가 굶었는지 검사
if (state[left(i)] == EATING)
// 만약 왼쪽철학자가 먹지 않는다면
forksAvailable(left(i)); // 좌측 포크는 이용가능 하다
if (state[right(i)] == EATING)
// 만약 오른쪽 철학자가 먹지 않는다면
forksAvailable(right(i)); // 우측 포크는 이용가능하다
}
private synchronized boolean hungryAndGetForks(int i) {
state[i] = HUNGRY; // 배고픈 상태라면
test(i, false);
return state[i] == EATING;
private void forksAvailable(int i) { //포크를 이용가능하면
synchronized (convey[i]) {
convey[i].notify(); // 쓰레드 깨움
}
}
private void test(int k, boolean checkStarving) {
if (state[left(k)] != EATING && state[left(k)] != STARVING && (state[k] == HUNGRY || state[k] == STARVING) &&
state[right(k)] != STARVING && state[right(k)] != EATING)
// 왼쪽 철학자는 먹지 않고 있고, 굶지 않아야 하며 우측 철학자는 굶지 않고
// 먹지 않고 있으면
state[k] = EATING; //k번 철학자가 먹는다
else if (checkStarving) //굶고 있으면
seeIfStarving(k);
// simplistic naive check for starvation
}
private void seeIfStarving(int k) {
if (state[k] == HUNGRY && state[left(k)] != STARVING &&
state[right(k)] != STARVING) {
// 철학자 k가 배가 고프고 있고, 철학자의 왼쪽과 오른쪽이 굶고 있지 안다면.
state[k] = STARVING; // 철학자 k는 굶는다
System.out.println(" philosopher " + k + " is STARVING!");
}
}
}

실습결과 분석
초기의 상태는 Think 상태이다.
()
Eating후에는 Thinking 상태로 변한다.
()
Eating후에는 Thinking 상태로 변한다.
()
동시에 Eating을 하는 경우라면, 양옆의 철학자와는 같이 먹지 않는다.
->Deadlock 발생
()
철학자 3은 양옆의 철학자인 2나 4와는 동시에 먹지 않는다.
-> 서로 같은 젓가락을 원하기 때문에
-> Deadlock 발생
()
철학자 2도 마찬가지로 3이나 1과는 동시에 먹지 않는다.
()
실습 소감
자바언어로 고급 동기화의 한 방법인 모니터를 구현하여 보았다.
이번 실습을 통해 모니터라는 개념을 확실히 잡았다. 모니터라는 개념과 자바라는 언어를 자주 접해 보지 못해서 굉장히 생소했다.
하지만 모니터가 세마포랑 크게 차이가 없고, 자바라는 언어에서는 쓰레드에 대한 메서드의 지원과
동기화를 위한 synchronized 키워드, wait(), notify(), notifyAll()이 지원 잘 되어있어서 클래스나 메서드 내에서 임계구역 synchronized로 설정하고, 조건변수로 문제를 풀어나가는 과정이 아주 어렵지는 않았고, 의미있는 시간이었다.
병렬구조라는 생각 자체는 쉽지만, 병렬구조를 구현하는데 수반되는 어려움을 다시금 확인하는 시간이 되었다.
  • 가격3,000
  • 페이지수12페이지
  • 등록일2015.07.21
  • 저작시기2007.6
  • 파일형식한글(hwp)
  • 자료번호#977229
본 자료는 최근 2주간 다운받은 회원이 없습니다.
청소해
다운로드 장바구니