进程、线程、多进程、多线程的优缺点和区别

2023-05-16

进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。

线程:是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。

一个程序至少一个进程,一个进程至少一个线程。

为什么会有线程?

  每个进程都有自己的地址空间,即进程空间,在网络或多用户换机下,一个服务器通常需要接收大量不确定数量用户的并发请求,为每一个请求都创建一个进程显然行不通(系统开销大响应用户请求效率低),因此操作系统中线程概念被引进。

  • 线程的执行过程是线性的,尽管中间会发生中断或者暂停,但是进程所拥有的资源只为改线状执行过程服务,一旦发生线程切换,这些资源需要被保护起来。
  • 进程分为单线程进程和多线程进程,单线程进程宏观来看也是线性执行过程,微观上只有单一的执行过程。多线程进程宏观是线性的,微观上多个执行操作。

线程的改变只代表CPU的执行过程的改变,而没有发生进程所拥有的资源的变化。 

进程线程的区别:

  • 地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
  • 资源拥有:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。

     一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

     进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程

  • 执行过程:每个独立的进程程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
  • 线程是处理器调度的基本单位,但是进程不是。
  • 两者均可并发执行。

优缺点:

  线程执行开销小,但是不利于资源的管理和保护。线程适合在SMP机器(双CPU系统)上运行。

  进程执行开销大,但是能够很好的进行资源管理和保护。进程可以跨机器前移。

何时使用多进程,何时使用多线程?

对资源的管理和保护要求高,不限制开销和效率时,使用多进程。

要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。

一. 在Linux下编程多用多进程编程少用多线程编程

