서론
이번 글에서는 멀티 스레드 환경에서 자주 사용하는 생산자 소비자 패턴에 대해 알아보려한다. 바로 한번 알아보자.
Producer-Consumer Pattern이란?
생산자 소비자 패턴은 작업 목록을 가운데 두고 작업을 생산해내는 주체와 작업을 처리하는 주체를 분리시키는 설계 방법을 말한다. 이 말이 지금은 당장 와닿지 않을 수 있다. 그러나 멀티 스레드를 구성해야하는 상황이라면 해당 내용은 필히 이해하고 구성하기를 권장한다.
이렇게 작업을 '생성'하는 부분과 '처리'하는 부분이 각각 감당할 수 있는 부하를 조절할 수 있다는 장점이 있다. 여기서 Producer는 작업을 새로 만들어 큐에 쌓아두고, Consumer는 (블락킹)큐에 쌓여 있는 작업을 가져다 처리하는 구조이다.
Producer는 디스크I/O, 네트워크 작업을 하고
Consumer는 CPU작업을 주로 하는 스레드일 경우 성능을 크게 높을 수 있다는 특징이 있다.
BlockingQueue는 무엇인가?
Consumer가 감당할 수 있는 것보다 많은 양의 작업을 만들어 내면 큐에는 계속해서 작업이 누적되는데, 결국에는 그 이슈가 메모리 오류를 일으키게 된다. 하지만, 큐의 크기에 제한을 두면 큐에 빈 공간이 생길 때 까지 작업을 추가하지 않고 대기 하도록 구현하여 메모리 오류를 막을 수 있다.
또한, 큐에 작업이 없을 경우에는 Consumer가 큐의 작업이 추가 될 때 까지 대기하여, 불 필요한 연산을 하지 않도록 구현한다. 바로 이 역할을 하는 것이 BlockingQueue이다.
이 BlockingQueue는 결국 Producer가 작업을 빨리 처리하거나, Consumer가 작업을 빨리 처리하는 경우의 오류를 피할 수 있도록 도와주고, 작업의 대한 스레드 간의 동기화 작업량을 조절해주어 Thread-Safe하게 프로그램을 만들어 낼 수 있다.
Put & Take란?
위 참고 이미지에서의 Put()은 큐의 크기에 제한이 되어 있을 경우 큐에 빈 공간이 생길 때 까지 대기하고있따가 빈 공간이 생기면 작업의 큐를 넣어주는 것을 말한다.
Take()는 큐의 작업이 없을 경우, 작업이 생길 대 까지 대기하고 작업이 생기면 큐에서 작업을 가져가는 것을 말한다.
'Computer Science > etc' 카테고리의 다른 글
AES & SHA-256 암호화란 ? (개념 / 종류 / 특징) (3) | 2022.02.18 |
---|---|
윈도우 후킹(Window Hooking)이란? ( Win32 API / API 정의) (0) | 2021.12.26 |
JIT와 AOT 컴파일러는 무엇일까? (JIT, AOT 방식 / 특징 / 사용언어) (0) | 2021.12.21 |
PS(Problem Solving) 에러와 디버깅에 관련하여.. (0) | 2021.09.29 |
댓글