程序架构 - 多线程架构和多进程架构选择思考

说明

  • 嵌入式平台下,应用层多线程架构和多进程架构如何选择?
  • 这是一个常见的面试问题,也是程序架构的一个基础问题。

问题分析

  • 该问题只有限定在嵌入式平台才有意义,在PC平台,除非功能较简单或者特殊限制(系统原因),大部分复杂程序都是采用的多进程架构,因为可以充分利用系统资源。
  • 该问题虽然是问选择多线程还是选择多进程,但实际应用中都是“进程+线程”的结合方式,并不是非此即彼,选择了多进程在进程中就不能创建多线程了,选择多线程就不能创建多进程了,问题的重点在于是否将功能放在多个进程中。
  • 在工作中,我既见过选择单进程多线程架构,也见过选择多进程多线程架构,两个选择并没有哪个更好,需要根据实际情况进行选择。
  • 因此该问题可以分为两个问题:
  1. 嵌入式平台下,是否必要将应用层划分为多个进程。
  2. 功能在线程和进程之间如何划分,即哪些功能适合存在于多个进程,哪些功能适合存在于单进程中多个线程。

进程与线程对比

  • 选择之前,需要弄明白嵌入式平台下,进程和线程的区别以及各自的优缺点。

性能

  • 在linux下,线程是轻量级进程,这句话充分体现了进程和线程在性能方面的差别。
  1. 内存,CPU等资源占用
  • 进程占用内存多,切换复杂,CPU利用率低;线程占用内存少,切换简单,CPU利用率高。
  1. 数据共享、同步
  • 进程数据共享复杂,需要用IPC;数据是分开的,同步简单;线程因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂。
  1. 创建销毁、切换
  • 进程创建销毁、切换复杂、速度慢;线程创建销毁、切换简单,速度很快。

资源分配

  • 多进程比单进程拥有更大的内存访问范围。
  • 有些操作系统的进程调度,线程和进程是平等的,但是有些系统,进程能够或得更多的CPU时间片。
  • 以上是在资源充足的情况下,例如:PC端,但是在嵌入式平台,资源原本就是不充足的,拥有更大的内存范围是没有多大意义的。

稳定性

  • 进程间不会互相影响,而线程间可能出现同步或其它问题,导致线程异常,单线程出问题会直接导致整个程序出问题。

扩展性

  • 多进程编程、调试可以相互独立,相对于多线程不会互相影响,因此也更简单,方便。
  • 多进程适合于多核、多机分别式,如果一台机器不够,扩展到多台机器比较简单;而多线程适合于单机多核分布式。

个人总结

  • 类似嵌入式平台下C和C++的选择,如果追求性能,将性能放第一位,开发效率放第二位,可采用单进程多线程架构;如果程序复杂度较高,并且追求开发效率和稳定性,性能放第二位,资源充裕,可采用多进程多线程架构。
  • 在嵌入式平台上内存等资源都是不充裕的,即使是对单个进程而言,因此使用多进程来占用更多的资源在嵌入式平台是无意义的,但是多进程更具有独立性,对开发人员也更友好。
  • 使用多进程模型,需要使用到进程通信,但是进程通信相对于同进程通信更为麻烦,需要有能满足条件的进程通信模块(成熟、功能强大并且使用简单),在嵌入式平台,只有少量进程通信框架,大部分需要自主实现,Linux基本机制的简单使用不满足复杂需求,因此在嵌入式平台,大部分中小公司项目使用的是单进程模型。

功能划分

  1. 需要频繁创建和销毁的功能优先用线程。
  2. 需要进行大量计算的功能(CPU密集型)优先使用线程,例如:常见的图像处理、算法处理,要耗费很多CPU,不适合频繁切换,以及在数据通信上花费资源,这种情况下线程是最合适的。
  3. 强相关的功能适合于存在于单进程中的多线程,弱相关的处理,较为独立的功能适合于使用多进程。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值