■ 문제 정의

생산자 / 소비자 문제를 Hoare의 Monitor와 같이 객체를 사용하여 구현하시오

 



■ 문제 해결

1. 개발 환경

  - 객체 지향 프로그래밍 언어인 Java 5.0 Version을 사용하여 구현한다.


2. Monitor의 특징

  - Monitor는 class와 유사하다.

  - 내부 자료 자장소와 외부 인터페이스를 위한 함수들로 구성된다.

  - 외부 프로세스나 스레드의 모니터 함수 호출에 의한 모니터 진입은 한 프로세스로 제한되어 상호 배제를 보장해야 한다.

  - 내부 동기화 도구로서 wait과 signal이 사용된다.

  - wait과 signal은 pthread의 condition 개념과 동일하다.


3. Producer / Consumer Modeling

사용자 삽입 이미지


  - Producer

    • 생산자 Thread 역할을 담당한다.

    • Data의 add 메소드를 호출하여 데이터를 추가한다.


  - Consumer

    • 소비자 Thread 역할을 담당한다.

    • Data의 remove 메소드를 호출하여 데이터를 얻어온다.

  - Data : Monitor 역할을 한다. 내부적으로 Java에서 지원하는 Linked List 자료구조를 갖고 있으며 최대 100개의 데이터를 갖을 수 있다. 한 번에 하나의 Process만 Data를 사용할 수 있도록 동기화 되어 있다.


  - Producer와 Consumer는 공통으로 Data 객체를 공유한다.


4. critical section 문제 해결

사용자 삽입 이미지
 - 기존의 Monitor가 아닌 해결 방법에서는 Producer 문제를 해결하기 위해서 각각 producer와 consumer thread에서 동기화 코드와 condition signal 코드를 사용했었다.

  - Monitor 문제에서는 Producer와 Consumer Thread는 단지 Data 객체의 add와 remove 객체만 호출한다.

  - 다소 지저분해 보이고 신경써야 하는 동기화 코드는 Data Monitor 안에서 구현해서 Application에서는 신경쓰지 않도록 구현해 놓았다.


5. Java에서 사용한 동기화 코드

  - synchronized(this)

    • Data 객체를 통체로 통기화 시킨다.

    • 한번에 하나의 Thread만이 Data 객체를 건드릴 수 있다.

  - wait()

    • 동기화 블록 내에서만 사용할 수 있으며, Thread가 wait을 호출하면 그 때까지 자신이 객체에 걸어 놓았던 모든 lock을 풀고, wait()이 호출된 객체의 대기실(waiting pool)에서 기다리게 된다.

    • 그러다가 다른 Thread에 의해서 그 객체에 대해 notify()를 호출하면 객체의 대기실을 벗어나서 다시 실행대기상태, 즉 객체의 waiting queue를 벗어나 실행대기 열에서 자신이 실행될 차례를 기다리는 상태가 된다.

  - notify()

    • 객체의 waiting queue에 있는 Thread 중의 하나만을 깨운다.

  - notifyAll()

    • waiting queue에 있는 모든 Thread를 깨운다.


6. Thread의 소멸

  - Java의 Thread는 run() method안의 내용을 수행한 후에 자동으로 소멸된다.



■ 소  스

import java.util.LinkedList;

import java.util.List;


/**

 * Data Monitor를 정의합니다.

 */

public class Data {

        // 내부적인 자료구조는 Linked List 사용

        private List<Integer> data;

        private static int MAX = 100;

       

        public Data() {

                data = new LinkedList<Integer>();

        }

       

        /**

         * Data를 추가한다.

         * @param value 추가할 Data

         */

        public void add(int value) {

                synchronized(this) {

                        try {

                                // 삽입하기 전에 Linked List가 꽉 찼으면 기다린다.

                                while(data.size() == MAX)

                                        wait();

                        }

                        catch(InterruptedException e) { }

                       

                        // data를 추가한다.

                        data.add(value);

                       

                        // wait한 Thread를 깨워준다. (stack되지 않는다.)

                        notifyAll();


                        System.out.printf("Producer add Data(%03d) - count(%03d)\n", value, data.size());

                }

        }

       

        /**

         * Data를 소비한다.

         * @return 소비한 Data

         */

        public synchronized int remove() {

                int value = 0;

                synchronized(this) {

                        try {

                                // 소비하기 전에 Linked List가 비었으면 기다린다.

                                while(data.size() == 0)

                                        wait();

                        }

                        catch(InterruptedException e) { }


                        // data를 하나 소비한다.

                        value = data.remove(0);

                       

                        // wait한 Thread를 깨워준다. (stack되지 않는다.)

                        notifyAll();

                       

                        System.out.printf("Consumer remove Data(%03d) - count(%03d)\n", value, data.size());

                }

                return value;

        }

       

