Преимущества использования Binder для IPC в Android - PullRequest
15 голосов
/ 19 сентября 2011

В чем преимущество использования Binder для IPC по сравнению (семафоры, очередь сообщений, PIPES) в стеке Android?

Ответы [ 4 ]

21 голосов
/ 17 апреля 2013

Старый вопрос (и, вероятно, не отслеживаемый автором), но на который стоит ответить:

A) Все механизмы IPC на основе файловой системы или файловой системы (особенно каналы) нельзя использовать из-за отсутствиядоступного для записи каталога, где все процессы могут mkfifo / создать представление файловой системы / сокета своего порта IPC (несмотря на / dev / socket, который используется для системных процессов, например, rile, zygote и их аналог).

B) Ни один из предложенных механизмов не имеет возможности «определения местоположения службы», которая требуется для Android.В UNIX есть RPC portmapper, и Android нуждается в аналогичной функциональности.Введите: ServiceManager, который может использовать связыватель для регистрации в качестве диспетчера контекста, для регистрации / поиска дескрипторов службы на лету

C) Существует серьезная потребность в сериализации - будь то намерения или другие сообщения.Binder предоставляет абстракцию посылки, которую Parcel.java может использовать для маршалинга данных.

D) У SysV есть другие проблемы, помимо ответа г-на Ламбада, которые являются более важными, особенно условия гонки и отсутствие разрешения.

E) Очереди сообщений и каналы не могут передавать дескрипторы.Сокеты домена UNIX могут, но не могут использоваться из-за (A) (опять же, если вы не root / system, например, zygote, rild, installd ..)

F) Binder действительно легкий, иимеет встроенные механизмы авторизации.Он также имеет изящные функции, такие как пробуждение процесса получателя, а также совместное использование памяти, которого другие механизмы просто не имеют.(и помните, нет mmap (2) из-за проблемы с файлами в (A) для именованных отображений).

и - давайте не будем забывать

G) Binder был запущен в Palm (ах, ностальгия) (см. OpenBinder).Экс-палмеры добрались до Android и принесли с собой свой код.

6 голосов
/ 16 мая 2012

Из файла ndk docs / system / libc / SYSV-IPC.html :

Android не поддерживает IPC System V, т.е. средства, предоставляемые следующими стандартными заголовками Posix:

<sys/sem.h>   /* SysV semaphores */
<sys/shm.h>   /* SysV shared memory segments */
<sys/msg.h>   /* SysV message queues */
<sys/ipc.h>   /* General IPC definitions */

Причина этого заключается в том, что по своей природе они приводят к глобальной утечке ресурсов ядра.

Например, нет способа автоматически освободить семафор SysV, выделенный в ядре, когда:

  • глючный или вредоносный процесс завершается
  • не ошибочный и не злонамеренный процесс аварийно завершает работу или явно уничтожается.

Автоматическое уничтожение процессов, чтобы освободить место для новых, является важной частью реализации жизненного цикла приложений Android. Это означает что, даже если предположить, что код не содержит ошибок и не содержит вредоносных программ, весьма вероятно, что со временем глобальные таблицы ядра, используемые для реализации IPC SysV, заполнят до.

В этот момент могут возникать странные сбои, которые не позволяют программам, использующим их, работать должным образом до следующей перезагрузки системы.

1 голос
/ 14 октября 2011

Связыватели используются для связи через границы процессов, поскольку разные процессы не имеют общего контекста виртуальной машины => больше нет прямого доступа друг к другу Объекты (память).Обе стороны в одном и том же процессе (обычно вещи, которые находятся в одном приложении) означают (imho), что вам не следует использовать связыватели, поскольку они замедляют / усложняют ненужные вещи.

Связующие обычно не используются напрямую, а скорее черезклассы «Сервис» или «Мессенджер».В то время как связь с Сервисом осуществляется через полный набор функций, связь с Посланником должна использовать «Сообщения».Мессенджеры намного проще в реализации.

Помимо использования Binders вы можете использовать все, что доступно из любого экземпляра виртуальной машины, например "LocalSocket", Files, ContentProviders, Intents, ...

Bindersне идеальны для передачи больших потоков данных (таких как аудио / видео), поскольку каждый объект должен быть преобразован в посылку (и обратно).Все преобразование занимает время.Гораздо лучше в этом случае будет, например, LocalSocket.

0 голосов
/ 19 сентября 2011

Связыватели используются для разрешения удаленных вызовов процедур. Вы могли бы реализовать RPC, используя упомянутые вами инструменты синхронизации, но вам также нужно было бы написать много кода для его объединения ... с помощью Binder (обычно используемого только в службе Android) у вас гораздо меньше кода для записи; чуть больше, чем ваши действительные функции дистанционного управления.

...