Преимущества использования Binder для IPC в Android

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

Ответы

Ответ 1

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

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

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

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

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

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

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

и - не забывайте

G) Связывание было начато в Palm (ах, ностальгия) (q.v. OpenBinder). Экс-ладони добрались до Android и внесли свой код вместе с ними.

Ответ 2

Из файла 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. Это означает что даже при условии наличия только не-багги и не вредоносного кода очень вероятно, что со временем глобальные таблицы ядра, используемые для реализации IPS SysV, будут заполняться вверх.

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

Ответ 3

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

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

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

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

Ответ 4

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