❌ CS에서의 프로세스와 스레드를 이야기하고자 하는게 아니다.
Android에서의 프로세스와 스레드를 이야기 하고자 한다.
일단, Android 시스템이 시작되면, 새로운 리눅스 프로세스가 단일 스레드로 시작된다. 기본적으로, 같은 어플리케이션의 모든 구성요소는 같은 프로세스와 스레드(메인 스레드)에서 동작한다.
어플리케이션 컴포넌트가 시작되고 해당 어플리케이션에 대한 프로세스가 이미 존재하는 경우, 컴포넌트는 해당 프로세스 내에서 시작되고 동일한 실행 스레드(메인 스레드)를 사용한다. 그러나, 분할된 프로세스에서 컴포넌트를 동작시킬수 있고, 다른 어떤 프로세스에서든 추가적으로 스레드를 만들 수 있다.
프로세스
- 모든 Android Application은 자체 Linux 프로세스에서 실행된다.
- 프로세스의 수명 주기는 애플리케이션에 의해 직접 제어 되지 않는다.
- 메모리 부족 시, 종료해야 하는 프로세스를 결정하기 위해 각 프로세스를 중요도 계층 구조에 배치한다.
프로세스의 유형
- 포그라운드 프로세스 (Foreground)
- user가 현재 하고 있는 작업에 필요한 프로세스
- (다음 조건 중 하나라도 해당 시)
- 프로세스가 사용자가 상호 작용하고 있는 화면 상단에서 Activity를 실행 중일 때(onResume())
- 프로세스에 현재 실행 중인 BroadcastReceiver가 있을 때.
- 프로세스에 콜백 중 하나에서 현재 코드를 실행 중인 Service 존재시.
- 가시적 프로세스 (Visible)
- 해당 프로세스를 종료하면 사용자 환경에 부정적인 영향을 끼치는 경우.
- (다음 조건 중 하나라도 해당 시)
- 화면 상으론 사용자에게 표시되지만 포그라운드에 있지 않은 Activity를 실행 중일때
- 프로세스에 Service.startForeground()를 통해 포그라운드 서비스로 실행 중인 Service가 있을 때
- 프로세스가 시스템에서 라이브 배경화면, 입력 방법 서비스 등과 같이 사용자가 알고있는 특정 기능에 사용하는 서비스를 호스팅할 때
- 서비스 프로세스 (Service)
- startService() 메서드로 시작된 service를 유지하는 프로세스
- 사용자에게 직접 표시되지 않지만 일반적으로 사용자가 관심을 가진 작업을 실행.(다운로드..)
- 시스템은 모든 포그라운드 프로세스 및 가시적 프로세스를 유지할 메모리가 부족하지 않다면 항상 이런 프로세스의 실행 상태를 유지한다.
- 오랫동안 실행되고 있는 서비스는 중요도가 강등됨에 따라 이 프로세스가 캐시된 LRU 목록으로 이전될 수 있다.
- 캐시된 프로세스 (Cached)
- 현재 필요하지 않은 프로세스
- 캐시된 프로세스는 메모리 관리와 관련된 유일한 프로세스
- 다수의 캐시된 프로세스 사용 가능
- 필요에 따라 가장 오래된 프로세스를 정기적으로 종료시킨다.
- 흔히 캐시된 프로세스는 현재 사용자에게 표시되지 않는 하나 이상의 Activity 인스턴스를 포함한다.
스레드
Android 공식 문서 번역을 통한 정리본입니다.
Ref
https://developer.android.com/guide/components/processes-and-threads