多进程、多线程

多进程、多线程

很多情况下我们会遇到编程模型选择的问题:多进程 or 多线程 ? 下面简要介绍下两者区别:

  多进程 多线程
资源 进程是资源分配的基本单位,独占用整个进程所有资源
进程内所有线程共享进程资源

通信 需要借助共享内存、管道、信号量、socket等方式实现 由于线程资源共享,很容易实现各线程间消息通信
编程 编程调试简单,可靠性高,创建销毁系统开销大 CPU调度的基本单位,切换速度快,资源访问互斥、同步导致编程复杂度增加,同时也不方便调试
信号 每个进程独立控制信号 进程内所有线程共享信号处理函数,除了SIGSEGV,SIGALRM这样的信号会直接发送给调用线程,其余的信号都默认交给主线程。信号处理逻辑复杂

上面表格中写出了多线程、多进程的基本区别,除了上述内容我们还有一些需要关注的点:

  1. 由于所有线程共享进程的资源,因此所有线程能够打开的最大文件描述符数(包含socket)之和等于进程支持的最大文件描述符数;所有线程栈(默认8MB)大小的总和等于进程访问的最大地址空间,因此如果线程创建了一个超大的局部数组或者其他结构,可能会导致所有线程所占的地址空间总和超出进程地址空间的范围进而触发SIGSEGV段错误,致使整个程序崩溃。
  2. 多线程的优势在于共享进程中的全局资源以及堆区资源,极大方便了各个线程间信息的交换;在带来方便的同时,为了保证每个线程在访问这些共享资源时的正常访问,需要对这些共享资源的访问添加互斥、同步机制,这就增加了多线程程序的开发、调试难度,程序的稳定性难以把控。
  3. 信号处理在多线程程序开发时,也是需要考虑的一点;建议在多线程程序中,创建单独的线程利用sigwait等函数同步处理信号,其余线程直接屏蔽信号,这样避免了注册信号处理函数这种异步处理方式导致的问题。

之前看到很多人疑问,为什么高性能的nginx、redis要采用多进程模型而不是多线程模型?

我来根据上面对多进程、多线程的分析来尝试解答下:

  1. nginx、redis每个单独的进程都可以支持很大的连接数,通常情况下每个服务器会开几十个nginx、redis进程,这样如果采用多线程的模式,进程所能提供的最大连接数就限制了所有线程的并发了,成为进一步提高性能的瓶颈。
  2. nginx中除了master需要跟worker通过管道进行通信,worker之间不需要通信,而且每个worker的功能都一样,属于常驻进程。在这种场景下多线程的优势体现不出来,而且也可以避免多线程因为资源互斥、同步带来的额外资源开销。
  3. nginx采用多进程的方式,既可以避免因某个线程故障导致整个服务不可用的问题,也可以实现配置热加载,不停服升级版本。

注:nginx是有线程池的选项的,但是该线程池也是在每个worker中用于处理业务的,对于连接的处理还是由主线程来完成的;在这里多线程只是对nginx多进程的一个补充,而不是替代。

redis目前在执行aof、bgsave等操作时,由于是单线程,所以会导致请求延时临时增大,服务不稳定。redis的作者希望在将来引入线程来处理这种IO密集型的操作

时间: 2024-10-02 07:38:40

多进程、多线程的相关文章

