说明
- 嵌入式平台下,应用层多线程架构和多进程架构如何选择?
- 这是一个常见的面试问题,也是程序架构的一个基础问题。
问题分析
- 该问题只有限定在嵌入式平台才有意义,在PC平台,除非功能较简单或者特殊限制(系统原因),大部分复杂程序都是采用的多进程架构,因为可以充分利用系统资源。
- 该问题虽然是问选择多线程还是选择多进程,但实际应用中都是“进程+线程”的结合方式,并不是非此即彼,选择了多进程在进程中就不能创建多线程了,选择多线程就不能创建多进程了,问题的重点在于是否将功能放在多个进程中。
- 在工作中,我既见过选择单进程多线程架构,也见过选择多进程多线程架构,两个选择并没有哪个更好,需要根据实际情况进行选择。
- 因此该问题可以分为两个问题:
- 嵌入式平台下,是否必要将应用层划分为多个进程。
- 功能在线程和进程之间如何划分,即哪些功能适合存在于多个进程,哪些功能适合存在于单进程中多个线程。
进程与线程对比
- 选择之前,需要弄明白嵌入式平台下,进程和线程的区别以及各自的优缺点。
性能
- 在linux下,线程是轻量级进程,这句话充分体现了进程和线程在性能方面的差别。
- 内存,CPU等资源占用
- 进程占用内存多,切换复杂,CPU利用率低;线程占用内存少,切换简单,CPU利用率高。
- 数据共享、同步
- 进程数据共享复杂,需要用IPC;数据是分开的,同步简单;线程因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂。
- 创建销毁、切换
- 进程创建销毁、切换复杂、速度慢;线程创建销毁、切换简单,速度很快。
资源分配
- 多进程比单进程拥有更大的内存访问范围。
- 有些操作系统的进程调度,线程和进程是平等的,但是有些系统,进程能够或得更多的CPU时间片。
- 以上是在资源充足的情况下,例如:PC端,但是在嵌入式平台,资源原本就是不充足的,拥有更大的内存范围是没有多大意义的。
稳定性
- 进程间不会互相影响,而线程间可能出现同步或其它问题,导致线程异常,单线程出问题会直接导致整个程序出问题。
扩展性
- 多进程编程、调试可以相互独立,相对于多线程不会互相影响,因此也更简单,方便。
- 多进程适合于多核、多机分别式,如果一台机器不够,扩展到多台机器比较简单;而多线程适合于单机多核分布式。
个人总结
- 类似嵌入式平台下C和C++的选择,如果追求性能,将性能放第一位,开发效率放第二位,可采用单进程多线程架构;如果程序复杂度较高,并且追求开发效率和稳定性,性能放第二位,资源充裕,可采用多进程多线程架构。
- 在嵌入式平台上内存等资源都是不充裕的,即使是对单个进程而言,因此使用多进程来占用更多的资源在嵌入式平台是无意义的,但是多进程更具有独立性,对开发人员也更友好。
- 使用多进程模型,需要使用到进程通信,但是进程通信相对于同进程通信更为麻烦,需要有能满足条件的进程通信模块(成熟、功能强大并且使用简单),在嵌入式平台,只有少量进程通信框架,大部分需要自主实现,Linux基本机制的简单使用不满足复杂需求,因此在嵌入式平台,大部分中小公司项目使用的是单进程模型。
功能划分
- 需要频繁创建和销毁的功能优先用线程。
- 需要进行大量计算的功能(CPU密集型)优先使用线程,例如:常见的图像处理、算法处理,要耗费很多CPU,不适合频繁切换,以及在数据通信上花费资源,这种情况下线程是最合适的。
- 强相关的功能适合于存在于单进程中的多线程,弱相关的处理,较为独立的功能适合于使用多进程。