Image Processing - Latency Optimization (지연시간 최적화)
📘 Backend/Concurrency2023. 12. 3. 00:03Image Processing - Latency Optimization (지연시간 최적화)

📘 Image Processing 어떤 사진에 1가지 종류의 꽃이 있고, 동일한 종의 꽃이지만 색깔은 2가지(흰색, 보라색)로 나뉘는 사진이 있습니다. 이 사진은 3036 x 4048이며 대략 1200만 픽셀로 이루어져 있고, 각 픽셀의 색깔은 ARGB로 불리는 4가지 Byte로 표현됩니다. A (Alpha) : 픽셀의 투명도 값을 나타냄 R (Red) : 빨간색 G (Green) : 초록색 B (Blue) : 파란색 RGB의 조합으로 모든 색을 표현할 수 있습니다. 모든 꽃의 색깔을 보라색으로 만들기 위해 보라색으로 칠할 곳을 식별합니다. 색상 Re-Coloring 알고리즘을 Sequantial 버전으로 구현 구현을 모듈화해서 멀티스레드 작업으로 나누기 📘 Single Threading ImagePro..

Thread Blocking (Count Down Latch)
📘 Backend/Concurrency2023. 11. 28. 09:50Thread Blocking (Count Down Latch)

📘 CountDownLatch 란? CountDownLatch는 특정 스레드가 다른 스레드에서 작업이 완료될 때까지 기다릴 수 있도록 해주는 클래스이며, 스레드간 통신이 가능하고, Main Thread와 Reactive Stream의 처리를 동기화 하기 위해 사용합니다. 예를 들어 CountDownLatch(3) 이라고 가정하면 3개의 Task를 실행 시키면서 countDown()를 호출해 Count 값을 감소시킵니다. Count가 0이 되면 차단된 스레드가 해제되고 나머지 작업을 수행합니다. 즉, CountDownLatch의 수치가 0이 될때까지 해당되는 스레드를 Block 시키면서 Latch는 Await 합니다. CountDownLatch의 장점은 Thread.join()보다 유연하며, 스레드의 참조..

Thread.join()을 이용한 Thread 실행 순서 제어 (Race Condition)
📘 Backend/Concurrency2023. 10. 2. 16:57Thread.join()을 이용한 Thread 실행 순서 제어 (Race Condition)

📘 Thread.join()을 이용한 실행 순서 제어 다른 스레드를 시작하고 멈추는 기능 그 이상에 대해 알아보겠습니다. 특히, 신뢰하는 스레드가 예상 시간 안에 작업을 완료하게 만드는 법을 배울 겁니다. 그러려면 스레드 실행을 완전히 제어할 수 있어야 합니다. 그렇게 특정 작업들을 병렬로 실행하고 처리 속도를 높이면 안전하고 정확하게 결과를 출력할 수 있습니다. 앞서 알아본 것처럼 스레드를 실행하면 독립적으로 동작하며, 스레드의 실행 순서 역시 개발자가 제어할 수 없습니다. 하지만, join()을 이용해 특정 스레드의 작업 완료 시, 다음 스레드를 실행하게 할 수 있습니다. 동시에 시작하는 두 스레드 A,B를 예시로 들어서 예측할 수 있는 결과는 아래와 같습니다. A가 B보다 먼저 작업을 완료한다. B..

Thread Termanation - Thread Interrupt & Daemon Thread
📘 Backend/Concurrency2023. 10. 2. 15:57Thread Termanation - Thread Interrupt & Daemon Thread

📘 Thread Coordination 이번에 배워볼 건 스레드를 조정하는 방법입니다. 그 중 하나의 스레드를 다른 스레드에서 멈추게 하는 작업 (Thread Termination)이죠. 이 Thread Termination에는 몇가지 방법이 있습니다. interrupt() 를 사용하는 방법 Daemon Thread를 사용하는 방법 📌 스레드를 언제/왜 멈춰야 할까요? 스레드는 아무 동작을 안해도 메모리와 일부 커널 리소스를 사용합니다. 그리고 CPU 타임과 CPU 캐시 공간도 사용합니다. 따라서 생성한 스레드가 이미 작업을 완료했는데 어플리케이션이 동작중이라면 미사용 스레드가 잡아먹는 리소스를 정리해야 합니다. 또, 스레드가 오작동 할 시에도 스레드를 중지해야 합니다. 예를 들어 응답이 없는 서버에 계..

Thread Inheritance (경찰과 도둑 예시)
📘 Backend/Concurrency2023. 10. 2. 13:47Thread Inheritance (경찰과 도둑 예시)

📘 Thread 상속 하나의 예시를 들어, 돈을 보관할 안전한 금고를 설계한다고 가정해 봅시다. 그리고 해커들이 코드를 추측해서 금고를 여는데 얼마나 걸리는지 알아보겠습니다. 동시에 금고의 코드를 깨려는 헤커 스레드를 몇개 만들고, 경찰 스레드도 추가합니다. 경찰 스레드는 10초 안에 해커를 잡으러 옵니다. 만약 해커들이 그동안 돈을 훔쳐서 도망가지 않는다면 경찰이 해커를 체포합니다. 10초를 세는동안 경찰 스레드는 도착 상황을 화면에 띄워 보여줄 겁니다. 위 예시의 계층을 정리해 보자면, 최상위 Runnable 인터페이스 Runnable을 구현한 Thread Thread를 확장한 Hacker Thread / Police Thread (이때, Hacker Thread는 금고 객체에 대한 Referense..

Create Thread - Implementation Runnable & Thread
📘 Backend/Concurrency2023. 10. 2. 13:45Create Thread - Implementation Runnable & Thread

📘 Thread Creation with Runnable Runnable 인터페이스를 구현해 Multi-Threading을 구현합니다. 아래 예시 코드의 new Thread(() -> {}) 람다 부분은 내부적으로 new Runnable()로 구성됩니다. 📌 start() & sleep() 아래 코드를 실행시켜 보면, 당연히 처음 로그는 main 스레드에서 생성했으니 이름이 main 입니다. 그 후, thread.start()를 거친 후의 thread name은 운영체제에서 스케줄링 되지 않았습니다. 왜냐하면 sleep으로 인해 운영체제가 비동기적으로 sleep을 실행했고, 그래서 2번쨰 스레드의 이름이 테스트-1이 아닌 main이 나오게 됩니다. 그리고 마지막으로 새 스레드의 코드가 실행되어 테스트-1..

image