linux进程间通信的混合使用,Android进程间通信机制

Android所拥有的IPC

Android系统中有大量IPC(进程间通信)的场景,比如我们想要

创建一个新的进程,需要通过Socket这种IPC方式去让Zygote Fork新进程;

如果我们要杀掉一个进程,需要通过信号这种IPC方式去将SIGNAL_KILL信号传递到系统内核;

如果我们想要唤醒主线程处于休眠中的Looper,需要管道这种IPC方式来唤醒;

我们想要在应用开发中使用AIDL,广播或者Messager等方式来进行跨进程通信,其实底层都是使用了Binder这种IPC方式。

那么,Android到底有多少种进程间通信的方式呢?什么样的场景要选择什么样的通信方式呢?这些IPC通信方式怎么使用呢?这些IPC通信的底层原理又是什么呢?

24847f24ffbb?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

可以看到,Android所拥有的IPC总共有这些:

基于Unix系统的IPC的管道,FIFO,信号

基于SystemV和Posix系统的IPC的消息队列,信号量,共享内存

基于Socket的IPC

Linux的内存映射函数mmap()

Linux 2.6.22版本后才有的eventfd

Android系统独有的Binder和匿名共享内存Ashmen

管道

信号(signal)

消息队列

信号量(semaphore)

上面提到的IPC的方式都是在内核空间中开辟内存来存储数据,写数据时,需要将数据从用户空间拷贝到内核空间,读数据时,需要从内核空间拷贝到自己的用户空间,

共享内存就只需要一次拷贝,而且共享内存不是在内核开辟空间,所以可以传输的数据量大。

共享内存(share memory)

套接字(Socket)

8 Linux的几种跨进程通信的方式的比较

8.1 效率比较

类型

无连接

可靠 流控制

优先级

匿名PIPE

N

Y

Y

N

命名PIPE(FIFO)

N

Y

Y

N

信号量

N

Y

Y

Y

消息队列

N

Y

Y

Y

共享内存

N

Y

Y

Y

UNIX流SOCKET

N

Y

Y

N

UNIX数据包SOCKET

Y

Y

N

N

PS:无连接是指无需调用某种行动是OPEN,就有发送消息的能力流控制,如果系统资源短缺或者不能接受更多的消息,则发送进程能进进行流量控制

8.2 优缺点比较

匿名管道(pipe):速度慢,容量有限,只有父子进程能通讯

有名管道(FIFO): 任务进程都能通讯,但速度慢

消息队列(message queue):容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据问题。

信号量:不能传递复杂消息,只能用来同步

共享内存区:能够容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题。相当于线程中的线程安全,当然,共享内存区同样可以做线程间通讯,不过没有这个必要,线程间本来就已经共享了同一进程内的一块内存

8.3 使用场景

如果用户传递的信息较少或是需要通过信号来出发某些行为,上面提到的软中断信号机制不失为一种简洁有效的一种进程间通信方式。但若是进程间要求传递的信息量比较大或者进程间存在交换数据的要求,那就需要考虑别的通信方式。

匿名管道简单方便,但局限于单向通信的工作方式,并且只能创建它的进程及其子孙进程之间实现管道的共享。

有名管道虽然可以提供给任意关系的进程使用,但是由于其长期存在于系统之中,使用不当容易出错。所以不建议初级开发者使用。

消息缓存可以不再局限于父子进程,而允许任意进程间通过共享消息队列来实现进程间通信,并由系统调用函数来实现消息发送和接受方之间的同步,从而使得用户在使用消息缓冲进行通信时不再需要考虑同步问题,使用方便,但是信息的复制需要额外的消耗CPU的时间,不适宜信息量大或操作频繁的场合。

共享内存针对消息缓存的缺点而改进,利用了内存缓存区直接交换信息,无需复制,快捷、信息量大的是其优点。但是共享内存的通信方式是通过将共享内存缓存直接附加到进程的虚拟地址空间中来实现的。因此这些进程之间的读写操作的同步问题操作系统无法实现。必须由各进程利用其它同步工具解决。另外, 由于内存实体存在于计算机系统中,所以只能由处于同一个计算机系统中的其它进程共享,不方便网络通信。

共享内存块提供了在任意数量的进程之间进行高效双向通信的机制。每个使用者都可以读取写入数据,但是所有程序之间必须达成并遵守一定的协议,以防止诸如在读取信息之前覆写内存空间等竞争状态的出现。不行的是,Linux无法严格保证提供对共享内存块的独占访问,同时,多个使用共享内存块的进程之间必须协调使用同一个键值。

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值