IBM有个家伙做了个测试,发现切换线程context的时候,windows比linux快一倍多。进出最快的锁(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。当然这并不是说linux不好,而且在经过实际编程之后,综合来看我觉得linux更适合做high performance server,不过在多线程这个具体的领域内,linux还是稍逊windows一点。这应该是情有可原的,毕竟unix家族都是从多进程过来的,而 windows从头就是多线程的。

如果是UNIX/linux环境,采用多线程没必要。多线程比多进程性能高?误导!应该说,多线程比多进程成本低,但性能更低。在UNIX环境,多进程调度开销比多线程调度开销,没有显著区别,就是说,UNIX进程调度效率是很高的。内存消耗方面,二者只差全局数据区,现在内存都很便宜,服务器内存动辄若干G,根本不是问题。

多进程是立体交通系统,虽然造价高,上坡下坡多耗点油,但是不堵车。多线程是平面交通系统,造价低,但红绿灯太多,老堵车。就比如我们都开跑车,油(主频)不是问题,也不怕上坡下坡,但就怕堵车。

高性能交易服务器中间件,如TUXEDO,都是主张多进程的。实际测试表明,TUXEDO性能和并发效率是非常高的。TUXEDO是贝尔实验室的,与UNIX同宗,应该是对UNIX理解最为深刻的,他们的意见应该具有很大的参考意义。


二. 进程

1. 进程的优点

  • 顺序程序的特点:具有封闭性和可再现性;
  • 程序的并发执行和资源共享。多道程序设计出现后,实现了程序的并发执行和资源共享,提高了系统的效率和系统的资源利用率。

2. 进程的缺点

  • 操作系统调度切换多个线程要比切换调度进程在速度上快的多。而且进程间内存无法共享,通讯也比较麻烦。
  • 线程之间由于共享进程内存空间,所以交换数据非常方便;在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

三. 线程

1. 线程的优点

  • 它是一种非常”节俭”的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种”昂贵”的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。当然,在具体的系统上,这个数据可能会有较大的区别;

  • 线程间方便的通信机制,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便;

  • 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上;

2. 线程的缺点

  • 调度时, 要保存线程状态,频繁调度, 需要占用大量的机时;

  • 程序设计上容易出错(线程同步问题)。


四. 多进程

1. 多进程优点

  • 每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;
  • 通过增加CPU,就可以容易扩充性能;
  • 可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;
  • 每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大

2. 多进程缺点

  • 逻辑控制复杂,需要和主程序交互;
  • 需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算
  • 多进程调度开销比较大;

五. 多线程

1. 多线程的优点

  • 无需跨进程边界;
  • 程序逻辑和控制方式简单;
  • 所有线程可以直接共享内存和变量等;
  • 线程方式消耗的总资源比进程方式好;

2. 多线程缺点

  • 每个线程与主程序共用地址空间,受限于2GB地址空间;
  • 线程之间的同步和加锁控制比较麻烦;
  • 一个线程的崩溃可能影响到整个程序的稳定性;
  • 到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;
  • 线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU

在开发中,最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然你也可以利用多线程+多CPU+轮询方式来解决问题。方法和手段是多样的,关键是自己看起来实现方便有能够满足要求,代价也合适。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程、线程、多进程、多线程的优缺点和区别 的相关文章

  • SQL常用语句大全

    我们在进行开发工作时 xff0c 对数据库的操作是必不可少的 xff0c 熟练掌握SQL语句可以让我们对数据库的数据处理变得非常简单 xff0c 所以学习SQL语句是非常有必要的 xff0c 下面汇总了一些常用的SQL语句 SQL语句的类型
  • VS配置Qt环境

    前言 Qt程序的开发不仅可以使用原生的Qt Creator xff0c 也可以使用Visual Studio 想使用VS进行Qt程序的开发 xff0c 需要安装Qt的插件 xff0c 下面看详细步骤 下载Qt的插件 地址 xff1a htt
  • STM32官方标准固件库开发与寄存器开发的区别

    一句话概括关系 xff1a 固件库就是函数的集合 xff0c 固件库函数的作用就是 xff1a 向下负责与寄存器直接打交道 xff0c 向上提供用户函数调用的接口 xff08 API xff09 对于STM32这种级别的MCU xff0c
  • CMake获取目录下所有源文件

    1 aux source directory指令 aux source directory lt dir gt lt variable gt 比如 xff1a aux source directory CMAKE CURRENT SOURC
  • Qt制作视频播放器

    前言 该播放器参考了SMPlayer xff0c 实现了其基础功能 xff0c 许多高级功能暂未实现 软件的实现基于Qt xff0c opencv xff0c 多线程以及数据库等相关知识 功能概述 支持本地音视频在线播放 xff0c url
  • Qt中QString与String的互相转换

    前言 Qt中的一些类型是Qt自己封装的 xff0c 例如我们平常常见的String在Qt中就是QString xff0c 但是有时我们调用第三方库时 xff0c 参数要求是String xff0c 这时我们就需要把QString转换成Str
  • Mat与QImage互相转换

    前言 Mat是opencv中的存储图像的容器 xff0c 也是图像像素矩阵 QImage是Qt中存储图片常用的类 Qt和opencv经常配合在一起使用 xff0c 但Qt的函数方法的参数是不接受Mat的 xff0c 所以如果我们想要在Qt中
  • CentOS7下安装libevent

    前言 CentOS7下安装libevent网络库 步骤 创建一个文件夹libevent xff08 方便后期维护管理 xff09 mkdir libevent 官网下载源码包 可以在本机下载然后文件传输 xff0c 也可以直接在linux下
  • Libevent源码深度剖析-张亮(转载)

    https blog csdn net xp178171640 article details 105490027
  • Qt6.4.3编译MySQL驱动

    前段时间电脑坏了重装了操作系统 软件都不能正常运行 大部分都得重装 本来用的Qt5 14 2 想着Qt都出6了 那就用用Qt6吧 Qt6想用mysql数据库也是得自己编译驱动的 但Qt6也是想推广CMake 所以我以前Qt5那一套编译mys
  • keil5中如何在一个项目中新建源文件

    哈喽哈喽 xff0c 昨天在学习如何点灯的时候接触到可以在一个已经建立好的项目中 xff0c 建立一个新的源文件写一个新的代码 这里就总结一下 点开file选择new xff0c 就会发现右边多个栏就说明源文件多了一个 xff0c 这个时候
  • 【Python数据分析】Python模拟登录(一) requests.Session应用

    最近由于某些原因 xff0c 需要用到Python模拟登录网站 xff0c 但是以前对这块并不了解 xff0c 而且目标网站的登录方法较为复杂 xff0c 所以一下卡在这里了 xff0c 于是我决定从简单的模拟开始 xff0c 逐渐深入地研
  • 【VSCode】C++环境配置(小白必看)

    关于VSCode的c 43 43 环境配置 网上教程很多 xff0c 但大多是入门的新手小白难以理解 xff0c 操作不来的 xff0c 作者本人也是捣鼓了很久才配置好c 43 43 运行环境 本篇文章会从头到尾简述 一下vscode配置c
  • at89c51单片机设计的智能空调系统 制冷制热加湿除湿四个工作模式 按键和手机App遥控两种控制方式

    at89c51单片机设计的智能空调系统 制冷制热加湿除湿四个工作模式 按键和手机App遥控两种控制方式 半导体制冷片模拟除湿制冷 超声波雾化模块加湿 温湿度传感器检查环境温湿度 LCD液晶屏显示系统工作状态 全套包括实物成品 xff0c 原
  • Java常用类 - String类详解

    Java常用类 String类 创建字符串 xff1a 每个双引号括起来的字符串常量都是String类的一个实例 xff1b 也可以new 连接字符串 xff1a 43 xff1b string1 concat string2 span c
  • 如何利用#将宏定义中的参数插入到字符串中?

    首先明白几个原理 xff1a 在宏定义中 xff0c 如果宏参数为字符串 xff0c 可以把这个字符串放到字符串中 xff0c 但如果宏参数为变量的话就不可以 可以把宏定义中的参数转化为相应的字符串 xff0c 这时就可以把这个参数放到字符
  • ssmJavaEE无人机数据管理系统 毕业设计源码111022

    ssm无人机数据管理系统 摘 要 随着互联网趋势的到来 xff0c 各行各业都在考虑利用互联网将自己推广出去 xff0c 最好方式就是建立自己的互联网系统 xff0c 并对其进行维护和管理 在现实运用中 xff0c 应用软件的工作规则和开发
  • 【C语言】字符串函数strcat即自主实现

    目录 一 strcat函数 二 自主实现strcat 一 strcat函数 1 功能 xff1a 连接字符串 将源字符串的副本追加到目标字符串 目标中的终止空字符被源的第一个字符覆盖 xff0c 并在目标中两者的连接形成的新字符串的末尾包含
  • 2023版Postman接口测试使用全指南(原来使用 Postman测试API接口如此简单)

    下面是一篇详细介绍postman接口测试的文章 xff0c 如果文章内容不太明白的话 xff0c 我建议看看视频版本 xff0c 更加清洗 xff0c 更加直观 xff01 最详细的postman接口测试实战教程 哔哩哔哩 bilibili
  • Qt QDebug格式输出、自定义类输出及重定向输出Log

    1 qDebug 格式化输出 qDebug格式化支持printf的格式化标识符 如果向函数传递格式字符串和参数列表 xff0c 它的工作方式类似于C printf 函数 格式应该是Latin 1字符串 格式化demo 代码如下 xff08

随机推荐