        public static void main(String[] args) {

                Data data = new Data();

                Producer producer = new Producer(data);

                Consumer consumer = new Consumer(data);

               

                producer.start();

                consumer.start();

        }

}



/**

 * Producer Thread를 정의한다.

 */

class Producer implements Runnable {

        private Data data;

        private Thread producerThread;

        public Producer(Data sharedData) {

                data = sharedData;

                producerThread = new Thread(this);

        }

       

        public void start() {

                producerThread.start();

        }

       

        /**

         * data에 1000개의 data를 생산한다.

         */

        public void run() {

                for(int i=0 ; i<1000 ; i++)

                        data.add(i);

        }

}



/**

 * Consumer Thread를 정의한다.

 */

class Consumer implements Runnable {

        private Data data;

        private Thread consumerThread;

        public Consumer(Data sharedData) {

                data = sharedData;

                consumerThread = new Thread(this);

        }

       

        public void start() {

                consumerThread.start();

        }

       

        /**

         * data에 1000개의 data를 소비한다.

         */

        public void run() {

                for(int i=0 ; i<1000 ; i++)

                        data.remove();

        }

}



■ 결과화면

~ ~ ~ ~ ~ 중략 ~ ~ ~ ~ ~ ~

Consumer remove Data(842) - count(006)

Consumer remove Data(843) - count(005)

Consumer remove Data(844) - count(004)

Consumer remove Data(845) - count(003)

Consumer remove Data(846) - count(002)

Consumer remove Data(847) - count(001)

Consumer remove Data(848) - count(000)

Producer add Data(849) - count(001)

Producer add Data(850) - count(002)

Producer add Data(851) - count(003)

Producer add Data(852) - count(004)

Producer add Data(853) - count(005)

Producer add Data(854) - count(006)

Producer add Data(855) - count(007)

Producer add Data(856) - count(008)

Producer add Data(857) - count(009)

Producer add Data(858) - count(010)

Producer add Data(859) - count(011)

Producer add Data(860) - count(012)

Producer add Data(861) - count(013)

Producer add Data(862) - count(014)

Producer add Data(863) - count(015)

Producer add Data(864) - count(016)

Producer add Data(865) - count(017)

Producer add Data(866) - count(018)

Producer add Data(867) - count(019)

Producer add Data(868) - count(020)

Producer add Data(869) - count(021)

Producer add Data(870) - count(022)

Producer add Data(871) - count(023)

Producer add Data(872) - count(024)

Producer add Data(873) - count(025)

Producer add Data(874) - count(026)

Producer add Data(875) - count(027)

Producer add Data(876) - count(028)

Producer add Data(877) - count(029)

Producer add Data(878) - count(030)

Producer add Data(879) - count(031)

Producer add Data(880) - count(032)

Producer add Data(881) - count(033)

Producer add Data(882) - count(034)

Producer add Data(883) - count(035)

Producer add Data(884) - count(036)

Producer add Data(885) - count(037)

Producer add Data(886) - count(038)

Producer add Data(887) - count(039)

Producer add Data(888) - count(040)

Producer add Data(889) - count(041)

Producer add Data(890) - count(042)

Producer add Data(891) - count(043)

Producer add Data(892) - count(044)

Producer add Data(893) - count(045)

Producer add Data(894) - count(046)

Producer add Data(895) - count(047)

Producer add Data(896) - count(048)

Consumer remove Data(849) - count(047)

Producer add Data(897) - count(048)

Producer add Data(898) - count(049)

Producer add Data(899) - count(050)

Producer add Data(900) - count(051)

Producer add Data(901) - count(052)

Producer add Data(902) - count(053)

Producer add Data(903) - count(054)

Producer add Data(904) - count(055)

Producer add Data(905) - count(056)

Consumer remove Data(850) - count(055)

Consumer remove Data(851) - count(054)

Consumer remove Data(852) - count(053)

Consumer remove Data(853) - count(052)

Consumer remove Data(854) - count(051)

Consumer remove Data(855) - count(050)

Consumer remove Data(856) - count(049)

Consumer remove Data(857) - count(048)

Consumer remove Data(858) - count(047)

Consumer remove Data(859) - count(046)

Consumer remove Data(860) - count(045)

Consumer remove Data(861) - count(044)

Consumer remove Data(862) - count(043)

Consumer remove Data(863) - count(042)

Consumer remove Data(864) - count(041)

Consumer remove Data(865) - count(040)

Consumer remove Data(866) - count(039)

Consumer remove Data(867) - count(038)

