SlideShare uma empresa Scribd logo
1 de 50
Baixar para ler offline
Android 프로세스들의 통신 메커니즘
    바인더 이야기
        Joonseok
        2012.05.19 @ SDC3




                       주체 : 온라인 서버 개발자 모임
                       후원 : 넷텐션
개요

• Android 플랫폼의 C++ 코드를 살펴 본다.

• Android 아키텍처 구조를 살펴본다.

• Android 는 프로세스 기반 컴포넌트 프로그
  래밍 모델을 제공한다. 프로세스 간 메쉬업을
  위한 기반 설비 인 바인더에 대해 알아 본다.
같은 곳을 바라 보다..

ANDROID 코드를 보다.
https://github.com/android
Android C++ 코드들을 보면..
RefBase

class BnSurface : public BnInterface<ISurface>

    sp<IBinder>
                            void*

                 reinterpret_cast<>
①
②
③
객체 관리 @Android                      ①
/frameworks/base/utils/StrongPointer.h
객체 관리 @Android


                 wp<>.promote()
                 를 통한 약한
                   참조로
                  순환 참조
                  문제 해결
Strong Pointer    Weak Pointer
 강한 참조            약한 참조

 객체소유권O           객체소유권X
객체생명관리O          객체생명관리X
②
    BBinder




 BnInterface<>   IAudioManager




BnAudioManager
템플릿 상속#1
                     A, B 는 변경하지 않고
                     다양한 X 를 상속 받는 방법은?
class A
{
};
                          A
class B : public A
{
};

class C : public B        B         X#1
{
};                                   X#2


                          C
템플릿 상속#2
class A                 Binder C++ Library
{
};

template<class T>            BBinder
class B
   : public A
   , public T
{
};                        BnInterface<>      IAudioManager


class X
{
};
                         BnAudioManager
class C : public B<X>
{
};
③

Poll? Epoll?
PC OS, Linux 프로세스


ANDROID
PC OS가
스마트폰 속으로..
Android




C++ Infra
               Java Infra
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
JAVA Layer
    J
    N
    I
C/C++ Layer
BioniC DalvikVM

        Binder
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
Process
Process
                               Process
           Process




          Linux Kernel
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
시스템 서비스 프로세스         애플리케이션 프로세스


                     Process
Process               VM
                               Process
           Process
                                VM




          Linux Kernel
시스템 서비스 프로세스         애플리케이션 프로세스


                     Process
Process               VM
                               Process
  VM       Process




          Linux Kernel
시스템 서비스 프로세스        애플리케이션 프로세스



Location
 서비스
                         응용
  VM                    프로그램

                         VM


           Carmera
            서비스
시스템 서비스 프로세스               애플리케이션 프로세스



Process                    Process

                             VM
  VM         바인더
                (Binder)

                                     Process
          Process
같은 곳을 바라 보다..

메쉬업 도구. 바인더 RPC!
class B
                                         {
   B.Call(int value)
                                            void Call(int value)
                                         }


   b->Call( 1004 )                       B* b = new B
                       ③ RPC데이터
② 조회 - 획득                『B프로세스의 b 에
                          1004 를 인자로           ① 생성 - 등록
                         Call() 메소드호출』




                       0x01 : B 프로세스 / b
class B
                                        {
B.Call(int value)
                                           void Call(int value)
                                        }


b.Call( 1004 )                          B* b = new B
                                        Int arg = data.arg
 『B프로세스의 b 에                            switch(code)
  1004 를 인자로                            {
 Call() 메소드호출』                          case “Call() 메소드호출” :
                                           b->Call();
                         ⑤ 해석              break;
 ④ 룩업                                   …
                                        }


                    0x01 : B 프로세스 / b
class B
                                        {
B.Call(int value)
                                           void Call(int value)
                                        }
        ② 조회 - 획득                       ① 생성 - 등록
b.Call( 1004 )                          B* b = new B
③ RPC데이터                           Int arg = data.arg
 『B프로세스의 b 에                       switch(code)
  1004 를 인자로                       {
 Call() 메소드호출』                     case “Call() 메소드호출” :
                                      b->Call();
                             ⑤   해석 break;
                                   …
    ④ 룩업                           }


                    0x01 : B 프로세스 / b
