原則仕上げバインダー

Linuxのプロセス間通信

1.パイプライン

物質は、カーネルバッファ導管、名前ように、2つのプロセス、パイプの伝送管端、プロセスを使用して情報を通信する必要が作用する導管です。パイプライン処理配管の両端には、ファイルのですが、このファイルはかなり特殊です、それはファイルシステムに属し、メモリ上にのみ存在しません。

通信ファイルの問題を克服するためのパイプライン:

  1. パイプのサイズを制限します。実際には、パイプは、固定サイズのバッファです。パイプラインは、メモリの完全なプロセス()、プロセスBの開始が読み取られるまで、プロセスAは、パイプラインの書き込みをブロックする()は、パイプは、プロセスAのためのメモリが書き込みで持つことができ、データを読み出します。
  2. プロセスを読むことは速いプロセスの問題を書くよりです。プロセスBが読み取られると()オペレーション、プロセスAがまだファイルに書き込まれていない場合、プロセスはBをブロックする、開始書き込みプロセスを導きます。
    パイプラインは、次の2つに分かれています。
    1. 不明なパイプ、半二重通信システム、一方向のみのデータフロー、唯一のプロセス間の親子関係を利用して、
    2. 名前付きパイプ、名前付きパイプはまた、半二重通信であるが、親族プロセス間の通信を可能にしません。

2.セマフォ

セマフォカウンタは、交換バルクデータに使用されない。複数のスレッドが共有リソースへのアクセスを制御するために使用することが可能である、マルチスレッドの同期は、それらの間にしばしばプロセスを防止するためのロック機構として使用されて使用されています他のプロセスのリソースにアクセスするとき、リソースにアクセスすることができる。同じプロセス内の異なるスレッド間のプロセス間の同期手段、並びにそのため、メイン。

3.信号

これは、ソフトウェアレベルでの割込み機構にアナログ信号です。原理的には、プロセスは同じであると言うことができる割り込み要求を受信し、プロセッサからの信号を受信します。信号が非同期である、プロセスは、任意のアクションで到達する信号を待つ必要はありません、実際には、最終的にはプロセス信号が到着する何時間かわかりません。信号はユーザ空間のプロセスとカーネル・プロセス間の直接相互作用することができ、また、ユーザ空間のプロセスに通知するために使用することができ、カーネルプロセスは、システム・イベントが発生しました。これは、プロセスの状態を知らなくても、いつでもプロセスに送信することができます。シグナルがプロセスをブロックするように設定されている場合は、それがブロックされるまで、その信号を遅延さ渡し、プロセスが実行モード中でない場合は、プロセスが実行を再開するまで、信号は、その後、それを通過したカーネルによって、最大保存されますのみキャンセルするプロセスに渡されます。

4.メッセージキュー

メッセージキューは、シグナリングメッセージキュー少ない情報担体を克服のみ無地パイプバイトストリームバッファサイズが制限される。カーネル識別子によってメッセージキューに格納されたリンクリストのメッセージであるので。UNIX上のメッセージキューであります実装されてもよい異なるプロセス間の資源の共有のための機構は、UNIXは、異なるプロセスがフォーマットされたデータストリームは、任意のプロセスにメッセージキューの形で送信される。処理を完了メッセージキューmsgetを使用することができる権限を有するメッセージ・キューの動作を可能にしますメッセージタイプを使用して動作制御、プロセス情報は、任意の順序で読み出すこと、またはメッセージの優先順位を配置することができます。

5.共有メモリ

共有メモリは、複数のプロセスが特定のストアを共有できるようにすることです。他のプロセスが、この変更に気付くであろうと、プロセスは、このアドレスの内容を変更する場合。データは、クライアントとサーバ側との間で複製する必要はありませんので、これは最速のIPCの一つであるので、メモリに直接書き込まれたデータは、データを複数回コピーしないでください。
長所:最速の方法は、通信、データ、プロセス、およびメモリから直接アクセスし、顧客サービスの配信プロセスの一つではない、2つのプロセス間のデータにコピーする必要はありません、
短所:共有メモリは、同期メカニズムを提供していません、つまり、サービスプロセスの終了前に、共有メモリへの書き込み、それは時々 、同期のためのセマフォの組み合わせを必要と読み始めるために別のプロセス(クライアントプロセス)を防止するための自動的なメカニズムはありません。

6.ソケット

ソケットTCP / IPネットワークのAPIインターフェイス機能である、あなたは異なるプロセス(IPC)の間の通信を実現することができ、ローカルおよびリモートの缶;ソケットが最初に思考の一種でUnixオペレーティングシステムでは、とUnix / Linuxの中で使用されたがすべてですソケットがI / Oの特別な種類であるように、すべてのファイル、ファイル記述子がありますが、唯一の区別するために使用するだけでなく、同様のプロセスID

