[Android] 스레드와 프로세스

YounDitt·2020년 10월 12일
0

멀티프로그래밍

목록 보기
1/2

1. 프로세스

  • 애플리케이션이 시작될때 안드로이드 시스템에서 하나의 스레드(메인스레드)로 구성된 프로세스를 시작시킨다.
  • 프로세스의 수명주기가 애플리케이션 자체에 의해 직접 제어되지 않는다. 시스템에 의해 제어되는 프로세스는 우선순위등에 따라 종료되며 종속성을 갖는다.

🙋‍♀️ 애플리케이션 1개에 1개의 프로세스만 생성될까?
매니페스트에 android:process 속성을 정의하여 특정 구성요소가 별개의 프로세스에서 동작도록 정의할 수 있다.

프로세스 우선순위

메모리 자원을 회수하기 위해 각 프로세스에 대해 우선순위를 부여한다.

1. Foreground Process

활성 프로세스로 사용자가 현재 상호작용 하고 있는 애플리케이션

  • Activity : Activity.onResume()이 호출됨 (=Activity 실행중)
  • BroadcastReceiver : BroadcastReceiver.onReceive()이 실행중임. (=BroadcastReceiver 실행중)
  • Service : Service.onCreate(), onStart(), onDestroy()이 실행중임. (=Service 실행중)

2. Visible Process

  • Activity : 화면에 보이지만 비활성 상태의 프로세스 (onPause()가 호출됨)
    (Dialog가 띄워진 상태의 Activity or Fragment)
  • Service : Service.startForeground()를 통해 Foreground Service로 실행중인 Service

3. Service Process

  • 화면에 보이는 인터페이스 없이 계속되어야 하는 처리를 담당하는 프로세스
  • Service : Service.startService()로 시작된 Service
    (백그라운드 네트워크 데이터 업로드/다운로드등)
  • 오랫동안(예:30분이상) 실행되고 있는 서비스는 중요도가 강등됨에 따라 이 프로세스가 캐시된 LRU목록으로 이전될 수 있다.

4. Cached Process

  • 현재 필요하지 않은 프로세스
  • 메모리관리와 관련된 프로세스
  • 가장 오래된 프로세스를 정기적으로 종료한다.
  • 현재 사용자에게 표시되지 않는 하나 이상의 Activity인스턴스를 포함한다(onStop() 메소드가 호출되어 반환됨)
  • 캐시가 되어 재구동시 초기구동보다 빠르게 시작할 수 있다.
  • 제거순서는 LRU이다.

2. 스레드

  • 동일한 프로세스에서 동작하는 모든 안드로이드 컴포넌트는 메인스레드에서 처리되며 각각의 컴포넌트에 대한 시스템 호출은 메인스레드로 전달된다.
    (onKeyDown(), onResume()...)
  • 메인스레드가 일정시간 블록될경우 ANR이 발생한다.
    (때문에, 네트워크등 별도의 작업은 background or worker스레드에서 처리하도록 한다.)

안드로이드와 멀티스레드

  • 안드로이드 어플리케이션을 실행하면, 시스템은 메인액티비티를 메인 메모리로 올려 프로세스를 만들며, 이 때 메인스레드가 자동으로 생성된다.
  • 메인스레드에서 무거운 작업을 하면 ANR로 전환되기 때문에 별도의 스레드에서 무거운 작업을 한다.
  • 이렇게 만든 별도의 스레드의 작업을 반영하기 위해 메인스레드와의 통신이 필요하다.


스레드가 핸들러로 메세지를 전달하며, 그 메세지는 메세지큐에 저장되고, 루퍼가 그 큐에서 데이터를 꺼내고 핸들러에게 전달한다. 핸들러는 전달받은 메세지를 실행하거나 전달한다.

1. 핸들러

  • 스레드 간의 통신을 담당한다.
  • 루퍼로 부터 받은 메세지를 실행하거나 다른스레드로부터 메세지를 받아서 메세지 큐에 넣는다.

2. 루퍼

  • 무한루프를 돌며 자신이 속한 스레드의 메세지큐에서 메세지를 꺼내서 핸들러에게 전달한다.
  • 안드로이드에서 핸들러 스레드를 사용하면, 루퍼를 갖고있는 스레드를 생성할 수 있다.

3. 메세지큐

  • 스레드가 다른 스레드나 혹은 자기 자신으로부터 전달받은 Message를 보관하는 Queue이다(FIFO).

참고 1
참고 2

profile
Hello, Android

0개의 댓글