이전 Thread 포스팅 입니다. 참고하시려면 클릭해서 보시면 되겠습니다.

Thread 안전, Thread safety <= 클릭

JAVA Thread 암시적 잠금 종류 및 생산자와 소비자<=클릭


Intro

Multi Thread가 반응성있도록 동작하려면, 앱을 설계시, Thread 생성과 Task 실행을 염두해두어야 합니다. 

별로 추천하고싶지 않은 설계방법 2가지를 먼저 살펴보겠습니다.



Thread or Task(스레드 및 태스크) 설계 및 실행 전략에 대해 살펴보도록 하겠습니다.



여기서설명하는 Task과 Thread의 정확한 의미구분을 하고 먼저 넘어가겠습니다.

Task는 일의 단위입니다. 하나의 메서드일수도있고, 메서드 집합일수도있으며, 응용프로그램에서 의미있는 한가지의 일을 Task라 생각하시면 되겠습니다.

Thread 는 Process를 점유할수있는 하나의 실행 흐름입니다.


보통 자바, 안드로이드에서는 Task와 Thread를 같은 의미인것처럼 사용하긴하지만, 정확히는 의미가 차이가 있습니다..


1) 모든 Task에 하나의 Thread 사용

모든 Task가 동일한 Thread에서 실행되는 경우입니다. 사용가능한 Process를 사용하지 않아, 반응성 없는 앱이 될 수 있습니다.

다른 Thread를 이용해서 Task를 적절히 분리하여 병행실행이 가능하기때문입니다.


2) 각각의 Task 당 하나의 Thread 사용

각각의 Task에 대해 시작, 종료되는 새로운 Thread에서 항상 Task를 실행하도록 작성을하면,

Task가 자주 생성되며 수명이 짧은 경우에는 Thread 생성 및 해체작업의 Overhead가 증가되게됩니다. 그러므로 성능 저하 이슈로 이어지게 됩니다.


.


순차실행

하나의 Task가 완료되면 다음 Task가 실행되는 구조입니다. 따라서 Task의 실행 간격에 중첩은 없습니다.

그러므로 2가지의 강점을 가지게 됩니다.


1) Thread Safety가 지켜집니다.

2) Multi Thread 보다 적은 memory를 소비하는 하나의 Thread로 실행할 수 있습니다.



하지만 처리량이 적고, 순차적이기 때문에, 하나의 태스크가 실행되지않으면, 그이후 태스크 작업은 절대 일어나지 않습니다. 

시작지연이나, 전혀 실행되지 않는 문제가 생기게 됩니다.



동시 실행

Task는 병렬 및 Interleave(처리할 Data의 dependency 없애 동시에 실행하는 방법)로 실행됩니다. 더 나은 CPU 사용률을 가지기에

처리량이 뛰어나고, 반응성이 좋습니다.

하지만 Thread Safety문제로 인해서, 동기화를 구현해줘야 합니다.


그렇기때문에 효과적으로 Multi Thread를 설계하려면, 순차실행과 동시실행을 통해 실행환경을 만들어야 합니다. 융통성있게 개발자가 구현해야할 몫입니다.



동시 실행 설계

동시 실행설계는 매우 다양한 방법으로 설계할 수 있습니다. 


1) 자원 생성과 해체 빈도를 감소시키기 위해, 항상 새로운 Thread를 만드는 것보다 재사용을 건장합니다.

2) 필요이상으로 Thread를 사용하지 말아야합니다. thread가 많을수록 더많은 memory와 process 시간이 소비되며, 개발자의 부담으로 이어지게 됩니다.


마무리

안드로이드 앱은, single 및 multi process platform에서 성능 향상 및 반응성있도록, multiThread로 만들어져야 합니다. 

Thread는 하나의 Process에서 실행을 공유하거나 multiprocess를 사요할 수 있을떄 진정한 동시성(concurrency)를 활용할 수 있게 됩니다.

향상된 성능은 증가한 복잡성뿐만 아니라, Thread간 공유자원을 보호하고 데이터 일관성을 유지해야하는 책임을 가지게 됩니다.


그만큼 멀티스레드의 장점도있지만 그만큼 개발자의 부담감으로 이어지겠습니다.


+ Recent posts