반응형
java에서의 동기화 문제를 해결해보자!
코드를 분석해보자
public class ProducerConsumer {
static final int N = 100;
static producer p = new producer();
static consumer c = new consumer();
static our_monitor mon = new our_monitor();
public static void main(String args[]) {
p.start();
c.start();
}
static class producer extends Thread {
public void run() {
int item;
while (true) {
item = produce_item();
mon.insert(item);
}
}
}
static class consumer extends Thread {
public void run() {
int item;
while (true) {
item = mon.remove();
consume_item(item);
}
}
}
static class our_monitor {
private int buffer[] = new int[N];
private int count = 0, lo = 0, hi = 0;
public synchronized void insert(int val) {
if (count == N) go_to_sleep();
buffer[hi] = val;
hi = (hi + 1) % N;
count = count + 1;
if (count == 1) notify();
}
public synchronized int remove() {
int val;
if (count == 0) go_to_sleep();
val = buffer[lo];
lo = (lo + 1) % N;
count = count - 1;
if (count == N - 1) notify();
return val;
}
private void go_to_sleep() {
try {
wait();
} catch(InterruptedException e) {} ;
}
}
}
1. 버퍼의 크기는 얼마인가?
- 100이다.
2. 몇 개의 스레드가 동작하며, 각 스레드는 코드의 어느 부분을 수행하는가?
- 2개이다. 컨슈머, 프로듀스 클래스에 run()메소드이다.
3. 생산자가 생산하는 item은 무엇인가? 소비자는 이들 item을 올바르게 전달받고 있는가?
- 숫자이다. 0에서부터 무한대까지, 동기화와 상호배제가 필요하다. 전달받고있다.
4. 화면에 출력은 누가(생산자/소비자) 하며, 어떤 내용인가?
- 소비자가 출력한다.
5. 생산자/소비자 사이에 상호 배제가 필요한 부분은 무엇이며, 어떤 코드가 이를 실현하고 있는가?
- cont이다. synchronized 부분입니다.
6. 생산자/소비자 사이의 Sleep/Wakeup 동기화는 어떤 구문을 통해 일어나는가?
- sleep은 go_to_sleep();은 wait()함수를 호출하고, wakeup은 notify();를 사용한다.
7. 생산자(또는 소비자)를 담당하는 스레드가 insert() 안에 있는 wait()에서 잠들게 되었을 때, 소비자(또는 생산자)를 담당하는 스레드의 remove() 진행을 (synchronized method 임에도 불구하고) 허용해야 하는가? 그 이유는 무엇인가?
- go_to_sleep()으로 인해 잠이든다. 또다른 쓰레드가 synchronized method를 호출할수있도록 해야한다. 그렇지 않으면 데드락이 걸리기때문이다.
반응형
'혼자 공부하는 것들 > 운영체제' 카테고리의 다른 글
[운영체제] RR(Round-Robin)라운드 로빈, Priority Scheduling +(실습 Round-Robin, Priority c++ 코드 제공) (0) | 2020.10.04 |
---|---|
Web Server 실습 +Dispatcher 사용 (6) | 2020.10.02 |
[운영체제]Producer/Consumer 실습 + 세마포어 변수 사용 (0) | 2020.10.02 |
[운영체제] Race Condition, Mutual Exclusive(상호배제) 실습 (2) | 2020.10.02 |
[운영체제] 스레드(Thread) + 실습을 통해 직접 깨우치기! 프로세스와의 차이점? (2) | 2020.09.28 |
댓글