进程 vs 线程:你需要知道的关键区别

news2024/10/25 17:20:24

“大树根深,才能迎风而立。”

进程:计算机中正在执行的程序的实例,它是操作系统进行资源分配的基本单位。

通过写特殊代码,把多个 CPU 核心都能利用起来,这样的代码就称为“并发编程”。

虽然多进程能够解决问题,但是随着对于效率的要求越来越高,就希望有更好的方式来实现并发编程。

多进程编程最大的问题就是,进程太“重”了。

在创建进程和销毁进程的时候,开销是比较大的(在时间和空间上)。一旦需求场景,需要频繁的创建销毁进程,开销就会非常明显了!

最典型的就是服务器开发了,服务器需要针对每个发送请求的客户端,都单独创建一个进程,由这个进程负责给客户端提供服务。

为了解决进程开销比较大的问题,发明了 “线程”!

线程:是操作系统能够进行运算调度的最小单位,它是进程内的一条执行路径。

对于线程呢?可以理解成,更轻量的进程。也能解决并发编程的问题,但是创建/销毁的开销,要比进程更低。因此,多线程的编程,就成了当下主流的并发编程方式了。

所谓的进程,在系统中,是通过 PCB 这样的结构体来描述,通过链表的形式来组织。

那么系统中,同样也是通过 PCB 来描述线程的(Linux)。

一个进程,其实是一组 PCB。

一个线程,其实是一个 PCB。

两者之间存在了包含关系,一个进程中包含了一个或多个线程,不能没有。

此时,每个线程,都可以独立的到 CPU 上调度执行。

线程是系统“调度执行”的基本单位。

进程是系统“资源分配”的基本单位。

一个可执行程序运行的时候,操作系统就会创建进程,给这个程序分配各种资源(CPU,内存,硬盘,网络带宽……),同时也会在这个进程中,创建出一个或者多个线程,这些线程再去 CPU 上调度执行。

同一个进程中的这些线程,共用同一份系统资源的。

线程比进程更轻量,主要就在于创建线程,省去了“分配资源”的过程,销毁线程也省去了“释放资源”过程。

一旦创建进程,同时也会创建第一个线程,就会给其分配资源,一旦后续创建第二个第三个线程,就不必重新分配资源了。


下面就以一些图和例子来讲解说明:

假设一个进程执行一个任务,执行吃北京烤鸭的任务:

滑稽老铁执行吃一百只北京烤鸭的任务,一百只烤鸭对于滑稽老铁来说,是可以完成的,但就是速度会很慢!

为了提高“吃鸭子”的效率,就引进了“多进程”的方案。

虽然消耗的资源多了,两个房子,两张桌子,两个滑稽老铁。 但是每个房间里的北京烤鸭就只有50份了。两个人吃起来的效率,就比一个快多了。为了创建一个进程,给它分配了房间和桌子等这样的资源。

下面我们引入多线程来看看:

 房子和桌子都没有额外的申请,房间和桌子都是同一个,没有再次申请系统资源。这样的吃鸡效率和多进程的方案一样,但是和多进程的方案相比,多线程对于系统的开销较小!

那么如果进一步增加线程的数量呢?

此时每个滑稽老铁负责的北京烤鸭更少了,速度比刚才又进一步提升了!随着线程的数量增加,每个线程需要负责的工作量就会减少,这些线程一旦同时开始工作,那么总的消耗的时间也会进一步减少!

下面进一步增加线程的数量呢?我们一起来看一看:

线程的数量越来越多之后,此时,效率也没办法进一步得到提升了,桌子的空间是有限的,房子的空间也是有限的。当滑稽老铁的数目到达一定数量之后,有些人就够不了桌子了,此时就吃不到北京烤鸭了!

此时就很容易发生“冲突”,由于多个线程使用的是该进程的资源。 一旦发生冲突,就可能使程序出现问题“线程安全问题”,我在之前的博客中有写到。

