-
안드로이드 스레드 (Android Thread)Android 2019. 8. 21. 22:10반응형
https://github.com/DNights/CoroutinesSampleTest
최근 Coroutin 관련해서 내용을 보고 있다가 Thread 와 다른 점이 무엇이 있나 찾아보다가
일단 Thread 관련하여 내용을 정리해보자 해서 정리중입니다.
일단 Thread , Handler , Looper 에 관한 내용입니다.
스레드란?
스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.
그렇다면 스레드와 프로세스가 무엇이 다른가해서 프로세스의 정의를 찾아보았다.
프로세스란?
프로세스(process)는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 종종 스케줄링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 쓰인다. 여러 개의 프로세서를 사용하는 것을 멀티프로세싱이라고 하며 같은 시간에 여러 개의 프로그램을 띄우는 시분할 방식을 멀티태스킹이라고 한다. 프로세스 관리는 운영 체제의 중요한 부분이 되었다.
프로세스와 스레드 사이에 비교 내용을 아래와 같다
프로세스와 스레드의 비교
멀티프로세스와 멀티스레드는 양쪽 모두 여러 흐름이 동시에 진행된다는 공통점을 가지고 있다. 하지만 멀티프로세스에서 각 프로세스는 독립적으로 실행되며 각각 별개의 메모리를 차지하고 있는 것과 달리 멀티스레드는 프로세스 내의 메모리를 공유해 사용할 수 있다. 또한 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다.
멀티스레드의 다른 장점은 CPU가 여러 개일 경우에 각각의 CPU가 스레드 하나씩을 담당하는 방법으로 속도를 높일 수 있다는 것이다. 이러한 시스템에서는 여러 스레드가 실제 시간상으로 동시에 수행될 수 있기 때문이다.
멀티스레드의 단점에는 각각의 스레드 중 어떤 것이 먼저 실행될지 그 순서를 알 수 없다는 것이 있다. 예를 들어, 두 스레드가 특정 공유 변수 i의 값을 1 증가시키는 명령을 실행할 때, 다음과 같은 방식으로 수행될 수 있다.
공유되는 변수 i의 값을 레지스터에 저장
레지스터의 값을 1 증가시킨다.
변수 i에 그 값을 저장한다.
이때 두 스레드가 실행될 때 어떤 스레드가 먼저 실행될지는 보장되지 않으며, 만약 다음과 같은 순서로 실행된다면:스레드동작i의 값스레드 1의 레지스터스레드 2의 레지스터
스레드 1 i의 값을 레지스터에 저장 0 0 스레드 1 레지스터 값을 1 증가 0 1 스레드 1 i에 값 저장 1 1 스레드 2 i의 값을 레지스터에 저장 1 1 1 스레드 2 레지스터 값을 1 증가 1 1 2 스레드 2 i에 값 저장 2 1 2
최종 결과로 i는 2가 증가된다. 하지만 다음과 같이 실행된다면:스레드동작i의 값스레드 1의 레지스터스레드 2의 레지스터
스레드 1 i의 값을 레지스터에 저장 0 0 스레드 2 i의 값을 레지스터에 저장 0 0 0 스레드 1 레지스터 값을 1 증가 0 1 0 스레드 2 레지스터 값을 1 증가 0 1 1 스레드 1 i에 값 저장 1 1 1 스레드 2 i에 값 저장 1 1 1
최종 결과로 i는 1이 증가되고, 이것은 원래 프로그램의 의도(각각의 스레드가 i를 1씩 증가하는 동작)와 다를 수 있다. 또한 이러한 문제는 스레드의 실행 조건에 따라 결과가 다르게 나오므로, 오류가 발생했을 때 원인을 찾기가 힘들다. 이러한 문제를 경쟁 조건이라고 하며, 문제를 막기 위해 세마포어와 같은 방법을 통해 공유 데이터에 접근하는 스레드의 개수를 한개 이하로 유지하는 방법을 사용할 수 있다.위의 내용처럼 스레드는 하나의 저장값에 2개이상의 스레드가 접근할경우 문제가 발생한다.
안드로이드에서는 이러한 문제를 방지하기 위해서 UI를 조작할경우 메인스레드에서만 가능하도록 강제하고 있다.
그리고 Handle 와 Looper 를 사용하여 해당사항을 방지하고 있다.
위의 그림과 같은 형태로 Rooper 와 Handler가 작동되고 있습니다.
[참고링크]
https://academy.realm.io/kr/posts/android-thread-looper-handler/
https://ko.wikipedia.org/wiki/%EC%8A%A4%EB%A0%88%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%8C%85)
https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4
반응형'Android' 카테고리의 다른 글
안드로이드 비동기 처리 질문 (Thread Sleep) (0) 2019.10.06 Android Paging Library (0) 2019.10.01 Android Dokka 사용법 (0) 2019.09.23 RecyclerView Header , Footer 생성 (0) 2019.09.17 안드로이드 런타임 (Android RunTime) (0) 2019.08.10 Droid knights 2019 - 코루틴 안전! 이쁘게 코루틴 사용하는 방법은? (0) 2019.08.06 GitHub - AndroidCheat (0) 2019.07.14 Koin Sample Test code (0) 2019.07.14