Android 면접 예상 질문 02

Hudson Park
5 min readDec 30, 2019

--

Zygote

안드로이드를 개발하다보면 가상머신 실행 시 Log Console 창에 Zygote라는 키워드가 항상 찍히는 것을 확인 할 수 있다. 이에 Zygote란 무엇인가에 대한 의문점을 해소하기 위에 이 글을 작성하게 되었다.

  1. Zygote의 정의 및 사용목적
  • 가상머신의 생성과 새로운 프로세스의 시작을 fork() 처리 (애플리케이션 시작시간 감축)

// fork() : 자기 자신의 알고리즘을 복제하는 함수

  • 메모리 공유를 최적화

즉, 가상머신이 어플리케이션이 실행되기 위한 모든 준비를 미리 마쳐 놓고, 어플 실행 시에 준비된 가상머신을 복제하여 미리 준비된 클래스와 리소스의 참조를 활용 가능하게 함, 어플리케이션의 성능 증대에 기여함

Android Zygote Process
  • Zygote의 원리 및 아이디어

Zygote는 COW(Copy On Write)를 통해 이미 메모리 상에서 동작 중인 프로세스의 재사용성을 극대화하고 공유 라이브러리를 통해 메모리 사용량을 최소화

COW(Copy On Write)

부모 프로세스 — 새로 생성된 자식 프로세스 메모리 공유 방식 → 오버헤드 大

부모 프로세스 — 새로 생성된 자식 프로세스 메모리참조 방식(COW)

Zygote Process Overview

Zygote 프로세스 → Zygote` 프로세스 ( fork() 시스템콜 호출 ) : 코드 영역과 링크 정보 공유

복제된 Zygote` 프로세스 내 달빅 가상머신 위에서 Application 실행

( 이미 Zygote 프로세스가 구성해 놓은 라이브러리 및 리소스에 대한 링크 정보를 그대로 사용하기에 빠르게 실행)

2. Zygote Process

2–1 init 프로세스에서 init.rc를 파싱하는 과정에서 zygote의 app_process를 실행

Zygote Exec process

2–2 app_process에서 Dalvik VM의 생성과 ZygoteInit 진입

  • AppRuntime 객체 생성 및 실행
  • 달빅 가상 머신의 생성
  • ZygoteInit 클래스의 실행

2–3 ZygoteInit 진입 후 새로운 어플리케이션 실행 요청을 받기 위한 소켓 바인딩

  • ZygoteInit의 기능

dev/socket/zygote 소켓 바인딩

애플리케이션 프레임워크에 속한 클래스와 플랫폼 자원의 로딩

SystemServer 실행

2–4 preload 되는 class들과 resource들을 로드

2–5 system server 실행 : audio / surface flinger, MediaPlayerServer, CameraServer, 각종 매니저 및 service frameworks 등등

2–6 어플리케이션 실행요청에 대한 처리 : forkAndSpecialize로 자기복제 및 어플리케이션 클래스를 로드

3. 안드로이드 프레임워크의 시작 과정과 Zygote 실행 흐름

Reference

--

--

Hudson Park

stay hungry, stay foolish / cool head and warm heart