IT_Programming/Android_Java

[펌] Android 프로세스의 통신 메커니즘: 바인더

JJun ™ 2013. 7. 23. 01:04

 


 출처: http://helloworld.naver.com/helloworld/47656


 

 

NHN 게임공통개발팀 안준석

 

 

손안의 PC라고 부르는 스마트폰의 하드웨어 성능이 높아지면서 스마트폰이 점점 PC의 역할을 대체하고

있습니다. 그러다 보니 자연스럽게 멀티코어 CPU에서 멀티태스킹을 지원하고 다양한 멀티미디어 작업을

처리할 수 있는 모바일 운영체제가 나오기 시작했는데, 대부분 PC 운영체제를 근간으로 합니다.

 

기존 PC 운영체제의 아키텍처는 유지하면서 모바일 환경에 맞게 커널(Kernel)의 일부를 수정하고 필요한 기능을 집어넣어 최적화했습니다. Microsoft의 Window Mobile과 Apple의 iOS가 대표적이고, Google의 Android는 Linux 커널을 기반으로 합니다.

 

이 글에서는 복잡하고 거대한 Android 플랫폼의 핵심 설비인 바인더(Binder)에 대해 알아보겠습니다.

 

 

 

손안의 PC 스마트폰, PC 운영체제도 손안으로!

 

'PC 운영체제가 스마트폰으로 들어가면, 무엇이, 어떻게, 왜 수정될까?'라는 물음이 생긴다면

오픈소스인 Android 플랫폼에서 답을 찾을 수 있다. 감히 최신 기술의 총아라고 말할 수 있을 정도로

소프트웨어 기술이 집약되어 있고 커뮤니티에 많은 정보가 있을 뿐만 아니라 오픈소스이기 때문에

직접 수정해 볼 수도 있다.

 

Android는 Linux 커널의 메모리, 멀티태스킹, 파일 관리 등 강력한 기반 설비를 흡수했다.

또한 Dalvik VM을 기반으로 Java를 이용한 응용프로그램을 개발할 수 있도록 각종 개발 도구를 제공함으로써 개발 진입 장벽을 낮췄다. 그 뿐만 아니라 시스템 기반 설비는 C++로 작성되어 더욱 생산성 높은 코드를 제공한다. C++로 개발한 것이 다른 임베디드 시스템과 비교했을 때 장점이라고 Android 개발진이 내세우기도 한다.

 

이처럼 Android는 Linux 커널, C++, Java, Dalvik VM 등 수많은 기술이 녹아 있는 플랫폼이다.

 

그림 1 Android 플랫폼의 구조

