很多情况下我们会遇到编程模型选择的问题:多进程 or 多线程 ? 下面简要介绍下两者区别:
多进程 | 多线程 | |
资源 | 进程是资源分配的基本单位,独占用整个进程所有资源 | 进程内所有线程共享进程资源
|
通信 | 需要借助共享内存、管道、信号量、socket等方式实现 | 由于线程资源共享,很容易实现各线程间消息通信 |
编程 | 编程调试简单,可靠性高,创建销毁系统开销大 | CPU调度的基本单位,切换速度快,资源访问互斥、同步导致编程复杂度增加,同时也不方便调试 |
信号 | 每个进程独立控制信号 | 进程内所有线程共享信号处理函数,除了SIGSEGV,SIGALRM这样的信号会直接发送给调用线程,其余的信号都默认交给主线程。信号处理逻辑复杂 |
上面表格中写出了多线程、多进程的基本区别,除了上述内容我们还有一些需要关注的点:
由于所有线程共享进程的资源,因此所有线程能够打开的最大文件描述符数(包含socket)之和等于进程支持的最大文件描述符数;所有线程栈(默认8MB)大小的总和等于进程访问的最大地址空间,因此如果线程创建了一个超大的局部数组或者其他结构,可能会导致所有线程所占的地址空间总和超出进程地址空间的范围进而触发SIGSEGV段错误,致使整个程序崩溃。
多线程的优势在于共享进程中的全局资源以及堆区资源,极大方便了各个线程间信息的交换;在带来方便的同时,为了保