最近在看北电代码的时候,发现,系统中大部分模块都采用的是一个进程/一个线程的设计方式,一个大的功能模块由多个进程构成。因为系统是运行在Linux平台上,一开始,我觉得这种设计是有问题,追溯根源,以为是北电之前使用的操作系统是vxworks,那帮北美的开发人员把vxworks中task的概念生搬硬套到linux中,在linux中提供了比进程性能更高的线程,他们并没有充分的利用起来。之后认真思考了一下,发现,他们这样设计是有道理的。分析如下,我们先来说说进程和线程的区别吧。
区别:
1. 进程是资源拥有的基本单位,线程是调度的基本单位,在CPU上调度的是线程,当任务切换的时候,需要将资源进行保存。
2. 在一个进程内部可以运行多个线程,线程切换不需要资源保存,这些线程共享进程的资源,地址空间。进程切换需要资源保存。
3. 进程之间的同步是可以通过各种IPC,各种进程锁,信号量,信号来实现,比如文件锁,自旋锁,RCU等。而线程之间的同步可以通过进程内部锁来实现,比如互斥锁,读写锁等。
在设计中为什么要使用多进程单线程的这种模式呢?我的理解如下:
1. 增加整个系统的健壮性,比如一个进程做两件事情,任何一件事情做失败都会导致另外一件事情不能做。如果将这个进程里的功能解耦,系统的健壮性自然也随之增强。单点故障的几率减小。
2. 从开发角度讲,这种解耦也便于系统升级,对其中的某一个模块升级变得更加容易而不会影响到其他功能模块。
3. 虽然性能不如多线程,但是多线程编程适用于高级程序员,对编程技巧要求高。使用多进程其实性能差别就在于进程切换资源保存部分,多线程模型会把进程间数据传递的开销转到锁开销上。
4. 减小整个会话阻塞在单个进程中,使得整个系统的吞吐量增大。
以上理解,是我对多进程/单线程模型的一点心得。
补充一下,多进程也便于并行开发,并且能够方便部分重启功能实现,另外也方便了外部程序控制,比如控制各个模块启动顺序
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tq02h2a/archive/2009/04/26/4124902.aspx