브로커 패턴
                    transfer                     transfer
                    message                      message
Client-side                  Broker                         Server-side
Proxy                                                       Proxy
                            바인더 설비
                            main_event_loop
pack_data                                                   pack_data
                            update_repository
uppack_data                                                 uppack_data
                            register_service
send_request                                                call_service
                            acknowledgment
return                                                      send_response
                            find_server
                            Find_client
calls                       Forward_request
                            Forward_response


                 uses API          calls        uses API              calls

Client                      Bridge                          Server

                            pack_data                       initialize
call_server
                            uppack_data                     enter_main_loop
start_task
                            forward_message                 run_service
use_Broker_API
                            transmit_message                use_Broker_API
프로세스 A            프로세스 B


         int* a
                    ?      int b
사용자 공간




                  커널 공간
                  IPC 설비
프로세스 A           프로세스 B


             Android IPC 솔루션
사용자 공간


          쓰레드#1            쓰레드#1
              바인더 드라이버
          쓰레드#2            쓰레드#2




                  커널 공간
프로세스 A           프로세스 B


               커널 공간은
사용자 공간


          쓰레드#1            쓰레드#1
              모든 프로세스들이
          쓰레드#2
                공유한다.      쓰레드#2




                  커널 공간
프로세스 A                    프로세스 B

                           물리메모리
가상 메모리




         0x1000 ~ 0x2000




                                   0x3000 ~ 0x4000
프로세스 A                      프로세스 B




 사용자 Data                    사용자 Data


   송신                          수신
바인더 프로토콜                    바인더 프로토콜
BC_TRANSACTION              BR_TRANSACTION




                 바인더 드라이버

                 커널 공간
프로세스 A                                                프로세스 B
                     “A 에서 B 로 데이터 송신”

   사용자 Data          struct binder_transaction_data
                                                         사용자 Data
                     {
                        size_t       handle;
     송신                 unsigned int code;                 수신
  바인더 프로토콜              void         *buffer;           바인더 프로토콜
  BC_TRANSACTION     };                                 BR_TRANSACTION

BINDER_WRITE_READ                                     BINDER_WRITE_READ

      ioctl()                                               ioctl()

                    switch (바인더프로토콜)
                    {
                    case BC_TRANSACTION : {…}
                    case BR_TRANSACTION : {…}
                    }



                           커널 공간
프로세스 A                                       프로세스 B


 사용자 Data
          바인더 RPC                             사용자 Data


   송신                                           수신
바인더 프로토콜                                     바인더 프로토콜
BC_TRANSACTION                               BR_TRANSACTION




    ioctl()   바인더 IPC
                 switch (바인더프로토콜)
                                                 ioctl()


                 {
                 case BC_TRANSACTION : {…}


 바인더 드라이버
                 case BR_TRANSACTION : {…}
                 }
BpServiceManager
  addService()




 BpBinder
 transact()
BnServiceManager
  onTransact()




 ServiceManager
   addService()
원 밖의 원.

마무리
정리
• Android 는 스마트포인터, 템플릿 상속, epoll 을 통한 이벤
  트 처리기를 구현하고 있다.

• Android 는 프로세스 단위의 컴포넌트 모델을 갖고 있고 서
  버 프로세스 형태로 시스템 기능을 제공하는데, 프로세스 간
  기능 메쉬업(Mesh-up)을 위해 바인더 설비를 제공한다.

• Android 의 바인더(Binder) 는 커널 메모리 참조를 이용해
  모바일 기기에 최적인 프로세스 간 통신을 지원한다.
참고자료

•   Microsoft “Singularity OS”
•   Google IO
•   Wikipedia.org
•   Kandroid.org
•   Naver 웹툰
•   인사이드 안드로이드
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
감사합니다.

Mais conteúdo relacionado

Destaque

MinWin에 대해서
MinWin에 대해서MinWin에 대해서
MinWin에 대해서OnGameServer
 
Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프OnGameServer
 
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows TerminalOnGameServer
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기OnGameServer
 