Androidのプロセス通信

一方でAndroidのは、Linuxに基づいていますが、Androidのは、通信の独自のセット、Androidの一般的な方法の下で、以下の簡単なプロセス間通信を持っています。

1.テント

包括Activity,Service,Receiver之间通信都可以通过Intent进行通信,在此不赘述。   

2.のContentProvider

ContentProvider是Android中提供的专门用于不同应用间数据交互和共享的组件。ContentProvider实际上是对SQLiteOpenHelper的进一步封装,以一个或多个表的形式将数据呈现给外部应用,通过Uri映射来选择需要操作数据库中的哪个表,并对表中的数据进行增删改查处理。ContentProvider其底层使用了Binder来完成APP进程之间的通信,同时使用匿名共享内存来作为共享数据的载体。ContentProvider支持访问权限管理机制,以控制数据的访问者及访问方式,保证数据访问的安全性。

3.ファイル共有

将对象序列化之后保存到文件中,在通过反序列,将对象从文件中读取出来。
文件共享方式也存在着很大的局限性,如并发读/写问题,如读取的数据不完整或者读取的数据不是最新的。文件共享适合在对数据同步要求不高的进程间通信,并且要妥善处理并发读/写的问题。

4. AIDL

AIDL(Android Interface Definition Language)是一种IDL语言,用于生成可以在Android设备上两个进程之间进行进程间通信(IPC)的代码。

5.メッセンジャー

Messenger只能传递Message对象,Messenger是一种轻量级的IPC方案,它的底层实现是AIDL。
Messenger内部消息处理使用Handler实现的,所以它是以串行的方式处理客服端发送过来的消息的,如果有大量的消息发送给服务器端,服务器端只能一个一个处理,如果并发量大的话用Messenger就不合适了,而且Messenger的主要作用就是为了传递消息,很多时候我们需要跨进程调用服务器端的方法,这种需求Messenger就无法做到了。

6.ソケット

  ソケット方式は、ネットワーク上でのデータ交換に使用されている、それはリアルタイムのデータ転送のためのより適切な接続を確立するために、クライアントとサーバの後に送信データを続けることができます。

バインダーの紹介

Androidの間の通信の私の手段の簡単な紹介の上に、私たちも頻繁に使用される活動、サービス、ブロードキャスト、ContentProviderの4つの主要なコンポーネントは、AIDLやMessengerを使用することになるが、彼らは原理はそれが何であるかを実感内?
これらの質問は密接に上記の原理を理解するために、バインダーと関連している背景には、我々はBidner通信メカニズムが必要であることを理解します。

Linuxは、パイプ、セマフォ、信号、共有メモリ、他の通信手段を署名のセットを含むに対してオファーを有し、バインダーを提供記録すべき理由
IPCチャネルとして、以下の理由に基づきます。

  • 演奏
通信 データのコピー数 長所と短所
共有メモリ 0 使用することは困難で共有メモリをコピーする必要はなく、制御複合体、ないが、
ソケット 2 主機械とプロセスとの間のネットワーク全体の通信上のプロセス間の低速通信に使用される低伝送効率、高コスト、
メッセージキュー、パイプ 2 スタートデータ送信側は、二回非効率を開くためにカーネルバッファにコピーされ、その後、受信バッファにカーネルバッファからコピーされたファイルのコピーをバッファリング
バインダー 1 データの唯一のコピー、良好なパフォーマンス
  • セキュリティの
    実装自体におけるLinuxのIPCメカニズムのは、何の安全対策はありませんし、UID / PIDバインダー機構は、バインダー機構により、カーネル空間での安全、アイデンティティを追加し、それ自体であり、バインダーは、Linuxでプライベートチャンネルを作成することができます通信メカニズムを達成することができません。

  • 安定性
    C / Sアーキテクチャ上のバインダーに基づく、クライアント(クライアント)同士、優れた自然の安定性の責任を明確にし、独立した、完全な、明確な構造にサーバー(Server)をスローする必要がありますどのような。

  • 簡単な使い方
    クライアント側の関数名、パラメータや戻り値とサーバとまったく同じ方法で、障壁のクライアント側とサーバ側の廃止を。

プロセス間通信のLinuxの基本的な概念

優れたバインダーメカニズムを理解するために、Linuxのに関連するプロセス間通信のコンセプトを説明します。
記事へ次の参照アンドロイドプロセス間通信:原理機構バインダー詳細なグラフィック

プロセスの分離

