[CS/운영체제] 멀티스레드와 동시성 - 12부

황제연·2025년 7월 5일
0

CS학습

목록 보기
126/193
post-thumbnail

생산자 소비자 문제 - 분석

생산자 스레드와 소비자 스레드가 각각 존재하고, 버퍼 역할을 해줄 큐가 존재한다고 가정해보겠습니다
이때, 버퍼 큐는 임계영역에 존재하며, 임게영역에 들어온 순간 락을 획득합니다

문제상황과 대안

큐가 가득찼을 때 - 생산자 스레드

버퍼 큐가 가득찼을 때, 생산자 스레드가 버퍼 큐에 데이터를 저장한다면 해당 데이터는 버려집니다
이를 막기 위해 데이터를 버리지 않는 대안으로
큐에 빈 공간이 생길 때까지 생산자 스레드가 기다립니다

큐가 비었을 때 - 소비자 스레드

이번에는 역으로 버퍼 큐가 비었을 때,
소비자 스레드가 아무것도 얻을 수 없고 null이 반환된다면 큐에 데이터가 추가될 때까지
소비자 스레드가 기다립니다

대안의 문제점

위와같은 대안은 스레드 대부분이 BLOCKING 상태가 되어버리는 문제가 발생합니다

생산자 스레드나 소비자 스레드가 큐에 접근하려고 했으나 가득차거나 비어있어서
대기해야하는 상황이라고 한다면,
일정시간마다 큐의 상태를 확인하는 TIMED_WAITING 상태가 될 수 있습니다
큐를 확인하기 위해서는 락을 획득하고 임계영역에 들어와서 큐에 들어가서 락을 반납하기 전까지
대기하고 있어야 하는데,
문제는 이러한 상황일 때 다른 스레드가 접근한다면
락이 존재하지 않아 스레드들은 BLOCKED 상태가 됩니다

이것은 무한 대기 문제를 발생시킵니다
처음 들어가서 락을 획득하고 대기중인 스레드 때문에
다른 스레드들이 임계영역 안에 접근조차 할 수 없고 무한대기하는 문제가 발생합니다

해결방법은?

이 문제를 해결하는 방법은 락을 가지고 대기하는 스레드가 다른 스레드에게 락을 양보한다면
쉽게 해결할 수 있습니다

그리고 자바에서는 Object.wait()과 Object.notify()를 사용해서 락을 갖고 대기하는 스레드가
대기하는 동안 다른 스레드에게 락을 양보할 수 있습니다

참고

  • 김영한의 실전 자바 - 고급 1편
profile
Software Developer

0개의 댓글