SDC 3rd 최흥배님 - Boost.multi_index 사용하기
SDC 3rd 최흥배님 - Boost.multi_index 사용하기SDC 3rd 최흥배님 - Boost.multi_index 사용하기
SDC 3rd 최흥배님 - Boost.multi_index 사용하기OnGameServer
 
Microsoft SharePoint를 활용한 개발환경 구축
Microsoft SharePoint를 활용한 개발환경 구축Microsoft SharePoint를 활용한 개발환경 구축
Microsoft SharePoint를 활용한 개발환경 구축OnGameServer
 
해외 취업 이야기
해외 취업 이야기해외 취업 이야기
해외 취업 이야기OnGameServer
 
Multi thread game server
Multi thread game serverMulti thread game server
Multi thread game serverOnGameServer
 
IPv6 이론과 소켓 프로그래밍
IPv6 이론과 소켓 프로그래밍IPv6 이론과 소켓 프로그래밍
IPv6 이론과 소켓 프로그래밍OnGameServer
 
초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기OnGameServer
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기OnGameServer
 
임영기님 - 코드 리뷰 시스템 도입하기
임영기님 - 코드 리뷰 시스템 도입하기임영기님 - 코드 리뷰 시스템 도입하기
임영기님 - 코드 리뷰 시스템 도입하기OnGameServer
 
스마트폰(모바일) 금융서비스의 미래
스마트폰(모바일) 금융서비스의 미래스마트폰(모바일) 금융서비스의 미래
스마트폰(모바일) 금융서비스의 미래Smith Kim
 
Samsung Pay, The future of Pay
Samsung Pay, The future of PaySamsung Pay, The future of Pay
Samsung Pay, The future of PayJay JH Park
 
造訪蓮因寺
造訪蓮因寺造訪蓮因寺
造訪蓮因寺Emma Chang
 

Destaque (20)

MinWin에 대해서
MinWin에 대해서MinWin에 대해서
MinWin에 대해서
 
Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프
 
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
 
SDC 3rd 최흥배님 - Boost.multi_index 사용하기
SDC 3rd 최흥배님 - Boost.multi_index 사용하기SDC 3rd 최흥배님 - Boost.multi_index 사용하기
SDC 3rd 최흥배님 - Boost.multi_index 사용하기
 
Microsoft SharePoint를 활용한 개발환경 구축
Microsoft SharePoint를 활용한 개발환경 구축Microsoft SharePoint를 활용한 개발환경 구축
Microsoft SharePoint를 활용한 개발환경 구축
 
해외 취업 이야기
해외 취업 이야기해외 취업 이야기
해외 취업 이야기
 
Multi thread game server
Multi thread game serverMulti thread game server
Multi thread game server
 
IPv6 이론과 소켓 프로그래밍
IPv6 이론과 소켓 프로그래밍IPv6 이론과 소켓 프로그래밍
IPv6 이론과 소켓 프로그래밍
 
초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기
 
임영기님 - 코드 리뷰 시스템 도입하기
임영기님 - 코드 리뷰 시스템 도입하기임영기님 - 코드 리뷰 시스템 도입하기
임영기님 - 코드 리뷰 시스템 도입하기
 
스마트폰(모바일) 금융서비스의 미래
스마트폰(모바일) 금융서비스의 미래스마트폰(모바일) 금융서비스의 미래
스마트폰(모바일) 금융서비스의 미래
 
Anatomy of Realm
Anatomy of RealmAnatomy of Realm
Anatomy of Realm
 
Samsung Pay, The future of Pay
Samsung Pay, The future of PaySamsung Pay, The future of Pay
Samsung Pay, The future of Pay
 
Dream
DreamDream
Dream
 
造訪蓮因寺
造訪蓮因寺造訪蓮因寺
造訪蓮因寺
 
3亭賢結婚
3亭賢結婚3亭賢結婚
3亭賢結婚
 
Trimax | reclamefotografen food fotografie
Trimax | reclamefotografen food fotografieTrimax | reclamefotografen food fotografie
Trimax | reclamefotografen food fotografie
 
2012過年3 3
2012過年3 32012過年3 3
2012過年3 3
 

Semelhante a 안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기

