개발바닥곰발바닥
Published 2021. 10. 13. 01:41
[Android] 스레드 Android
728x90

안드로이드에서의 프로세스와 스레드

애플리케이션이 시작되면 안드로이드 시스템은 새로운 리눅스 프로세스를 생성한다.
기본적으로 애플리케이션 안의 모든 컴포넌트들은 동일한 프로세스의 동일한 스레드로 실행된다. 이 기본적인 스레드를 메인 스레드(main thread)라고 부른다.

프로세스 : 프로세스는 독자적으로 실행이 가능한 환경이다. 프로세스는 자기만의 메모리 공간을 가진다. 각각의 프로세스와 메모리 공간은 분리되어 있다.
스레드 : 스레드는 경량 프로세스라고도 불린다. 스레드를 생성하는 것은 프로세스를 생성하는 것보다 훨씬 부담이 적게들기 때문이다. 스레드들은 프로세스 안에서 존재하고 모든 프로세스에는 적어도 하나의 스레드는 존재한다. 스레드들은 메모리와 파일을 포함하여 프로세스의 모든 자원을 공유한다.

동시 작업의 문제점

동시 작업 프로그램은 동시에 여러 작업들이 같은 데이털르 공유하게 되면 동기화라고 하는 문제가 발생할 수 있다.

메인 스레드

메인 스레드는 사용자 인터페이스 위젯에게 이벤트를 전달하거나 화면을 그리는 작업을 담당한다. UI 스레드라고도 불린다.

안드로이드의 단일 스레드 모델 원칙

  • UI 스레드는 블록시키면 안된다.
  • UI 스레드 외부에서 안드로이드 UI 툴킷을 조작하면 안된다.

작업 스레드

별도로 생성되는 스레드로 배경 스레드 (background thread)라고도 한다.
작업 스레드를 작성하는 방법에는 두 가지가 있다.

  1. Thread 클래스를 상속받아서 스레드를 작성하는 방법
  2. Runnable 인터페이스를 구현한 후에 Thread 객체에 전달하는 방법

싱글 스레드의 장단점

장점 : 스레드 처리 로직이 없어 코드의 복잡도가 낮다. 그러므로 코드와 실행순서가 매우 간결해진다.
단점 : 특정 동작을 실행했을 때 동작이 오래걸리면 프로그램 전체가 지연이 된다. 이를 보완하기 위해서 멀티 스레드를 사용한다. 메인 스레드가 5초 이상 블록되어 있으면 안드로이드는 ANR이라고 불리는 대화 상자를 생성하고 애플리케이션을 중지한다.

멀티 스레드의 단점 : 어떤 처리 로직을 일일히 하나씩 추가하므로 코드의 복잡도가 높아지고 실행순서를 예측하기가 어렵다. 메모리나 시스템 리소스 사용량이 증가되어 오버헤드가 높아진다.

순차적인 실행이 필요한 task 같은 경우 하나의 스레드에서 순차적으로 실행하는 것이 효율적이고 task 간의 실행순서가 무관한 변칙적인 task의 경우는 여러 스레드에서 동시에 처리하는 것이 효율적이다.

안드로이드 응용 프로그램은 리눅스를 기반으로 한다. 응용 프로그램 스레드는 대표적으로 3가지가 있는데, 첫 번째로 UI 스레드로 메인 스레드라고도 불린다. 두 번쨰로는 Background 스레드, 세번 째로 바인더 스레드가 있다.

바인더 스레드는 서로 다른 프로세스에서 스레드 사이의 통신에 사용되는 스레드이다.
다른 프로세스에서 들어오는 요청을 처리하기 위해서 만들어지는 스레드가 바인더 스레드이다.

스레드를 사용하는 이유

  1. 메인 스레드로 모든 작업을 처리하면 ANR 다이얼로그가 나타날 수 있다.
  2. 네트워크를 처리할 때 별도의 스레드를 만들어서 사용해야 한다.
  3. 서피스 뷰를 이용할 때 별도의 스레드가 필요하다.
728x90
profile

개발바닥곰발바닥

@bestinu

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!