본문 바로가기
Android

인사이드 안드로이드 03 init 프로세스

by OKOK 2021. 5. 15.

init 프로세스

3.1 init 프로세스의 실행 과정

init 프로세스는 자식 프로세스의 종료 처리뿐만 아니라 앱이 디바이스 드라이버에 접근할 떄 사용하기 위한 디바이스 노드 파일을 생성하며, 시스템 동작에 필요한 환경 변수를 저장하는 프로퍼티 서비스를 제공함. 리눅스의 프로세스들은 서로 정보를 교환하기 위해 메시지를 주고 받는데, 이러한 메시지를 시그널이라고 함. 그리고 각 프로세스는 다른 프로세스에서 발생하는 시그널을 처리하기 위한 루틴을 등록하는데 이를 시그널 핸들러라고 함. 발생한 시그널에 대한 실제 처리는 init 프로세스 동작 과정의 마지막 단계인 이벤트 처리 루프에서 이뤄짐.

 

모든 프로세스에서 시스템의 설정 값을 공유하기 위해 프로퍼티라는 이름의 저장소를 제공함. 공유 메모리 영역에서 생성 및 초기화됨.

 

액션 리스트는 시스템 환경 변수를 등록하거나 리눅스 명령어들을 통해 부팅 시 필요한 디렉터리 생성이나 특정 파일에 대한 퍼미션을 지정한다. 그리고 서비스 리스트는 부팅 시 실행하는 프로세스를 기술한다.

안드로이드는 휴대폰을 타겟으로 제작된 OS이므로 기본적으로 휴대폰의 하드웨어 상태를 많이 따른다

 

안드로이드 앱은 구동 상태에 따라 그룹이 나뉜다.

서비스 섹션에는 프로세스의 실행에 관한 옵션이 기술됨. service 섹션의 프로세스는 모두 서비스 리스트에 등록되며, init 프로세스가 실행되면서 서비스 리스트에 등록된 프로세스를 순차적으로 실행하게 됨. 

 

리눅스에서는 동작 중 필요한 디바이스 노드 파일을 "/dev/" 디렉터리에 미리 정의해 둠. 

바인더 드라이버는 실제 하드웨어가 존재하지 않는 가상의 장치이며, 프로세스 간의 RPC(remote Procedure Cell)를 제공하는 데 쓰임. servicemanager는 재시작되면 on_restart() 함수를 통해 zygote와 media프로세스를 재시작시킴. 

 

3.6 프로퍼티 서비스

init 프로세스의 이벤트 처리 루프에서 처리하는 또 한 가지 이벤트는 프로퍼티의 변경 요청. 

 

3.7 정리

루트 파일 시스템 포팅시 가장 먼저 만나게 되는 일이 init 프로세스가 제대로 실행되지 않고 종료되는 문제임. 이는 디바이스 노드 파일이 적절하게 생성하지 않았거나, init.rc의 내용을 잘못 기술했거나 하는 등의 init 프로세스의 동작을 잘 이해하지 못해 발생하는 문제임.

댓글