엄코딩의 개발 일지


1. 스레드(Thread)



- 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 


- 프로그래밍된 명령어들을 순차적으로 실행시키는 스케줄러(Scheduler)에 의해 관리되는 독립적인 객체라고 할 수 있다.


- 프로세스는 1개 이상의 스레드를 가진다. ( 일반적으로 첫 번째 스레드를 main thread라고한다. 또는 UI thread라고 한다.


- 스레드간에는 메모리를 공유한다.


- 스레드는 코드를 실행하는데 필요한 스택(stack)과 스레드에 저장되는 값( ThreadLocal )은 다른 스레드와 독립적으로 갖는다.




1-1. 스레드의 실행



- 앱이 실행되면 프로세스가 생성되고 프로세스는 VM( 달빅 버추얼 머신 )을 실행(java)


- 프로세스를 실행하면 보통 execute(파일에 있는 것을 메모리에 올려 실행시키는 방법)메소드 실행 ( 시간이 오래걸림 )


- 안드로이드에서는 미리 하나를 실행시켜놓고 fork를 통해 메모리에서 복사하여 실행 ( 시간이 상대적으로 빠르다. )


- 프로세스가 생성될 때 스레드가 하나 생성되는데 이것을 Main Thread라고 부른다. ( 스레드를 사용하여 코드 실행 )


- Main Thread에서는 새로운 Thread를 생성하여 실행할 수 있다.




1-1-1 Runnable 이용


1) 스레드를 생성




2) Runnable를 implements한다. Runnable는 작업을 어떻게 해야겠다 라는 것을 기술

3) 스레드의 start 메소드를 호출하여 자원을 할당







1-1-2. Thread 상속













1-2. 스레드와 스케줄러 







- 스케줄러가 앞에있는 스레드들을 순서대로 CPU 할당.


- start()메소드를 통해서 스레드를 우선순위 Queue 넣는다.


- wait()메소드를 통해 Wait Queue에 스레드를 넣는다.


- notify()메소드를 통해 다시 우선순위 Queue에 넣는다





1-4. 스레드풀( ThreadPool )



- ThreadPool은 스레드가 필요할 때마다 매번 스레드를 생성하게 되면 스레드 생성시 오버헤드(overhead)가 발생하고,

동시에 너무 많은 스레드를 생성하게 되면 성능에 문제가 발생할 수 있기 때문에 이 문제를 해결하기 위해 일정 개수의

스레드를 만들어서 재활용하도록 하는 방식이다.


- Java에서는 ThreadPoolExecutor를 이용하여 ThreadPool을 생성할 수 있다. 

또는 Executors를 이용하여 ThreadPool을 얻어올 수 있다.








1-5. 별도 스레드의 필요성


1-5-1. ANR(Android Not ResPonse) Dialog  


- 안드로이드 Main Thread는 화면 버튼을 눌렀을 때 onClick함수를 호출하게 되는데, 이벤트를 처리하고 결과를 내는 데에 시간 제약이 있다. 안드로이드 플랫폼이 A라는 이벤트를 주면 A 이벤트를 처리하고 결과를 보고(reporting)해주어야 하는데 안드로이드 시스템이 일정시간이 지낫는데 리포팅이안될 경우 ANR Dialog를 띄운다.


-> 안드로이드에서 Main Thread가 오랜 시간 동안 작업을 처리하고 있으면, 플랫폼이 앱이 죽었다고 판단하여 사용자에게 앱을 종료할 것인지 물어보는 Dialog를 띄워준다. 이 Dialog를 ANR Dialog라고 한다.


- 시간이 많이 걸리는 작업을 수행해야 하는 경우에 ANR Dialog가 뜨지 않도록 하기 위해 별도의 스레드를 만들어 처리한다.

(시간이 오래 걸리는 작업은 Main Thread로 하지 않는 것이 좋다 )




ANR Dialog에 대한 이미지 검색결과


*ANR Dialog 예시)




1-5-2. Network 처리



- Java의 Network관련 메소드는 Blocking으로 되어 있기 때문에 Network연결, 데이터 쓰기 및 읽기 등을 수행할 때, 안드로이드에서는 Main Thread로 수행할 수 없도록 하고 있다.(API 14부터는 Main Thread로 Network를 처리 하면 Exception이 발생한다.)


-Network 작업을 처리해야 하는 경우에 별도의 스레드를 만들어 처리한다.




1-5-3. SurfaceView 처리


- SurfaceView란 별도의 입력을 받을 수 없는 윈도우를 받아 윈도우에 반복적인 그림을 그리는 작업 등의 처리를 하는것이라고 할 수 있다.(게임을 만드는 작업 등)


- SurfaceView를 이용하여 별도의 Surface를 생성한 경우, 일반적으로 이 Surface에 그림을 그리는 작업은 Loop를 돌면서 처리한다.


- 무한 loop를 돌면서 계속 처리를 해 주어야 하는 경우 별도의 스레드를 만들어 처리한다.












2. 프로세스 (Process)



- 프로세스는 간단하게 말해서 컴퓨터 내에서 실행중인 프로그램을 일컫는 용어라고 할 수 있다. 또한, 안드로이드에서 프로세스는 메모리에 적재되어 실행되는 프로그램의 인스턴스라고도 할 수 있다.


- 프로세스는 프로그램을 실행하기위한 자원을 관리하는 객체로 이해할 수 있다.


- 프로세스간에는 메모리를 공유하지 않는다. 








3. 스레드와 프로세스의 차이점



- 프로세스는 완벽히 독립적이기 때문에 code, data, heap, stack등의 메모리 영역을 다른 프로세스와 공유하지 않는다.

-> 프로세스는 자원을 공유하지 않는다.


- 스레드는 해당 스레드를 위한 stack을 생성할 뿐이고, code, data, heap영역을 공유한다.

-> 스레드는 자원을 공유한다.




4. 스레드(Thread)와 프로세스(Process)의 이해



스레드와 프로세스를 쉽게 이해하기 위해서 기업을 예로 들어볼 수 있다.

기업은 특정 업무, 일을 진행하는 면에서 프로세스라고 생각해 볼 수 있다.

기업에서 실제 일을 하는 직원들을 스레드(thread)라고 볼 수 있다. 이러한 직원들을 뽑아서 쓰는 사장이 있을 것이다.

이 사장을 메인 스레드(Main thread)라고 볼 수 있을 것이다. 기업에서 일을 하기위해 컴퓨터 같은 작업도구를 쓸 수 있는데

이 작업 도구들이 Resource(memory, handler 등)에 해당한다고 할 수 있고, 직원들간의 협업을 위한 회의나 토론등을 thread간 통신이라고 볼 수 있을 것이다. 

기업 A와 B가 있다고 해보자. 기업 A의 PC(자원)를 기업 B에서 사용할 수는 없다. 또한, 기업 B의 자원을 기업 A에서 사용할 수 없다. 기업을 프로세스라고 생각해보면 프로세스는 자원을 공유하지 않는다는 것을 알 수 있다.

하지만 기업 A의 직원들은 기업 A의 PC나 다른 자원들을 공유한다. 즉 스레드는 자원을 공유한다고 할 수 있을 것이다.





[자료 출처 및 참고 사이트]


http://hso9201.tistory.com/212

https://tacademy.sktechx.com/frontMain.action