Linux统系统开发11 Socket API编程2 多进程 多线程 高并发处理

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <纲要> Linux统系统开发11 Socket API编程2 多进程 多线程 高并发处理 UDP服务器 客户端最小模型,处理字符转大写 TCP 多进程并发服务器模型,为每个客户端开启一个进程: TCP 多线程服务器模型,使用wrap函数封装 作业: ---------------------------------------------------- UDP服务器 客户端最小模型,处理字符转大写 [em

一个简单的多进程+多线程+协程的例子

因为一个朋友最近想搞接口压力测试,推荐了jmeter,因为jmeter开源,且有命令行启动模式,方便封装.兴起时,自己也简单实现了一下高并发的脚本. 采用的是多进程+多线程+协程.想法是这样的,多进程是为了有效利用多核,理论上最好一个核对应一个进程比较好:那我为什么还要用多线程呢?不怕GIL全局锁吗?这是因为我用了gevent处理,请求采用requests,但requests是阻塞的方法,所以我把requests操作丢到协程做,就没啥问题了.接下来看看脚本,实现了一个2000并发量的脚本(写的比

关于Python和Java的多进程多线程计算方法对比

原文请见 关于Python和Java的多进程多线程计算方法对比 搞大数据必须要正视的一个问题就是并行计算.就像执行一件任务一样,大伙一起同时干,才有效率,才会很快出成果.正所谓"众人拾柴火焰高"~ 对于并行计算,有很多高大上的概念,我也不全懂.这里就单单罗列一下我对于多进程和多线程计算的理解和总结. 在计算机中,处理一个任务,可以在一个进程中,也可以在一个线程中,确切的说,执行的话都得靠一个个线程来.在我们做某件事的时候,往往需要同时干多个任务才能达到我们所要的效果,比如说看电影,就要

C/S架构与多进程多线程

如题,C/S架构指的是服务器(Server)与客户机(Client)协作完成网络程序功能的一种模式.它是已经在计算机世界活跃数十年的一种古老的软件架构.如今已渗入到各领域IT系统中.其模型如下所示. 本文从以下3个方面阐述C/S架构软件设计与多进程多线程实现多任务框架. 1.C/S工作原理 2.多任务设计 3.多进程与多线程选择 1.C/S工作原理 从计算机技术发展到应用到通信金融等商业领域时候起,C/S模式的需求就随之诞生了. 其工作模式能够满足众多客户的计算机使用需求,且能够简化程序设计的过

[转帖]Windows和Linux对决(多进程多线程)

Windows和Linux对决(多进程多线程) https://blog.csdn.net/world_2015/article/details/44920467 太长了 还没看完.. 还是没太理解好呢.. 关于 windows 和 linux的东西 先放这里 晚上有时间仔细啃一下. 并行程序设计分为共享内存和消息驱动(其实就是分布式内存)两种, 共享内存:所有CPU共内存,所有CPU由一个操作系统控制的,例如Windows和Linux/UNIX,目前流行的多核.多CPU机器都是属于这种: 消息

重学浏览器(1)-多进程多线程的浏览器

浏览器是我们上网的一个重要工具,是我们重要的信息来源,这里以Chrome浏览器为对象,同时作为一名前端工程师,之前对于浏览器的认知还不够深入,所以借着这一系列的文章,进行浏览器的逐步分析与学习,加深自己的知识储备.同时这部分知识也是做页面性能优化,健康度监控等工具时所必须的基础知识. 进程和线程 进程是系统内存分配的一小部分内存空间 进程之间相互独立(不同进程之间可以相互通信,不过代价很大) 进程由单个或多个线程组成 多个线程之间是可以相互协作完成工作的 同一个进程中各个线程之间共享同一块内存空

Linux 多进程多线程相关概念

进程:可执行程序是存储在磁盘设备上的由代码和数据按某种格式组织的静态实体,而进程是可被调度的代码的动态运行.在Linux系统中,每个进程都有各自的生命周期.在一个进程的生命周期中,都有各自的运行环境以及所需的资源,这些信息都记录在各自的进程控制块中,以便系统对这些进程进行有效的管理,进程控制块的结构如下图所示: 每个进程都有各自独立的虚拟地址空间,空间的大小与所基于的硬件体系结构有关.虚拟空间中各区代表的意义,代码段存储指令序列和只读数据,多个进程实例可共享代码段.数据段用来存放全局变量和静态变

(转)多进程 &amp; 多线程的区别与适用场景

转自:http://www.cnblogs.com/huntfor/p/4021327.html 关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你深受其害.经常在网络上看到有的XDJM问“多进程好还是多线程好?”.“Linux下用多进程还是多线程?”等等期望一劳永逸的问题,我只能说:没有最好,只有更好.根据实际情况来判断,哪个更加合适就是哪个好.我

【转】多进程 &amp; 多线程的区别与适用场景

关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你深受其害.经常在网络上看到有的XDJM问“多进程好还是多线程好?”.“Linux下用多进程还是多线程?”等等期望一劳永逸的问题,我只能说:没有最好,只有更好.根据实际情况来判断,哪个更加合适就是哪个好.我们按照多个不同的维度,来看看多线程和多进程的对比(注:因为是感性的比较,因此都是相对的,不是说一个

GDB常用调试命令以及多进程多线程调试

转载自:http://blog.csdn.net/freeelinux/article/details/53700266 一:普通命令 1.list命令 list  linenum      显示程序第linenum行周围的程序 list  function      显示函数名为function的函数的源程序 list                      显示当前行后面的源程序 list -                    显示当前行前面的源程序 2.run(r) 运行命令. ru