안드로이드 시스템은 새로운 프로세스가 사용될 메모리가 부족할 때나 더 중요한 프로세스가 실행되어야 하는 상황에서는 기존에 중요하지 않은 프로세스는 종료한다.
어떤 프로세스를 살리고 죽일지 결정할 때, 시스템에서는 컴포넌트의 상태와 프로세스에서 실행되고 있는 컴포넌트를 기초로 해서 각각의 프로세스에 "중요도 계층"을 할당한다.
중요도 계층
1. Foreground Process
현재 유저가 사용하고 있는 프로세스.
- 유저와 상호 동작되고 있는 화면(액티비티)은 Foreground 프로세스에 속함
- 현재 화면과 Binding되어 있는 서비스는 Foreground 프로세스에 속함
- startForeground()를 이용해서 호출한 프로세스는 Foreground 프로세스에 속한다.
- onCreate(), onStart() 또는 onDestroy()를 콜백함수 중 하나를 실행하고 있는 서비스는 Foreground 프로세스에 속함
- onReceive() 함수를 호출하고 있는 Broadcast Receiver는 Foreground 프로세스에 속함
2. Visible Process
Foreground 컴포넌트에 해당하지 않는 프로세스이나, 화면을 통해서 볼 수 있는 컴포넌트를 칭함.
- Foreground 상태에 놓여있지 않은 액티비티이나, 사용자가 여전히 액티비티를 볼 수 있는 조건에 해당.
ex) Foreground 액티비티에서 다이얼로그를 실행했을 때, 실행되기 전 액티비티는 다이얼로그 뒤편에서는 여전히 보이기 때문에 Visible Process이다.
3. Service Process
startService() 메서드를 이용해서 시작된 서비스를 갖는 프로세스.
현재 실행되고 있는 서비스가 유저가 눈으로 확인할 수 있는 그 어떤 컴포넌트와 직접적인 관련성이 없으나, 해당 서비스와 관련된 내용을 사용자는 인지할 수 있다.
ex) 백그라운드에서 음악 재생, 네트워크를 통해 데이터 다운로드
4. Background Process
유저가 현재 보지 않는 액티비티 컴포넌트를 갖는 프로세스.
유저와 직접적인 관련성이 없기 때문에, 안드로이드 시스템이 다른 프로세스를 위한 메모리가 부족할 때, 시스템에 의해서 종료된다.
실행되는 Background 프로세스가 상당히 많이 존재하기 때문에, 해당 Backgroud 프로세스는 LRU(Least Recently Used Algorithm) 리스트에 보관된다.
그렇기에 가장 최근에 유저가 본 화면은 메모리에서 가장 나중에 제거된다.
5. Empty Process
어떤 컴포넌트도 갖고 있지 않은 프로세스,
캐싱을 하기 위해서 유지하는 프로세스인데, 이러한 캐싱을 함으로써 다음번에 프로세스를 좀 더 빠르게 실행할 수 있다.
시스템에서는 프로세스와 관련된 캐싱과 커널과의 균형을 맞추기 위해서 전반적인 시스템 자원의 균형을 맞춘다.
'gyub's 공부일기 > 그저 내 공부' 카테고리의 다른 글
[Android] 프로세스 (0) | 2022.03.20 |
---|---|
[OS] 메모리 페이징 (0) | 2022.03.19 |
배열 vs 리스트 (0) | 2022.02.14 |
Synchronized (0) | 2021.04.08 |
Serialization (0) | 2021.04.08 |