Consumer remove Data(868) - count(037)

Consumer remove Data(869) - count(036)

Consumer remove Data(870) - count(035)

Consumer remove Data(871) - count(034)

Consumer remove Data(872) - count(033)

Consumer remove Data(873) - count(032)

Consumer remove Data(874) - count(031)

Consumer remove Data(875) - count(030)

Consumer remove Data(876) - count(029)

Consumer remove Data(877) - count(028)

Consumer remove Data(878) - count(027)

Consumer remove Data(879) - count(026)

Consumer remove Data(880) - count(025)

Consumer remove Data(881) - count(024)

Consumer remove Data(882) - count(023)

Consumer remove Data(883) - count(022)

Consumer remove Data(884) - count(021)

Consumer remove Data(885) - count(020)

Consumer remove Data(886) - count(019)

Consumer remove Data(887) - count(018)

Consumer remove Data(888) - count(017)

Consumer remove Data(889) - count(016)

Consumer remove Data(890) - count(015)

Consumer remove Data(891) - count(014)

Consumer remove Data(892) - count(013)

Consumer remove Data(893) - count(012)

Consumer remove Data(894) - count(011)

Consumer remove Data(895) - count(010)

Consumer remove Data(896) - count(009)

Consumer remove Data(897) - count(008)

Consumer remove Data(898) - count(007)

Consumer remove Data(899) - count(006)

Consumer remove Data(900) - count(005)

Consumer remove Data(901) - count(004)

Consumer remove Data(902) - count(003)

Consumer remove Data(903) - count(002)

Consumer remove Data(904) - count(001)

Consumer remove Data(905) - count(000)

Producer add Data(906) - count(001)

Producer add Data(907) - count(002)

Producer add Data(908) - count(003)

Producer add Data(909) - count(004)

Producer add Data(910) - count(005)

Producer add Data(911) - count(006)

Producer add Data(912) - count(007)

Producer add Data(913) - count(008)

Producer add Data(914) - count(009)

Producer add Data(915) - count(010)

Producer add Data(916) - count(011)

Producer add Data(917) - count(012)

Producer add Data(918) - count(013)

Producer add Data(919) - count(014)

Producer add Data(920) - count(015)

Producer add Data(921) - count(016)

Producer add Data(922) - count(017)

Producer add Data(923) - count(018)

Producer add Data(924) - count(019)

Producer add Data(925) - count(020)

Producer add Data(926) - count(021)

Producer add Data(927) - count(022)

Producer add Data(928) - count(023)

Producer add Data(929) - count(024)

Producer add Data(930) - count(025)

Producer add Data(931) - count(026)

Producer add Data(932) - count(027)

Producer add Data(933) - count(028)

Producer add Data(934) - count(029)

Producer add Data(935) - count(030)

Producer add Data(936) - count(031)

Producer add Data(937) - count(032)

Producer add Data(938) - count(033)

Producer add Data(939) - count(034)

Producer add Data(940) - count(035)

Producer add Data(941) - count(036)

Producer add Data(942) - count(037)

Producer add Data(943) - count(038)

Producer add Data(944) - count(039)

Producer add Data(945) - count(040)

Producer add Data(946) - count(041)

Producer add Data(947) - count(042)

Producer add Data(948) - count(043)

Producer add Data(949) - count(044)

Producer add Data(950) - count(045)

Producer add Data(951) - count(046)

Producer add Data(952) - count(047)

Producer add Data(953) - count(048)

Producer add Data(954) - count(049)

Producer add Data(955) - count(050)

Producer add Data(956) - count(051)

Producer add Data(957) - count(052)

Producer add Data(958) - count(053)

Producer add Data(959) - count(054)

Producer add Data(960) - count(055)

Producer add Data(961) - count(056)

Producer add Data(962) - count(057)

Producer add Data(963) - count(058)

Producer add Data(964) - count(059)

Producer add Data(965) - count(060)

Producer add Data(966) - count(061)

Producer add Data(967) - count(062)

Producer add Data(968) - count(063)

Producer add Data(969) - count(064)

Producer add Data(970) - count(065)

Producer add Data(971) - count(066)

Producer add Data(972) - count(067)

Producer add Data(973) - count(068)

Producer add Data(974) - count(069)

Producer add Data(975) - count(070)

Producer add Data(976) - count(071)

Producer add Data(977) - count(072)

Producer add Data(978) - count(073)

Producer add Data(979) - count(074)

Producer add Data(980) - count(075)

Producer add Data(981) - count(076)

Producer add Data(982) - count(077)

Producer add Data(983) - count(078)

Producer add Data(984) - count(079)

Producer add Data(985) - count(080)

Producer add Data(986) - count(081)