안드로이드 오픈소스 패턴 - 0.1
안드로이드 오픈소스 패턴 - 0.1안드로이드 오픈소스 패턴 - 0.1
안드로이드 오픈소스 패턴 - 0.1YoungSu Son
 
안드로이드 오픈소스 그리고 패턴
안드로이드 오픈소스 그리고 패턴  안드로이드 오픈소스 그리고 패턴
안드로이드 오픈소스 그리고 패턴 YoungSu Son
 
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서tcaesvk
 
안드로이드 개발자에 필요한 오픈소스이야기
안드로이드 개발자에 필요한 오픈소스이야기안드로이드 개발자에 필요한 오픈소스이야기
안드로이드 개발자에 필요한 오픈소스이야기YoungSu Son
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung Ha
 
자동화빌드서버
자동화빌드서버자동화빌드서버
자동화빌드서버성기 홍
 
Red Hat Ansible 적용 사례
Red Hat Ansible 적용 사례Red Hat Ansible 적용 사례
Red Hat Ansible 적용 사례Opennaru, inc.
 
Service mesh(istio) monitoring
Service mesh(istio) monitoringService mesh(istio) monitoring
Service mesh(istio) monitoringJeong-Ho Na
 
[2015-05월 세미나] 파이선 초심자의 Openstack
[2015-05월 세미나] 파이선 초심자의 Openstack[2015-05월 세미나] 파이선 초심자의 Openstack
[2015-05월 세미나] 파이선 초심자의 OpenstackOpenStack Korea Community
 
세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발Jay JH Park
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019min woog kim
 
Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나병걸 윤
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계Chiwon Song
 
비트코인 소스 구조분석
비트코인 소스 구조분석비트코인 소스 구조분석
비트코인 소스 구조분석ryanhuh
 
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축Ji-Woong Choi
 
Multithread pattern 소개
Multithread pattern 소개Multithread pattern 소개
Multithread pattern 소개Sunghyouk Bae
 
아해2019 SpringAOP 문겸
아해2019 SpringAOP 문겸아해2019 SpringAOP 문겸
아해2019 SpringAOP 문겸MoonGyeom1
 
[OpenInfra Days Korea 2018] (Track 1) Kubernetes 환경에서의 Volume 배포와 데이터 관리의 유연성...
[OpenInfra Days Korea 2018] (Track 1) Kubernetes 환경에서의 Volume 배포와 데이터 관리의 유연성...[OpenInfra Days Korea 2018] (Track 1) Kubernetes 환경에서의 Volume 배포와 데이터 관리의 유연성...
[OpenInfra Days Korea 2018] (Track 1) Kubernetes 환경에서의 Volume 배포와 데이터 관리의 유연성...OpenStack Korea Community
 
Before OTD EDU Assignments
Before OTD EDU AssignmentsBefore OTD EDU Assignments
Before OTD EDU AssignmentsBeom Lee
 
UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기
UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기
UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기Mark Lee
 

Semelhante a 안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기 (20)

안드로이드 오픈소스 패턴 - 0.1
안드로이드 오픈소스 패턴 - 0.1안드로이드 오픈소스 패턴 - 0.1
안드로이드 오픈소스 패턴 - 0.1
 
안드로이드 오픈소스 그리고 패턴
안드로이드 오픈소스 그리고 패턴  안드로이드 오픈소스 그리고 패턴
안드로이드 오픈소스 그리고 패턴
 
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
 
안드로이드 개발자에 필요한 오픈소스이야기
안드로이드 개발자에 필요한 오픈소스이야기안드로이드 개발자에 필요한 오픈소스이야기
안드로이드 개발자에 필요한 오픈소스이야기
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
자동화빌드서버
자동화빌드서버자동화빌드서버
자동화빌드서버
 
Red Hat Ansible 적용 사례
Red Hat Ansible 적용 사례Red Hat Ansible 적용 사례
Red Hat Ansible 적용 사례
 
Service mesh(istio) monitoring
Service mesh(istio) monitoringService mesh(istio) monitoring
Service mesh(istio) monitoring
 