一旦某个线程抛出异常,这个时候如果能够妥善处理,那还好。一旦处理不当,就可能导致整个进程都崩溃,因此其他线程就会随之崩溃!

难办那就别办了! 


进程和线程的区别:

  1. 进程包含线程(一个进程里可以只有一个线程,也可以有多个线程,但是不能没有线程)
  2. 进程是系统资源分配的基本单位,线程是系统调度执行的基本单位
  3. 同一个进程中的线程之间,共用同一份系统资源(内存,硬盘,网络带宽等……)
  4. 线程是当下实现并发编程的主流方式,通过多线程可以充分利用好,多核CPU(但是也不是线程的数量越多越好,当线程数量到达一定程度之后,就会把多个核心都充分利用完了。此时再继续增加线程数量,可能就会带来一些不好的影响)
  5. 多个线程之间,可能会相互影响,线程安全问题,一旦线程抛出异常,也可能把其他线程也一起带走。
  6. 多个进程之间,一般不会相互影响,一旦进程崩溃,不会影响到其他进程

    本期的内容,到此结束咯!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2210711.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP商会招商项目系统一站式服务助力企业腾飞

商会招商项目系统——一站式服务,助力企业腾飞 🚀💼 🚀 开篇:企业成长的加速器,商会招商项目系统来袭 在竞争激烈的市场环境中,企业如何快速找到适合自己的发展路径,实现腾飞&…

CUDA(C)磁态蒙特卡洛和传输矩阵多GPU并行计算分析

🎯要点 使用英伟达GPU、大都会和并行回火算法模拟蒙特卡洛。使用兰佐斯算法计算传输矩阵特征值。使用 Suzuki-Trotter 公式归一化量子无序系统。算法模型特征:多CUDA线程,多GPU和多任务式并行计算。 🍁磁态分析角度 Python和MA…

BUUCTF-[2019红帽杯]easyRE(Reverse逆向)

第一步 查壳 如图,无壳,ELF文件 第二步 IDA 64位IDA,无法直定位到主函数F5,所以使用,查找关键字符串定位主函数大法ShiftF12 发现这些关键字符串,双击上图蓝色字符串, 然后交叉引用CtrlX跟踪 …

硬件-示波器-巧用触发功能捕捉不连续的信号波形

文章目录 一:使用示波器的信号触发功能二:介绍示波器触发模式界面2.1 触发模式的AUTO档2.2 触发模式的Normal档(普通档)2.3 触发模式的single档(单次触发档) 三:在多通道的情况下,选…

电鳗带来灵感,防潮电源诞生,全打印技术的魅力

大家好!今天来了解一项受电鳗启发的防潮完全可打印电源的研究——《A moisture-enabled fully printable power source inspired by electric eels》发表于《PNAS》。随着可穿戴电子设备的发展,对安全、一次性且具成本效益的电源需求大增。传统电池存在不…

react native 与 react.js 的区别

React.js ReactJS是一个 JavaScript 库,支持前端 Web 和在服务器上运行,用于构建用户界面和 Web 应用程序。 它主要重点是Web 开发,遵循可重用组件的概念。 React 的虚拟 DOM 比传统的完全刷新模型更快,因为虚拟 DOM 只刷新页面的…

透过《当音乐停止之后》,理解2008年次贷危机:债务、流动性与资本的无声博弈

金融市场就像是整个经济体的循环系统,现代经济体依赖各种授信机制输送营养到整个系统,维持经济的正常运转。书中揭示了2008年次贷危机的背景,以及量化宽松(QE)政策的作用。通过作者的讲述,我们真正了解2008…

前端继承:原理、实现方式与应用场景

目录 一、定义 二、语法和实现方式 1.原型链继承 2.构造函数继承 3.组合继承 4.ES6类继承 三、使用方式 四、优点 五、缺点 六、适用场景 一、定义 前端继承是指在面向对象编程中,一个对象可以继承另一个对象的属性和方法。在前端领域,通常是指…

