목차
• 실습 목표
• 모니터의 정의
• 자바 모니터
동기화 방법 - <메서드 단위의 예>
⑴ Producer and Consumer 문제 실습
* 문제분석
* 문제해결책
* 문제실습
⑵ Readers and Writers
* 문제분석
* 문제해결책
* 문제실습
⁃ 실습결과 분석
• 모니터의 정의
• 자바 모니터
동기화 방법 - <메서드 단위의 예>
⑴ 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로 설정하고, 조건변수로 문제를 풀어나가는 과정이 아주 어렵지는 않았고, 의미있는 시간이었다.
병렬구조라는 생각 자체는 쉽지만, 병렬구조를 구현하는데 수반되는 어려움을 다시금 확인하는 시간이 되었다.
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로 설정하고, 조건변수로 문제를 풀어나가는 과정이 아주 어렵지는 않았고, 의미있는 시간이었다.
병렬구조라는 생각 자체는 쉽지만, 병렬구조를 구현하는데 수반되는 어려움을 다시금 확인하는 시간이 되었다.
추천자료
- 낙천/낙석운동에 대하여
- 수술후 환자간호
- 대구참여연대 견학 보고서
- 얼굴없는 미녀 감상문
- 행정학영어강독
- 응급실 실습후기
- 사회복지실천의 과정
- [재무회계, 재무회계 기준, 재무회계 목적, 재무회계 체계, 재무회계 순환과정, 관리회계]재...
- [전자금융거래]전자금융거래(홈뱅킹)의 발달배경, 발달단계, 전자금융거래(홈뱅킹)의 이용현...
- [시청자권익, 시청자권익 보호제도, 시청자권익 법조항, 시청자권익 국가별 사례, 시청자권익...
- 유엔인권(UN인권, 국제연합인권) 기구(기관), 유엔인권(UN인권, 국제연합인권) 조약, 유엔인...
- 의학 - 신경계 구조와 기능, 진단검사에 관해 (신경계의 구성세포, 중추 신경계, 말초신경계,...
- 사우디아라비아(Saudi Arabia)의 역사,정치,경제 분석,한국과의 관계
소개글