[Android] 프로세스와 스레드

Jay·2021년 1월 16일
1

Android

목록 보기
8/39
post-thumbnail

CS에서의 프로세스와 스레드를 이야기하고자 하는게 아니다.
Android에서의 프로세스와 스레드를 이야기 하고자 한다.

일단, Android 시스템이 시작되면, 새로운 리눅스 프로세스가 단일 스레드로 시작된다. 기본적으로, 같은 어플리케이션의 모든 구성요소는 같은 프로세스와 스레드(메인 스레드)에서 동작한다.
어플리케이션 컴포넌트가 시작되고 해당 어플리케이션에 대한 프로세스가 이미 존재하는 경우, 컴포넌트는 해당 프로세스 내에서 시작되고 동일한 실행 스레드(메인 스레드)를 사용한다. 그러나, 분할된 프로세스에서 컴포넌트를 동작시킬수 있고, 다른 어떤 프로세스에서든 추가적으로 스레드를 만들 수 있다.

프로세스

  • 모든 Android Application은 자체 Linux 프로세스에서 실행된다.
  • 프로세스의 수명 주기는 애플리케이션에 의해 직접 제어 되지 않는다.
  • 메모리 부족 시, 종료해야 하는 프로세스를 결정하기 위해 각 프로세스를 중요도 계층 구조에 배치한다.

프로세스의 유형

  • 포그라운드 프로세스 (Foreground)
    • user가 현재 하고 있는 작업에 필요한 프로세스
    • (다음 조건 중 하나라도 해당 시)
      • 프로세스가 사용자가 상호 작용하고 있는 화면 상단에서 Activity를 실행 중일 때(onResume())
      • 프로세스에 현재 실행 중인 BroadcastReceiver가 있을 때.
      • 프로세스에 콜백 중 하나에서 현재 코드를 실행 중인 Service 존재시.
  • 가시적 프로세스 (Visible)
    • 해당 프로세스를 종료하면 사용자 환경에 부정적인 영향을 끼치는 경우.
    • (다음 조건 중 하나라도 해당 시)
      • 화면 상으론 사용자에게 표시되지만 포그라운드에 있지 않은 Activity를 실행 중일때
      • 프로세스에 Service.startForeground()를 통해 포그라운드 서비스로 실행 중인 Service가 있을 때
    • 프로세스가 시스템에서 라이브 배경화면, 입력 방법 서비스 등과 같이 사용자가 알고있는 특정 기능에 사용하는 서비스를 호스팅할 때
  • 서비스 프로세스 (Service)
    • startService() 메서드로 시작된 service를 유지하는 프로세스
    • 사용자에게 직접 표시되지 않지만 일반적으로 사용자가 관심을 가진 작업을 실행.(다운로드..)
    • 시스템은 모든 포그라운드 프로세스 및 가시적 프로세스를 유지할 메모리가 부족하지 않다면 항상 이런 프로세스의 실행 상태를 유지한다.
    • 오랫동안 실행되고 있는 서비스는 중요도가 강등됨에 따라 이 프로세스가 캐시된 LRU 목록으로 이전될 수 있다.
  • 캐시된 프로세스 (Cached)
    - 현재 필요하지 않은 프로세스
    • 캐시된 프로세스는 메모리 관리와 관련된 유일한 프로세스
    • 다수의 캐시된 프로세스 사용 가능
    • 필요에 따라 가장 오래된 프로세스를 정기적으로 종료시킨다.
    • 흔히 캐시된 프로세스는 현재 사용자에게 표시되지 않는 하나 이상의 Activity 인스턴스를 포함한다.

스레드

  • 메인 스레드(UI Thread)

    • Application이 시작되고 시스템이 애플리케이션에 생성하는 실행 스레드.
    • 적절한 사용자 인터페이스 위젯에 이벤트를 발송하는 역할
    • 대부분 Android UI 도구 키트의 구성요소와 개발자의 애플리케이션이 상호 작용하는 스레드
    • 시스템 콜백에 응답하는 메서드(onKeyDown() / 수명주기 콜백 메서드)는 항상 UI스레드에서 실행된다.
    • 리소스를 많이 소모하는 작업(상호작용)을 수행할 경우 애플리케이션을 제대로 구현하지 않으면 낮은 성능을 보일 수 있다.
    • 긴 작업(네트워크 엑세스, db 쿼리) 수행 시 전체 UI가 차단되며 심각한 경우 ANR 발생. 무거운 작업은 반드시 새로운 스레드를 만들어서 사용해야 한다.
    • Android UI 도구 키트는 스레드로부터 안전하지 않다.
      (작업 스레드에서 UI를 조작하려 하면 안된다.)
    • 사용자 인터페이스 조작 작업은 모두 UI 스레드에서 해야 한다.
  • 작업자 스레드(Worker Thread / Background Thread)
    - 수행은 해야 하지만 즉각적인 조치가 필요하지 않은 작업은 반드시 작업자 스레드에서 수행해야 한다.

    • 메인 스레드를 제외한 다른 스레드에서의 UI 업데이트는 불가하다.
      -> 다른 스레드에서 UI 스레드에 접근하는 여러 방식이 존재한다.
      - Activity.runOnUiThread(Runnable)
      - View.post(Runnable)
      - View.postDelayed(Runnable, long)
      - 혹은 handler.

Android 공식 문서 번역을 통한 정리본입니다.

Ref

https://developer.android.com/guide/components/processes-and-threads

profile
developer

0개의 댓글