HC32F460KETA PETB JATA 工业 自动化 电机

HC32F460 系列是基于 ARM Cortex-M4 32-bit RISC CPU,最高工作频率 200MHz 的高性能 MCU。Cortex-M4 内核集成了浮点运算单元(FPU)和 DSP,实现单精度浮点算术运算,支持 所有 ARM 单精度数据处理指令和数据类型&#xf…

【精选】基于javaweb的流浪动物领养系统(源码+定制+开发)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

centos系列图形化 VNC server配置,及VNC viewer连接,2024年亲测有效

centos系列图形化 VNC server配置,及VNC viewer连接 0.VNC服务介绍 VNC英文全称为Virtual Network Computing,可以位操作系统提供图形接口连接方式,简单的来说就是一款桌面共享应用,类似于qq的远程连接。该服务是基于C/S模型的。…

鸿蒙NEXT开发-知乎评论小案例(基于最新api12稳定版)

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

vue实现列表自动滚动(纯与原生方式)

Vue实现列表自动滚动(纯与原生方式) 源码放在最后!1.效果展示: 2.功能说明: 该滚动可能存在的Bug: 1.如果你写的大屏不是使用的接口轮询的方式可能会存在也页面空白的情况(需要手动刷新才能触发列表滚动),因为我使用的是监听数据的变化然后…

软件供应链十年:探索开源的增长、风险和未来

回顾软件供应链状况报告的 10 年既是一个里程碑,也是一次行动号召。在过去十年中,开源消费改变了软件开发的世界。我们看到了前所未有的创新,但也出现了新的挑战,特别是在管理软件供应链的安全性和完整性方面。 在 Sonatype&…

基于SpringBoot民宿预订系统小程序【附源码】

效果如下: 管理员登录界面 管理员功能界面 用户管理界面 房东管理界面 小程序首页界面 民宿房间界面 功能界面 研究背景 随着旅游业的蓬勃发展和人们对旅行体验的不断追求,民宿作为一种独特的住宿方式,因其个性化、温馨及富含地方特色的服务…

disabled状态el-form下el-button的disabled的精细化控制

有一个很复杂的表单,支持编辑和查看两种模式。 查看时当然不希望编辑,最好是区分模式,在编辑模式下直接用div显示而不是用表单元素。这样工作量就有点大。那就考虑使用表单元素的disabled来让其不能编辑。如果每个表单元素都写这个玩意也是…

ssm职业高中学情成绩系统设计+jsp

系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习,获取源码请私聊我 需要定制请私聊 目 录 摘 要 I Abstract II 第一章 绪论 1 1.1 研究背景 1 1.2 研究意义 1 1.3 研究内容 2 第二章 开发环…

codeforces round976 div2

A find minimum operations 思路&#xff1a;将所给的n变成k进制数&#xff0c;答案就是n的k进制形式下的位数之和 代码&#xff1a; #include <bits/stdc.h> using namespace std;typedef long long ll;ll n, k;void solve() {cin >> n >> k;ll cnt 0…

详解Spotbugs-maven-plugin(报告如何生成html测试报告)

Spotbugs介绍 SpotBugs是Findbugs的继任者&#xff08;Findbugs已经不再维护&#xff09;&#xff0c;用于对Java代码进行静态分析&#xff0c;查找相关的漏洞&#xff0c;SpotBugs比Findbugs拥有更多的校验规则。静态分析会检查Java字节码&#xff08;.class文件&#xff09;…

专题十一_递归_回溯_剪枝_综合练习_算法专题详细总结

目录 1. 找出所有⼦集的异或总和再求和&#xff08;easy&#xff09; 解析&#xff1a; 方法一&#xff1a; 解法二&#xff1a; 总结&#xff1a; 2. 全排列 Ⅱ&#xff08;medium&#xff09; 解析&#xff1a; 解法一&#xff1a;只关心“不合法”的分支 解法二&…