linux进程间通讯,Android系统各种进程间通信机制

一、linux进程间通讯实现方式有很多种。包含管道、信号、共享内存、套接字


而 管道、信号、共享内存 这三种方式只适用于同一台设备间进程间通讯。套接字可以跨设备进行进程间通讯


1.管道机制

管道机制是一种单向通讯机制。传递数据是具有单向性的。所以又称为半双工管道。



*数据只能由一个进程流向另一个进程(一个进程负责写管道,一个进程负责读管道) 


*管道只适用于具有血缘关系的进程 (父子进程、兄弟进程)。


*管道流通的数据是无格式的字节流。所以需要双方约定好数据格式


所以如果想进程间相互通讯的话, 必须建立两条管道。

2.信号

信号作为进程间通信在liunx 系统中很常见,比如系统向正在运行的进程发送kill命令 (参数为进程的pid,以及信号sig),正在运行的进程接收到指令后自己结束自己。
一般情况下信号会储存在系统的信号列表中,自定义信号也可以实现,只不过我没做过。
而信号相比较管道优点就在于异步通讯。 正在运行的进程不知道什么时候获取到信号。等到有信号了,再去处理相关逻辑。
而管道就不可以了。管道通讯的时候,当管道里面没有数据,进程必须wait,等到管道里面有了数据再读取数据

3.共享内存

共享内存就是允许两个不相关的进程访问同一个逻辑内存,通常情况下不同进程的共享的内存会被分配成物理内存,进程可以将同一段共享内存纳入自己的地址空间中,所有的进程都可以访问这一块内存,当有进程向这一块内存写入数据时,结果就会影响到可以访问这个内存的其他的进程。

共享内存的优点:是通过直接访问内存形式。效率快,但也有本身自己的缺点就是 就是没有提供同步机制,也就是说当不同进程同时往内存写入数据时,会出现数据错误 。解决办法就是使用具有原子化操作的信号量来进行信息同步。
(信号量是一种特殊的变量,程序对它的访问都是原子操作,并且只允许对他进行  等待 (即P)值为0,发送(即V)的操作,值为1)所以通过判断信号量的0或1 可解决共享内存的同步问题。


4.套接字


我的理解就是包含源IP地址和目的IP地址以及源端口号和目的端口号的组合,也就是TCP/ID的网络连接的基本单元,
而这种方式可以有效解决不同设备间通讯。


二、Android系统没有采用上述提到的各种进程间通信机制,而是采用Binder机制 ,android中常见的一些进程间通信 AIDL,BraodCast,ContentProvider


broadcast

用于发送和接收广播!实现信息的发送和接收! 该方式只是接收到一个广播消息,主要的业务逻辑代码是在自己的onReceive()方法里面实现的。

那么它的优点是:注册了这个广播接收器的应用都能够收到广播,范围广。缺点是:速度慢点,而且必须在一定时间内把事情处理完(onReceive执行必须在几秒之内),否则的话系统给出ANR。

aidl

用于不同程序将服务的相互调用!实现了一个程序为另一个程序服务的功能!业务逻辑代码在远程的服务中,通过aidl来调用。

优点是:速度快(系统底层binder机制),性能稳,效率高,一般进程间通信就用它。

Content Provider

用于将程序的数据库人为地暴露出来!实现一个程序可以对另个程序的数据库进行相对用的操作!主要是用来将自己的数据库共享出来供别的程序调用或者修改。

因为只是把自己的数据库暴露出去,其他程序都可以来获取数据,数据本身不是实时的,不像前两者,只是启个数据供应作用。一般是某个成熟的应用来暴露自己的数据用的。 你要是为了进程间通信,还是别用这个了,这个又不是实时数据。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值