[운영체제] Producer - Consumer (생성자 - 소비자) 문제 in jAVA
2021. 4. 27. 22:05
Producer - Consumer (생성자 - 소비자) 문제 in jAVA
- 생성자 소비자 문제는 운영체제에서 프로세스 동기화를 설명 하는 모델이다
- 동기화는 공유 자원에 대해서 충돌없이 사용하게끔 만드는 작업이다.
- 자바의 쓰레드를 이용해서 이 문제를 발생시켜 보았다.
public class ProducerConsumer {
static int count =0; // 공유변수
public static void main(String[] args) throws Exception{
Thread t1 = new Thread(new producer()); //생성자 쓰레드
Thread t2 = new Thread(new consumer()); //소비자 쓰레드
t1.start();
t2.start();
System.out.println(ProducerConsumer.count);
}
static class producer implements Runnable{
@Override
public void run() {
for(int i=0; i<10000;i++) {
count++; //공유변수를 1씩 증가
}
}
}
static class consumer implements Runnable{
@Override
public void run() {
for(int i=0; i<10000;i++) {
count++; //공유 변수를 1씩 감소
}
}
}
}
- 위와 같은 프로그램을 작동시킨다면 producer 쓰레드와 consumer쓰레드 각각 공유 변수 count를 대상으로 계산이 시작될 것이다.
- 상식적으로 producer와 consumer에서 각각 10000번씩 반복문이 돌았으니 count는 0이 되어야 한다.
하지만 이처럼 터무니 없는 count값이 출력이 되는데 이것이 바로 데이터의 일관성이 깨진 경우이다.
한 순간 count의 값이 동시에 변화하게 된 경우에 데이터의 수정이 제대로 이루어지지 않아 발생하게 된다.
- 자바 프로그램을 짜다보면 이런식으로 Thread가 동시에 돌아가는 경우를 심심치 않게 찾아볼 수 있으니 항상 동기화를 염두에 둔 코드를 작성해야 한다.
- 생성자 소비자 문제를 해결하기 위해 세마포어나 모니터기능을 사용하기도 하는데 이에 대해서는 추후에 포스팅 하겠다.
'CS > 운영체제' 카테고리의 다른 글
Process & Thread (0) | 2021.10.19 |
---|---|
컴퓨터 시스템의 구조 (0) | 2021.10.14 |
운영체제 개요 (0) | 2021.10.13 |
[운영체제] 데드락(deadlock, 교착상태) (0) | 2021.05.19 |
[운영체제] 뮤텍스, 세마포어 (0) | 2021.05.12 |