(원본 출처: http://sites.google.com/site/io/anatomy--physiology-of-an-android)

 

 

 

뛰고 날아도 결국 Linux 프로세스일 뿐!

 

Android는 프로세스 단위의 컴포넌트 모델을 제공한다.

즉, Eclipse에서 Java로 내가 만든 애플리케이션이나 카메라 기능을 제공하는 시스템 서비스,

화면 출력을 담당하는 시스템 서비스 등 Android 컴포넌트는 결국 Linux의 프로세스로 표현된다.

 

그림 2 Linux 커널의 프로세스 관리

 

 

Linux의 메모리, 프로세스, 파일 관리를 기반으로 동작하기 때문에 시스템 서비스 역시 Linux 프로세스로 격리(isolation)되어 보호되면서 동작한다. 시스템 프로세스는 C++ 네이티브 코드뿐만 아니라 Java 코드로 작성되어 Dalvik VM에서 동작하는 서비스(Wi-Fi, Location, Activity Service 등)도 있다.

 

스마트폰과 같은 모바일 기기를 지원하기 위해 Android에서 기본으로 제공하는 시스템 기능은 모두 서버

프로세스 형태로 제공된다. 즉, 화면을 그리거나(Surface Flinger) 소리를 내고 조절(Audio Flinger)하는

기능 등을 사용하려면 사용자 모드(User Mode)에서 동작하는 별도의 프로세스에 화면을 그리고 소리를

내라고 요청해야 한다.

 

 

그림 3 Linux 프로세스로 구동되는 Android 시스템 서비스와 애플리케이션

 

 

예를 들어 내가 만든 응용프로그램에서 Android SDK가 제공하는 위치 정보를 얻는 API를 호출할 때

내부적으로는 Location 서비스를 제공하는 Linux 프로세스로 요청을 보내고 결과를 응답받아 처리한다.

카메라를 사용할 때도 마찬가지로 Camera 서비스와 상호 연동한다.

 

그림 4 애플리케이션 프로세스의 Location 서비스와 Camera 서비스 호출

 

 

모든 시스템 서비스가 서버 프로세스 형태로 제공되기 때문에 다른 프로세스로 요청과 응답을 보내는

메커니즘이 필요한데, 이 메커니즘이 바인더(Binder)이다. Android에서는 다른 프로세스가 제공하는 기능을

바인더를 통해 사용한다.

 

그림 5 안드로이드의 프로세스간 통신 인프라 바인더(Binder)

 

 

그렇다면 Linux에서 제공하는 소켓, Pipe 등과 같은 IPC(Inter Process Communication)를 사용하지 않고 왜 바인더라는 메커니즘을 새로 만들었을까? 바로 성능 때문이다.

 

앞서 살펴본 것처럼 Android 의 모든 시스템 기능은 서버 프로세스로 제공되기 때문에 프로세스 사이에

최적화된 통신 방법이 필요하고 그 고민의 결과가 바인더이다.

 

바인더는 모든 프로세스가 공유하는 커널 메모리를 참조하게 함으로써 메모리 복사 오버헤드를 최소화한다. 뿐만 아니라 C++을 이용해 작성된 RPC(Remote Procedure Call) 프레임워크를 제공하여 생산성이 높다.

시스템에서 제공하는 기능을 서버 프로세스 형태로 제공하고 바인더 메커니즘을 통해 요청과 응답을 받는 구조이다. 이와 같은 Android 플랫폼의 구조에는 어떤 장점이 있을까?

 

  • 손쉬운 기능 확장/제거: 새로운 시스템 서비스를 추가하거나 기존의 기능을 제거하기 쉽다.
  • 손쉬운 포팅: 새로운 프로세서로 포팅 시 변경 부위가 작다. 포팅을 위한 툴체인도 제공된다.
  • 손쉬운 테스트: 테스트가 컴포넌트 단위로 한정되어 전체를 테스트하는 번거로움이 줄고
                         엄격하게 테스트할 수 있다.
  • 분산 시스템 지원: 바인더 기반의 프로세스 통신을 하기 때문에 컴포넌트 간 위치 투명성이
                             보장된다.

 

이와 같은 장점은 마이크로커널(Microkernel) 구조의 운영체제가 갖는 장점과 매우 흡사하다.

그럼 바인더에 대해 좀 더 상세히 알아보자.

 

 

 

모든 기능을 엮는 바인더

 

사실 바인더 메커니즘의 아이디어는 간단하다.

"모든 프로세스가 공유할 수 있는 영역에 요청 내용과 응답 내용을 쓰고,

각 프로세스가 그 메모리 주소를 참조하게 하자."라는 것이다. 이를 위해 커널 공간이 사용된다.

 

  그림 6 모든 프로세스가 공유하는 커널 공간

 

 

커널 공간을 사용하도록 바인더 드라이버가 구현되어 있다.

바인더 드라이버의 역할은 각 프로세스가 매핑해 놓은 메모리 주소와 커널 공간의 메모리 주소를 변환하여 참조해 사용할 수 있도록 하는 것이다.

 

그림 7 바인더 드라이버 구성

 

 

Linux에서 사용하는 표준 방법인 ioctl 시스템 함수를 이용해 바인더 드라이버를 사용할 수 있다.

이와 같은 일련의 메커니즘을 바인더 IPC라고 한다.

 

그림 8 바인더 드라이버를 통한 프로세스 간 사용자 데이터 송수신 구조

 

 

바인더 IPC를 이용해 주고받는 데이터를 가공해서 RPC(Remote Procedure Call)로 만들어 주는

C++ 프레임워크가 제공되고 시스템 서비스를 만들 때 사용한다.

다른 프로세스에서 제공하는 함수를 마치 내 함수처럼 사용할 수 있게 되는 것이다.

 

 

그림 9 바인더 드라이버에서 송수신된 데이터를 RPC로 해석하는 C++ 프레임워크

 

 

 

 

마치면서

지금까지 바인더를 구성하고 있는 드라이버, IPC, RPC 세 가지를 간단하게 살펴봤다.

바인더는 Android 플랫폼의 근간으로 바인더 드라이버는 앞으로 Linux 커널의 메인 버전에 포함될

예정이다. Androd와 바인더에 대해 설명한 내용을 다시 정리하면 다음과 같다.

 

  • PC 운영체제가 스마트폰 운영체제로 최적화되고 있고,
    Android는 Linux 커널을 근간으로 한다.
  • Android는 프로세스 단위의 컴포넌트 모델을 갖고 있고 서버 프로세스 형태로 시스템 기능을 제공하는데, 프로세스 간 기능 메시업(Mesh-up)을 위해 바인더 설비를 제공한다.
  • Android의 바인더는 커널 메모리 참조를 이용해 모바일 기기에 최적인 프로세스 간 통신을
    지원한다.

 

방대한 Android의 내용 중 짧은 글에서 소화할 수 있는 정도로만 글을 작성했다.

Android 플랫폼을 살펴보는데 작으나마 도움이 되길 기대해 본다.