[2015-05월 세미나] 파이선 초심자의 Openstack
[2015-05월 세미나] 파이선 초심자의 Openstack[2015-05월 세미나] 파이선 초심자의 Openstack
[2015-05월 세미나] 파이선 초심자의 Openstack
 
세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
 
Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계
 
비트코인 소스 구조분석
비트코인 소스 구조분석비트코인 소스 구조분석
비트코인 소스 구조분석
 
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
 
Multithread pattern 소개
Multithread pattern 소개Multithread pattern 소개
Multithread pattern 소개
 
아해2019 SpringAOP 문겸
아해2019 SpringAOP 문겸아해2019 SpringAOP 문겸
아해2019 SpringAOP 문겸
 
[OpenInfra Days Korea 2018] (Track 1) Kubernetes 환경에서의 Volume 배포와 데이터 관리의 유연성...
[OpenInfra Days Korea 2018] (Track 1) Kubernetes 환경에서의 Volume 배포와 데이터 관리의 유연성...[OpenInfra Days Korea 2018] (Track 1) Kubernetes 환경에서의 Volume 배포와 데이터 관리의 유연성...
[OpenInfra Days Korea 2018] (Track 1) Kubernetes 환경에서의 Volume 배포와 데이터 관리의 유연성...
 
Before OTD EDU Assignments
Before OTD EDU AssignmentsBefore OTD EDU Assignments
Before OTD EDU Assignments
 
UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기
UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기
UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기
 

