[ 앱 개발자 도전기 : 안드로이드 ] 안드로이드 운영체제 부분 정리하기.
∇ 안드로이드 운영 체제 관련 정리
목 차
1. 운영 체제란 ?
2. 안드로이드 운영체제의 구조 [ 운영체제 + 플랫폼 ]
3. 안드로이드 OS의 특징
4. 안드로이드에서 네이티브 코드란?
5. 프로세스와 스레드
6. 프로세스 우선순위
1. 운영 체제란 ?
☆ 운영체제란, Operating System으로 일반적으로 "OS" 라고 말합니다.
◎ 운영체제는 컴퓨터 시스템의 기본적인 구성요소이며,
" 하드웨어와 소프트웨어 응용 프로그램을 연결하고 관리하는 시스템 소프트웨어 " 라고 할 수 있습니다.
◎ 커널(Kernel)은 운영체제의 핵심이 되는 부분으로,
하드웨어와 프로그램 사이에 인터페이스를 제공하고 하드웨어와 소프트웨어의 리소스를 관리합니다.
☆ 즉, 운영체제는 '커널'을 통해 시스템 전반을 통제합니다.
∇ 운영체제의 대표적인 기능들.
1. 리소스 관리.
√ 컴퓨터의 CPU, 메모리(RAM), 보조 기억장치 및 네트워크와 같은 하드웨어 리소스를 관리합니다.
√ 운영체제, 프로그램, 드라이버와 같은 소프트웨어 리소스도 관리합니다.
2. 장치 드라이버
√ 키보드, 마우스, 모니터와 같은 하드웨어 장치를 제어하기 위한 장치 드라이버를 제공합니다.
3. 사용자 인터페이스(UI)
√ 사용자가 컴퓨터와 상호작용할 수 있는 UI(User Interface, 사용자 인터페이스)를 제공합니다.
4. 보안 ( Security )
√ 사용자 및 프로그램의 보안을 관리하고, 사용자 인증 및 권한 관리 드의 기능을 제공합니다.
5. 프로그램 실행
√ 프로그램을 실행하고, 프로그램이 컴퓨터의 하드웨어 및 소프트웨어 리소스에 엑세스 가능하도록 합니다.
2. 안드로이드 운영체제의 구조 [ 운영체제 + 플랫폼 ]
※ 안드로이드 운영체제는
"리눅스(Linux) 커널 " 과 이에 기반한 " 안드로이드 소프트웨어 스택 " 으로 구성되어 있습니다.
◎ 안드로이드 운영체제에서, ' 리눅스 커널 ' 이 가지는 특징들
- 안드로이드 운영체제의 핵심인 리눅스 커널은 안드로이드 운영체제 상에서 하드웨어를 제어하고
안드로이드 앱과 다른 시스템 서비스가 상호 작용할 수 있도록 인터페이스를 제공합니다.
- " 리눅스 커널 " 은 멀티태스킹, 메모리 관리, 네트워킹 등
안드로이드 구현 및 활용 측면에서 필요한 다양한 기능을 제공합니다.
- 안드로이드 운영체제에서 ' 리눅스 커널 ' 은 모바일 기기의 하드웨어 리소스를 관리하고
이를 통해서 안드로이드 앱은 카메라 * 스피커 * 마이크 * 사진 등등의 하드웨어 리소를 이용하여
유저에게 다양한 기능들을 제공 가능합니다.
- " 리눅스 커널 " 안드로이드 운영체제에서 보안을 담당 합니다.
◎ 안드로이드 소프트웨어 스택을 구성하는 4개의 주요 계층들
1. 응용 프로그램 계층 ( Application Layer )
● 안드로이드 운영체제의 가장 상위 계층으로, 사용자와 상호 작용하는 애플리케이션들을 포함.
● 안드로이드 사용자 경험의 핵심을 이루며, 다양한 종류의 애플리케이션들이 모두 이 계층에서 실행.
● 사용자 인터페이스, 애플리케이션 로직, 데이터 관리 및 다양한 기능을 수행하는 애플리케이션들로 구성.
2. 애플리케이션 프레임워크 계층 ( Application Framework Layer )
● 안드로이드 운영체제에서 제공하는 애플리케이션 개발을 위한
API ( Application Programming Interface) 를 제공하는 계층입니다.
● " 안드로이드 응용 프로그램 계층 " 과 " 안드로이드 런타임 계층 " 사이에 위치하며,
안드로이드 애플리케이션 개발자들이 안드로이드 운영체제에서 제공하는 다양한 기능들을
활용 가능하도록 도와줍니다.
● 안드로이드 4대 컴포넌트들 ( Activity, Service, Broadcast receiver, Content Provider ) , DB 연동,
메시지 전송, 위치 정보, 각종 센서 등을 다룰 수 있는 API를 제공합니다.
● 안드로이드 리소스 관리 및 액티비티 관리와 같은 중요한 기능들을 포함합니다.
● 핵심 도듈식 시스템 구성 요소/서비스 재활용을 단순화, Android 앱 제작에 필요한 빌딩 블록 구성.
빌딩 블록 종류
(1) View System(목록, 그리드, 텍스트 상자, 버튼 및 삽입)
- 가능한 웹 브라우저를 포함하여 앱의 UI를 빌드하는 데 사용 가능, 기능이 풍부하며 확장 가능
(2) ResourceManager
- 현지화 된 문자열, 그래픽 및 레이아웃 파일과 같은 코드가 아닌 리소스에 대한 액세스 제공
(3) NotificationManager
- 모든 앱이 상태 표시 줄에 사용자 지정 알림을 표시 할 수 있도록 지원
(4) Activity Manager
- 앱의 수명 주기를 관리하고 공통 탐색 백스택 제공
(5) 콘텐츠 제공자 (Content Providers)
- 앱이 주소록 앱과 같은 다른앱의 데이터에 액세스하거나 자신의 데이터를 공유 할 수 있도록 지원
3 - 1. 안드로이드 런타임 계층 ( Android Runtime Layer )
● 안드로이드 애플리케이션을 실행하는 데 필요한 기능(컴파일)을 제공하는 계층.
● 안드로이드에서는 이전에는 JVM(자바 가상 머신) 기반의 런타임 환경인 Dalvik을 사용하다가
최근에는 ART( 안드로이드 런타임)을 사용하고 있습니다.
● ART는 JIT( Just-In-Time ) 컴파일러가 아닌 AOT(Ahead - Of - Time) 컴파일러를 사용하기 때문에
Dalvik보다 성능이 뛰어나지만, 더 많은 메모리를 소모합니다.
● 이 계층에서는 네이티브 코드(C/C++)를 실행할 수 있는 인터페이스를 제공합니다.
3 - 2. 네이티브 라이브러리 계층 ( Native Library Layer )
● 안드로이드 애플리케이션이 실행될 때 사용되는 C / C++ 라이브러리들을 포함하는 계층.
● 네이티브 라이브러리의 안드로이드 시스템 라이브러리를 통해 안드로이드 운영체제에서
다양한 시스템 레벨의 기능들
( 그래픽 처리, 오디오 및 비디오 인코딩/디코딩, 네트워크 연결, 데이터베이스 엑세스 등 ) 을 수행.
● 이 계층을 통해 안드로이드 NDK( Native Development Kit ) 를 사용하여,
C / C++ 코드를 작성하고, 이를 안드로이드 애플리케이션에 포함시켜 사용할 수 있습니다.
4. 하드웨어 추상화 계층 ( HAL : Hardware Abstraction Layer )
● 안드로이드 운영체제는 다양한 하드웨어 ( 카메라, GPS, 조도 센서, wifi 모듈 등)과 함께 동작하는데,
이 계층에서는 각각의 하드웨어를 추상화시켜서 애플리케이션 프레임워크 계층(2번)에 제공합니다.
● 하드웨어의 추상화된 인터페이스를 이용하는 덕분에,
안드로이드 앱 개발자들은 하드웨어와 관련된 복잡한 작업을 수행하지 않아도 됩니다.
● 하드웨어 추상화 계층은, 리눅스 커널 - 하드웨어(드라이버) 사이에서 작동합니다.
☆ 정리해보자면,
안드로이드 운영체제(OS)는
리눅스 커널과 4개의 안드로이드-소프트웨어 스택으로 구성되어 있으며,
" 리눅스 커널 " 은 안드로이드 운영체제의 핵심적인 관리자 역할을 수행하고
" 각각의 계층 " 에서는 필요한 기능들을 제공하여 안드로이드 애플리케이션 개발에 필요한 환경을 제공 !
3. 안드로이드 OS의 특징.
1. 오픈 소스
√ 개발자들이 소스 코드에 접근하여 이를 수정하고서 배포 가능.
√ 다양한 제조사가 자신들의 디바이스에 커스텀화 된 안드로이드 버전을 개발 가능.
2. 다양한 하드웨어 지원
√ 안드로이드는 다양한 하드웨어 플랫폼을 지원, 이식 = 포팅이 쉬움.
√ 제조업체가 다양한 종류의 기기를 출시할 수 있게 하며, 소비자에게는 더 많은 선택권을 제공 가능.
3. 구글 서비스와의 통합
√ 구글 플레이 스토어를 포함한 구글의 다양한 서비스와 밀접하게 통합.
√ 사용자는 앱, 게임, 책, 영화 등 다양한 컨텐츠에 쉽게 접근.
4. 커스터마이징 가능
√ 안드로이드는 홈 스크린 위젯, 라이브 배경화면, 다양한 런처 앱 등을 통해 사용자 맞춤화가 가능.
√ 자신의 디바이스를 개인의 취향에 맞게 조정.
5. 멀티태스킹
√ 강력한 멀티태스킹 기능을 지원.
√ 사용자가 여러 애플리케이션을 동시에 실행하고 쉽게 전환.
6. 기타.
√ 보안, 정기적인 업데이트, API 지원, 대규모 사용자 풀 등등..
4. 안드로이드에서 네이티브 코드란?
- 안드로이드에서 네이티브 코드란, C/C++ 등의 언어로 작성된 코드문을 의미합니다.
- > 네이티브 코드는 안드로이드 운영체제에서 직접 실행되기 때문에
Java 혹은 Kotlin과 같은 안드로이드 프로그래밍 언어보다 더 높은 성능을 제공합니다.
- > 안드로이드에서 네이티브 코드를 사용하려면, 안드로이드 NDK(Native Development Kit)을 사용해야 합니다.
NDK는 C/C++ 등의 네이티브 언어로 개발된 코드를 컴파일하고,
안드로이드 OS 상에서 실행 가능한 형태로 변환시켜주는 도구입니다.
- > NDK를 사용하려면, JNI ( Java Native Interface )를 사용하여 네이티브 코드와 자바 코드를 연결시켜줘야 함
JNI를 사용하면 자바 코드에서 네이티브 함수를 호출하거나,
네이티브 코드에서 자바 객체를 생성하거나, 자바 콜백 함수를 호출할 수 있습니다.
★ 주의할 점.
- 네이티브 코드는 안드로이드 OS와 밀접하게 연관되어 있기에, 호환성 문제가 발생 가능합니다.
- 네이티브 코드는 일반적으로 자바나 코틀린보다 낮은 수준의 언어로 작성되기 때문에,
보안 문제와 메모리 누수 등의 문제가 발생 가능합니다.
5. 프로세스와 스레드
☆ " 프로세스 " 와 " 스레드 " 는 모두 컴퓨터 시스템에서 " 실행 단위 " 를 나타냅니다.
= > " 실행 단위 " 란 프로그램 코드를 실행할 수 있는 최소한의 단위(규모)를 의미합니다.
∇ 프로세스 ( Process )
※ " 프로세스 " 는 실행중인 "프로그램의 인스턴스"이고 하나 이상의 스레드를 통해 실행됩니다.
- "프로그램 인스턴스"라는 것은, 특정 프로그램이 메모리(RAM)의 영역과 CPU 등
자원을 할당 받아서 실행되고 있는 상태를 의미합니다.
== " 프로세스 " 는 운영체제로부터 자원을 할당받는데,
이렇게 할당 받은 자원을 가지고 독립적으로 실행 됩니다.
★ '프로세스'는 메모리공간 * 파일핸들링*네트워크 연결 등, 자원을 독립적으로 사용하기 때문에
일반적으로 하나의 프로세스는 다른 프로세스에 접근할 수 없습니다.
☆ 프로세스가 다른 프로세스와 통신을 하기 위해서는
IPC ( Inter-Process Communication ) 메커니즘을 사용해야 합니다.
- > IPC는 다른 프로세스와 데이터를 주고받기 위한 방법으로,
안드로이드 환경에서는 [ Binder, Intent, Content Provider ] 등의 IPC 메커니즘을 주로 사용 !
◇ 프로세스의 메모리 영역
1. Code(Text) : 프로세스가 실행할 코드를 저장하는 메모리 영역입니다.
- 이 영역은 읽기 전용으로, 실행 중에 수정이 불가능합니다.
2. Data : 전역(Global) 변수와 정적(Static) 변수가 저장되는 메모리 영역입니다.
- 이 영역은 실행 중에 수정이 가능합니다.
- BSS : 초기화되지 않은 변수가 저장되는 곳
- Data : 초기화된 변수가 저장되는
3. Heap : 동적으로 할당되는 메모리 영역입니다.
- 메모리를 동적으로 할당하여 사용하는 경우, 이 영역에서 할당됩니다.
4. Stack : 함수 호출과 관련된 지역 변수 * 매개변수 * 함수 호출 시 저장되는
반환 주소 등이 저장되는 메모리 영역입니다.
- 스택은 후입선출(LIFO) 구조로 동작하며, 함수 호출과 관련된 정보가 스택에 쌓이고
함수가 반환되면 해당 정보가 스택에서 제거됩니다.
∇ 스레드 ( Thread )
※ " 스레드 " 는 프로세스 내부에서 실행되는 실행 단위입니다.
- 스레드는 부모 프로세스 내의 메모리 공간을 차지하고,
부모 프로세스로부터 자원을 공유 받아아서 사용합니다.
== 모든 영역의 자원을 공유하는 것 X
- > 스레드는 프로세스의 메모리 영역 중 Code, Data, Heap 영역만 공유
[ Stack 영역은 고유하게 가지게 됨 ]
- > 스레드는 프로세스로부터 자원을 공유 받기 때문에,
하나의 프로세스에서 여러개의 스레드가 동시 실행되는 경우, 자원 충돌(경합)이 발생 가능.
- > 자원 충돌을 방지하기 위해,
스레드는 프로세스 내에서 공유한 자원에 대해 동기화 과정이 필요.
∇ 안드로이드에서 프로세스와 스레드.
※ 안드로이드 앱은 일반적으로 하나의 프로세스에서 실행되며,
각각의 액티비티, 서비스, 브로드캐스트 리시버, 콘텐츠 프로바이더 등의 컴포넌트는
단일 스레드 모델에 따라, 단일 스레드에서 실행 됩니다.
§ 안드로이드에서 단일-스레드 모델을 사용하는 이유.
√ 앱의 생명 주기를 관리하기 용이
√ UI 업데이트 및 이벤트 처리를 단순하게 만들 수 있다는 점.
+ √ 불필요하게 멀티-스레드 방식을 사용하는 경우,
CPU와 메모리 자원을 과도하게 사용하여 기기의 성능에 부정적 영향을 줄 수 있음.
But,
필요한 경우 manifest 파일에서 컴포넌트가 실행되는 프로세스를 별도로 지정할 수 있고
여러 스레드를 사용하여 앱을 실행 가능합니다.
§ 안드로이드에서 멀티 프로세스 개념도 중요하지만, 더 중요한 것은 멀티 스레드
◎ 안드로이드 앱은 일반적으로 '단일-스레드'에서 실행되는데
이 단일 스레드를 '메인스레드' 혹은 'UI스레드'라고 합니다.
- > 안드로이드앱이 단일 스레드로 실행되는 과정에서,
네트워크 작업 * 데이터베이스 작업 * 파일 입출력 등 자원을 많이 소모하는 작업을 하는 경우에 UI 스레드는 비중 높은 작업들이 완료될 때가지 멈춘 상태를 유지하게 됩니다.
-- > 이 경우 '5초 이상 동안' UI 스레드가 멈춰 있게 되면,
ANR(Application Not Responding) 오류가 발생하게 됩니다.
☆ 이 문제를 해결하기 위해서,
무거운 작업들은 UI 스레드에서 분리하여 별도의 스레드가 처리하도록 하는 방식의
멀티-스레드 방식을 사용해야 합니다.
§ 안드로이드에서 멀티 스레드 방식을 사용할 때, 지켜야하는 규칙들.
○ UI 업데이트는 메인 스레드(UI스레드)에서만 처리해야 합니다.
: UI업데이트를 메인 스레드에서 처리하지 않으면, 앱이 느려지거나 멈추는 문제 발생 가능
- > 백그라운드 스레드에서 작업한 후
그 결과를 가지고 메인 스레드에서 UI를 업데이트 해야합니다.
○ 백그라운드 작업은 별도의 스레드에서 처리해야 합니다.
: 메인 스레드에서는 오랜 시간이 걸리는 작업을 처리하지 않아야 합니다.
- > 대신에, Coroutine, RxJava 와 같은 라이브러리들 혹은
AsyncTask, Handler, ThreadPoolExecutor 등과 클래스들을 통하여
백그라운드 스레드에서 작업을 처리해야 합니다.
- > 특히, 안드로이드 앱에서 네트워크 작업 등의 I/O 작업은 반드시 비동기적으로 처리!
○ 메모리 누수에 대해서 고려해야 합니다.
: 멀티 스레드는 단일 스레드보다 더 많은 메모리를 소모하므로,
작업이 완료된 후 AsyncTask 같은 객체의 참조를 해제하여 메모리 누수를 방지해야 합니다.
○ 공유 자원에 대한 접근에 주의해야 합니다.
: 여러 개의 스레드가 동시에 공유 자원에 접근하는 경우,
안전성을 높이기 위해서는 Synchronized 또는 Lock 등을 통한 추가적이 작업이 필요합니다.
6. 프로세스 우선순위
※ " 프로세스 우선순위 " 란
프로세스가 시스템 자원을 어떤 우선순위를 가지고 사용할지를 결정하는 방법을 의미!
== 중요도가 낮은 프로세스부터 종료시키면서, 시스템 자원을 관리합니다.
☆ 안드로이드 개발자가 '안드로이드 프로세스 우선순위를 알아야 하는 이유
@ 안드로이드는 메모리가 부족할 때, 중요도가 낮은 프로세스를 제거하기 때문에
개발자는 어떤 상황에서 자신의 앱이 종료될 수 있는지를 알고 대비해야 함.
@ 안드로이드 프로세스 우선순위에 따라 CPU 자원(시간)을 배분하는 CPU-스케쥴링을 하기 때문에
개발자는 자신의 앱이 필요한 성능과 배터리 소모 현황 등을 파악하고 최적화해야 합니다.
@ 안드로이드 프로세스 우선순위에 따라 메모리, 네트워크, 파일 등을 할당하기 때문에
개발자는 자신의 앱이 필요한 자원을 적절하게 요청하고 해제해야 합니다.
◇ 안드로이드의 프로세스 우선 순위.
§ 안드로이드의 프로세스 우선 순위는 5가지로 분류됩니다.
+ 중요도가 높은 순서대로
A. 활성 프로세스 ( Foreground Process )
: 현재 사용자와 직접 상호작용하는 Activity나 Service를 가진 프로세스.
B. 화면에 보이는 프로세스 ( VIsible Process )
: 현재 화면에 보이지만 사용자와 상호작용하지는 않는 Activit나 Service를 가진 프로세스.
C. 시작된 서비스 프로세스 ( Started Service Process )
: 화면에 직접적으로 표시되지는 않지만, 계속 실행되는 서비스를 가진 프로세스.
D. 백그라운드 프로세스 ( Background Process )
: 화면에 보이지 않는 액티비티나 실행 중이지 않는 서비스를 가진 프로세스.
E. 빈 프로세스 ( Empty Process )
: 앱의 수명주지가 종료되고 메모리에 캐시되어 남아있는 프로세스.
'App_Dev > Android' 카테고리의 다른 글
[ 앱 개발자 도전기 : 안드로이드 ] View가 그려지는 순서 (0) | 2024.11.07 |
---|---|
[ 앱 개발자 도전기 : 안드로이드 ] 안드로이드의 Activity LifeCycle ( 액티비티 생명주기 ) (1) | 2024.11.07 |
[ 앱 개발자 도전기 : 안드로이드 ] 안드로이드 4대 컴포넌트 정리. (1) | 2024.11.07 |
[ 앱 개발자 도전기 : 안드로이드 ] 안드로이드 UI - - 뷰(View)와 XML 레이아웃 기본 구조 (0) | 2024.11.04 |
[ 앱 개발자 도전기 : 안드로이드 ] Android의 동작 원리. (2) | 2024.11.04 |