作者:陈海波、夏虞斌 等
多进程协作主要有以下三点优势。
- 将功能模块化,避免重复造轮子。
- 增强模块间的隔离,提供更强的安全保障。
- 提高应用的容错能力。
图7-1是一个简单的IPC设计。它假设内核已为两个进程映射了一段共享内存,且共享内存刚好可以存放两个消息(发送者消息和接受者消息)。
01 进程间通信的重要功能
消息传递(message passing)是IPC中常用的数据传递方式,即将数据抽象成一个个的消息进行传递。不同的IPC设计有不同的消息抽象,且消息传递往往需要一个“中间人”(如共享内存)。
当一个通信发生时,内核将控制流从发送者进程切换到接收者进程(返回的过程类似)。IPC中的控制流转移,通常是利用内核对进程的运行状态和运行时间的控制来实现的。
02 进程间通信的分类
单向IPC通常指消息在一个连接上只能从一端发送到另一端,双向IPC则允许双方互相发送消息。而单/双向IPC则会根据通信中具体的配置选项等来判断是否需要支持单向或双向的通信。实际中,很多系统选择的是单/双向IPC,这样可以比较好地支持各种场景。当然,如管道、信号等只支持单向IPC的机制在实际中同样有较多的应用。
简单来看,同步IPC指它的IPC操作(如Send)会阻塞进程直到该操作完成;而异步IPC则通常是非阻塞的,进程只要发起一次操作即可返回,而不需要等待其完成。
1. 超时机制
2. 通信连接管理
虽然实际的系统中会有各种不同的实现,但是它们大部分可以被归为两类——直接通信和间接通信。直接通信是指通信的进程一方需要显式地标识另一方。间接通信需要经过一个中间的信箱来完成通信,每个信箱有自己唯一的标识符,而进程间通过共享一个信箱来交换消息。
进程间通信通常依赖于一套权限检查的机制来保证连接的安全性。例如,seL4等微内核系统中的Capability机制,会将所有的通信连接抽象成一个个的内核对象。而每个进程对内核对象的访问权限(以及能够在该内核对象上执行的操作)由Capability来刻画。
4. 命名服务
而客户端进程可以去命名服务上查询当前的服务,并选择自己希望建立连接的服务去尝试获取权限。具体是否分发权限给对应的客户端进程,是由命名服务和对应的服务端进程根据特定的策略来判断的。
04 宏内核进程间通信
宏内核操作系统中进程间通信更多的是应用之间的交互,因此,设计的重心通常会放在接口的易用性、稳定性等方面。图7-5给出了典型的宏内核进程间通信机制的对比。
由于进程间通信对于微内核系统性能的重要意义,大部分微内核操作系统都会优先从性能角度来设计和实现进程间通信。
Mach通过两种基本的抽象——端口(port)和消息(message),设计和实现了一种间接通信IPC:通信的双方不需要显式指定另一方,而是通过端口进行通信(对应于“信箱”)。进程之间通过端口流通的数据就是消息。
Mach中端口和消息的设计使得进程间的通信和具体的进程是隔离开的。只要一个进程拥有某个端口,其就能够通过这个端口和“另一端”的进程进行通信。后续的微内核系统设计大都考虑了Mach的思想,不管是借鉴其设计还是将其缺陷引以为戒。
根据Mach的经验,Liedtke等研究人员开始研发L4系列的微内核系统。L4系列微内核系统的一个突出思路是:进程间通信是微内核的核心功能,需要围绕通信去完成整个系统的设计和实现。L4是当下仍然十分主流的微内核系统,特别是后续衍生出了各种变体和相关的系统。
3. LRPC:迁移线程模型
迁移线程认为,其他的IPC设计可以看成将需要处理的数据发送到另一个进程并让其处理。这也是为什么控制流切换和数据传输会成为主要的瓶颈。
迁移线程方案被用在LRPC、Mach(优化版本)等系统中,是目前纯软件进程间通信优化中效果最好的设计之一。迁移线程的基本原则是:
- 简化控制流切换,让客户端线程执行“服务端的代码”;
- 简化数据传输,共享参数栈和寄存器;
- 简化接口,减少序列化等开销;
- 优化并发,避免共享的全局数据结构。其中,前两点原则都基于“将代码拉到本地”这个新的视角。
如果使用迁移线程模型,在进程间通信过程中,内核不会阻塞调用者线程,但是会让调用者线程执行被调用者的代码。整个过程没有被调用者线程被唤醒,相反,被调用者端更像是一个“代码提供者”。
在Android场景下,进程间通信在大部分情况下做的其实是“远程过程调用”。服务端进程负责提供具体的服务,客户端进程则通过进程间通信来发起服务请求,并获得服务端进程处理后的结果。
在Binder IPC的内核设计中,提供了句柄(handle)的抽象来表示IPC对象(即一个通信连接)。句柄和我们熟悉的文件描述符其实很相似,用户通过对句柄的操作来发起对特定进程的通信。
本文摘编自《现代操作系统:原理与实现》,经出版方授权发布。
延伸阅读《现代操作系统:原理与实现》
推荐语:操作系统和系统安全领域国际知名学者、上海交通大学陈海波、夏虞斌领衔撰写;本书是作者在复旦大学和上海交通大学十余年操作系统教学经验的科学总结,由浅入深介绍现代操作系统经典理论与方法。结合前沿研究与工业界实践,面向真实场景与真实问题。