プロセスとプロセス間のメモリが共有されていない、1と2がメモリを共有することはできません処理し、あなたが伝えたいIPCを使用する必要があります。

ユーザ空間とカーネル空間

カーネル空間(カーネル)は、ユーザ空間(ユーザ空間)で実行されている空間システムのカーネルユーザ空間プログラムが実行されているです。セキュリティを確保するために、それらの間で単離しました。

ユーザーモードとカーネルモード

論理的にユーザ空間とカーネル空間の間の区分が、しかし、必然的に、ユーザは、ファイル操作などのカーネル空間リソース、ネットワークへのアクセス、およびその上にアクセスする必要があります。

  1. タスクの実行に(プロセス)システムコールとカーネルコードは、プロセスがカーネルモード(カーネルモード)で実行されていると言った場合。
  2. プロセスは、ユーザー自身のコード内で実行すると、我々は(ユーザーモード)ユーザーモード操作で呼び出します

システムは、主に以下の二つの方法を通じて、呼び出します。

copy_from_user() //将数据从用户空间拷贝到内核空间
copy_to_user() //将数据从内核空间拷贝到用户空间

メモリマップ

バインダーIPCメモリマップに関与するメカニズムは)MMAPによって達成される(MMAP()は、メモリ・マッピング・システムを動作させる方法です。単純な話ではカーネル空間にユーザ空間にマッピングするメモリのメモリマップされた領域です。マッピング関係の後、ユーザは、カーネル空間に直接このメモリ領域への応答を変更することができ、そうでなければ変更するこの領域のカーネル空間は、ユーザ空間に直接反応されます。
:詳細については、を参照してくださいオペレーティングシステム:詳細なグラフィックスメモリマッピング

バインダー原則

IPCの伝統的な原則


次のようにIPCメモリコピープロセスごとに二回発生する従来の通信は、次のとおりです。

  1. データを送信します
  2. データ送信処理コールのcopy_from_userは、カーネルキャッシュにユーザ空間からデータをコピーします
  3. Copy_to_userシステムコールは、ユーザー空間にカーネル空間からデータをコピーします。
  4. データを受信します

Binder的通信原理

  1. 第1バインダードライバは、カーネル空間内のバッファを受信し、データを作成します。
  2. 次に、カーネル空間でカーネルバッファを開くために、バッファゾーン確立コアとカーネルデータは、カーネルバッファとの間のキャッシュとマッピングとの間のマッピング関係を受信し、プロセスユーザアドレス空間の受信データを受信します。
  3. 发送方进程通过系统调用 copy_from_user() 将数据 copy 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。

Binder的实现


Binder的实现主要涉及到如图的四个部分Client、Server、Binder Driver、ServiceManager,其中从实现层面来说,我Client和Server在Android应用层,需要开发者自行实现,ServiceManager、Binder Driver是Android fromwork层实现;从内核层面,Client、Server、ServiceManager主要操作在用户空间执行操作,Binder Driver在内核空间执行操作,Client、Server、ServiceManager分别通过open、mmap 和 ioctl 来访问设备文件 /dev/binder,从而实现操作Binder来跨进程通信。

参考文章:图文详解 Binder机制 原理

一次Binder通信主要分为以下步骤:

  1. 注册服务:Server进程向Binder Driver发起注册服务请求,Binder Driver将请求转发给ServiceManager,ServiceManager添加该Server进程管理
  2. 获取服务:Client向Binder驱动获取服务,Binder驱动将请求转发到ServiceManager并查找Client对应的Server服务信息,通过Binder驱动将上述信息返回
  3. 使用服务:
    1. Binder驱动创建一块接收缓存区域,并实现内存映射关系:包括内核缓存区和Server用户区映射到同一个接受缓存区。
    2. Client调用copy_from_user()发送到内核缓存区
    3. 内核缓存区映射到Server用户空间去,Server进行解包,执行指定方法
    4. 将执行结果存到接受区内存缓存区,内存映射到内核缓存区
    5. クライアントがカーネルバッファのデータを取得します)(copy_to_userを呼び出して、この通信が完了すると

侵害は、すぐに削除する場合は、この論文では、オンライン情報の一部を参照して、ソートのバインダー関連の原則は、参照識別子の関連部分を再現しております。

参考記事

  1. https://www.cnblogs.com/jxc321/p/9296571.html
  2. https://www.linuxprobe.com/linux-process-method.html
  3. http://www.hqyj.com/news/emb202.htm
  4. https://www.jianshu.com/p/94b8582d089a
  5. https://www.jianshu.com/p/429a1ff3560c
  6. https://blog.csdn.net/carson_ho/article/details/73560642

おすすめ

転載: www.cnblogs.com/cambodia/p/12158243.html