Producer add Data(987) - count(082)

Producer add Data(988) - count(083)

Producer add Data(989) - count(084)

Producer add Data(990) - count(085)

Producer add Data(991) - count(086)

Producer add Data(992) - count(087)

Producer add Data(993) - count(088)

Producer add Data(994) - count(089)

Producer add Data(995) - count(090)

Consumer remove Data(906) - count(089)

Consumer remove Data(907) - count(088)

Consumer remove Data(908) - count(087)

Consumer remove Data(909) - count(086)

Consumer remove Data(910) - count(085)

Consumer remove Data(911) - count(084)

Consumer remove Data(912) - count(083)

Consumer remove Data(913) - count(082)

Consumer remove Data(914) - count(081)

Consumer remove Data(915) - count(080)

Consumer remove Data(916) - count(079)

Consumer remove Data(917) - count(078)

Consumer remove Data(918) - count(077)

Consumer remove Data(919) - count(076)

Consumer remove Data(920) - count(075)

Consumer remove Data(921) - count(074)

Consumer remove Data(922) - count(073)

Consumer remove Data(923) - count(072)

Consumer remove Data(924) - count(071)

Consumer remove Data(925) - count(070)

Consumer remove Data(926) - count(069)

Consumer remove Data(927) - count(068)

Consumer remove Data(928) - count(067)

Consumer remove Data(929) - count(066)

Consumer remove Data(930) - count(065)

Consumer remove Data(931) - count(064)

Consumer remove Data(932) - count(063)

Consumer remove Data(933) - count(062)

Consumer remove Data(934) - count(061)

Consumer remove Data(935) - count(060)

Consumer remove Data(936) - count(059)

Consumer remove Data(937) - count(058)

Consumer remove Data(938) - count(057)

Consumer remove Data(939) - count(056)

Consumer remove Data(940) - count(055)

Consumer remove Data(941) - count(054)

Consumer remove Data(942) - count(053)

Consumer remove Data(943) - count(052)

Consumer remove Data(944) - count(051)

Consumer remove Data(945) - count(050)

Consumer remove Data(946) - count(049)

Consumer remove Data(947) - count(048)

Consumer remove Data(948) - count(047)

Consumer remove Data(949) - count(046)

Consumer remove Data(950) - count(045)

Consumer remove Data(951) - count(044)

Consumer remove Data(952) - count(043)

Consumer remove Data(953) - count(042)

Consumer remove Data(954) - count(041)

Consumer remove Data(955) - count(040)

Consumer remove Data(956) - count(039)

Consumer remove Data(957) - count(038)

Consumer remove Data(958) - count(037)

Consumer remove Data(959) - count(036)

Consumer remove Data(960) - count(035)

Consumer remove Data(961) - count(034)

Consumer remove Data(962) - count(033)

Consumer remove Data(963) - count(032)

Consumer remove Data(964) - count(031)

Consumer remove Data(965) - count(030)

Consumer remove Data(966) - count(029)

Consumer remove Data(967) - count(028)

Consumer remove Data(968) - count(027)

Consumer remove Data(969) - count(026)

Consumer remove Data(970) - count(025)

Consumer remove Data(971) - count(024)

Consumer remove Data(972) - count(023)

Consumer remove Data(973) - count(022)

Consumer remove Data(974) - count(021)

Consumer remove Data(975) - count(020)

Consumer remove Data(976) - count(019)

Consumer remove Data(977) - count(018)

Consumer remove Data(978) - count(017)

Consumer remove Data(979) - count(016)

Consumer remove Data(980) - count(015)

Consumer remove Data(981) - count(014)

Consumer remove Data(982) - count(013)

Consumer remove Data(983) - count(012)

Consumer remove Data(984) - count(011)

Consumer remove Data(985) - count(010)

Consumer remove Data(986) - count(009)

Consumer remove Data(987) - count(008)

Consumer remove Data(988) - count(007)

Consumer remove Data(989) - count(006)

Consumer remove Data(990) - count(005)

Consumer remove Data(991) - count(004)

Consumer remove Data(992) - count(003)

Consumer remove Data(993) - count(002)

Consumer remove Data(994) - count(001)

Consumer remove Data(995) - count(000)

Producer add Data(996) - count(001)

Producer add Data(997) - count(002)

Producer add Data(998) - count(003)

Producer add Data(999) - count(004)

Consumer remove Data(996) - count(003)

Consumer remove Data(997) - count(002)

Consumer remove Data(998) - count(001)

Consumer remove Data(999) - count(000)

« PREV : 1 : ... 151 : 152 : 153 : 154 : 155 : 156 : 157 : 158 : 159 : ... 276 : NEXT »