본문 바로가기
혼자 공부하는 것들/운영체제

[운영체제]Producer/Consumer 실습 - 2 상호배제

by applepick 2020. 10. 2.
반응형

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를 호출할수있도록 해야한다. 그렇지 않으면 데드락이 걸리기때문이다.

 

반응형

댓글