안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기

  • 1. Android 프로세스들의 통신 메커니즘 바인더 이야기 Joonseok 2012.05.19 @ SDC3 주체 : 온라인 서버 개발자 모임 후원 : 넷텐션
  • 2. 개요 • Android 플랫폼의 C++ 코드를 살펴 본다. • Android 아키텍처 구조를 살펴본다. • Android 는 프로세스 기반 컴포넌트 프로그 래밍 모델을 제공한다. 프로세스 간 메쉬업을 위한 기반 설비 인 바인더에 대해 알아 본다.
  • 3. 같은 곳을 바라 보다.. ANDROID 코드를 보다.
  • 6. RefBase class BnSurface : public BnInterface<ISurface> sp<IBinder> void* reinterpret_cast<>
  • 8. 객체 관리 @Android ① /frameworks/base/utils/StrongPointer.h
  • 9. 객체 관리 @Android wp<>.promote() 를 통한 약한 참조로 순환 참조 문제 해결
  • 10. Strong Pointer Weak Pointer 강한 참조 약한 참조 객체소유권O 객체소유권X 객체생명관리O 객체생명관리X
  • 11. BBinder BnInterface<> IAudioManager BnAudioManager
  • 12. 템플릿 상속#1 A, B 는 변경하지 않고 다양한 X 를 상속 받는 방법은? class A { }; A class B : public A { }; class C : public B B X#1 { }; X#2 C
  • 13. 템플릿 상속#2 class A Binder C++ Library { }; template<class T> BBinder class B : public A , public T { }; BnInterface<> IAudioManager class X { }; BnAudioManager class C : public B<X> { };
  • 15. PC OS, Linux 프로세스 ANDROID
  • 17. Android C++ Infra Java Infra
  • 19. JAVA Layer J N I C/C++ Layer
  • 20. BioniC DalvikVM Binder
  • 22. Process Process Process Process Linux Kernel
  • 25. 시스템 서비스 프로세스 애플리케이션 프로세스 Process Process VM Process Process VM Linux Kernel
  • 26. 시스템 서비스 프로세스 애플리케이션 프로세스 Process Process VM Process VM Process Linux Kernel
  • 27. 시스템 서비스 프로세스 애플리케이션 프로세스 Location 서비스 응용 VM 프로그램 VM Carmera 서비스
  • 28. 시스템 서비스 프로세스 애플리케이션 프로세스 Process Process VM VM 바인더 (Binder) Process Process
  • 29. 같은 곳을 바라 보다.. 메쉬업 도구. 바인더 RPC!
  • 30. class B { B.Call(int value) void Call(int value) } b->Call( 1004 ) B* b = new B ③ RPC데이터 ② 조회 - 획득 『B프로세스의 b 에 1004 를 인자로 ① 생성 - 등록 Call() 메소드호출』 0x01 : B 프로세스 / b
  • 31. class B { B.Call(int value) void Call(int value) } b.Call( 1004 ) B* b = new B Int arg = data.arg 『B프로세스의 b 에 switch(code) 1004 를 인자로 { Call() 메소드호출』 case “Call() 메소드호출” : b->Call(); ⑤ 해석 break; ④ 룩업 … } 0x01 : B 프로세스 / b
  • 32. class B { B.Call(int value) void Call(int value) } ② 조회 - 획득 ① 생성 - 등록 b.Call( 1004 ) B* b = new B ③ RPC데이터 Int arg = data.arg 『B프로세스의 b 에 switch(code) 1004 를 인자로 { Call() 메소드호출』 case “Call() 메소드호출” : b->Call(); ⑤ 해석 break; … ④ 룩업 } 0x01 : B 프로세스 / b
  • 33. 브로커 패턴 transfer transfer message message Client-side Broker Server-side Proxy Proxy 바인더 설비 main_event_loop pack_data pack_data update_repository uppack_data uppack_data register_service send_request call_service acknowledgment return send_response find_server Find_client calls Forward_request Forward_response uses API calls uses API calls Client Bridge Server pack_data initialize call_server uppack_data enter_main_loop start_task forward_message run_service use_Broker_API transmit_message use_Broker_API
  • 34. 프로세스 A 프로세스 B int* a ? int b 사용자 공간 커널 공간 IPC 설비
  • 35. 프로세스 A 프로세스 B Android IPC 솔루션 사용자 공간 쓰레드#1 쓰레드#1 바인더 드라이버 쓰레드#2 쓰레드#2 커널 공간
  • 36. 프로세스 A 프로세스 B 커널 공간은 사용자 공간 쓰레드#1 쓰레드#1 모든 프로세스들이 쓰레드#2 공유한다. 쓰레드#2 커널 공간
  • 37. 프로세스 A 프로세스 B 물리메모리 가상 메모리 0x1000 ~ 0x2000 0x3000 ~ 0x4000
  • 38. 프로세스 A 프로세스 B 사용자 Data 사용자 Data 송신 수신 바인더 프로토콜 바인더 프로토콜 BC_TRANSACTION BR_TRANSACTION 바인더 드라이버 커널 공간
  • 39. 프로세스 A 프로세스 B “A 에서 B 로 데이터 송신” 사용자 Data struct binder_transaction_data 사용자 Data { size_t handle; 송신 unsigned int code; 수신 바인더 프로토콜 void *buffer; 바인더 프로토콜 BC_TRANSACTION }; BR_TRANSACTION BINDER_WRITE_READ BINDER_WRITE_READ ioctl() ioctl() switch (바인더프로토콜) { case BC_TRANSACTION : {…} case BR_TRANSACTION : {…} } 커널 공간
  • 40. 프로세스 A 프로세스 B 사용자 Data 바인더 RPC 사용자 Data 송신 수신 바인더 프로토콜 바인더 프로토콜 BC_TRANSACTION BR_TRANSACTION ioctl() 바인더 IPC switch (바인더프로토콜) ioctl() { case BC_TRANSACTION : {…} 바인더 드라이버 case BR_TRANSACTION : {…} }
  • 41. BpServiceManager addService() BpBinder transact()
  • 42. BnServiceManager onTransact() ServiceManager addService()
  • 44. 정리 • Android 는 스마트포인터, 템플릿 상속, epoll 을 통한 이벤 트 처리기를 구현하고 있다. • Android 는 프로세스 단위의 컴포넌트 모델을 갖고 있고 서 버 프로세스 형태로 시스템 기능을 제공하는데, 프로세스 간 기능 메쉬업(Mesh-up)을 위해 바인더 설비를 제공한다. • Android 의 바인더(Binder) 는 커널 메모리 참조를 이용해 모바일 기기에 최적인 프로세스 간 통신을 지원한다.
  • 45. 참고자료 • Microsoft “Singularity OS” • Google IO • Wikipedia.org • Kandroid.org • Naver 웹툰 • 인사이드 안드로이드