能把进程和线程讲的这么透彻的,没有20年功夫还真不行【0基础也能看懂】

本篇会加入个人的所谓鱼式疯言

❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言

而是理解过并总结出来通俗易懂的大白话,

小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.

🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!

在这里插入图片描述

在这样一个充满无限可能的时代,我们正站在科技、文化与创新的交汇点上,每一天都有新的故事等待被讲述。从遥远星系的奥秘到微观世界的奇妙,从人类历史的深邃长河到未来梦想的璀璨星辰,每一个领域都蕴藏着无尽的知识和智慧。让我们一起探索未知,挑战极限,共同书写属于我们的精彩篇章

前言

在上篇的计算机组成原理中,我们认知到了计算机的构成和背后的工作原理,学习到了冯诺依曼体系结构和CPU的重要指标 ,以及 操作系统 的作用, 相关的 指标基本的工作原理

而本篇文章中讲提及一个更重要也是 面试中常考的的重要的热门点 之一 —— 进程和线程

废话不多说,咱们直接上菜吧 🤤 🤤 🤤 🤤

目录

  1. 进程的初识

  2. 线程的初识

  3. 线程和进程的关系

  4. 线程的缺陷

一. 进程的初识

1. 进程的引入

上一篇我们提及到

在以前,CPU只有 一个核心 ,但是却可能实现多个进程的执行,那是因为 分时复用(先执行一个进程, 再转过来 执行另外一个进程 ) 同样也能达到我们 多个进程(任务)的同时进行 。像这种我们称为 并发执行

而如今我们 CPU有多个核心, 就可以实现多个进程的执行, 让多个CPU的核心同时执行, 这样的也就能大幅度的提高效率 。 而这种我们称之为 并行执行

通过写代码可以把多个CPU核心都利用起来 , 这样的编程,我们就称之为 并发编程

而我们把 并发和并行 的两种的执行过程,都可以称之为 并发编程

还不了解的小伙伴可以参考小编的上篇文章

进程的并发执行文章链接

那么我们谈及的进程到底什么呢? 他发挥着什么作用呢? 不妨看看下面的简介吧 ! ! !

1. 进程的简介

像上面我们利用 多个CPU核心 ,实现多进程的就是我们 多进程编程

所以进程本质上 系统管理的软件资源 , 也称为 任务

多进程编程 是我们典型的 并发编程

多进程的虽然能解决多任务的问题,但如今对于效率的要求越来越高,同时也存在一些问题。

2. 多进程的不足

在 操作系统中, 进程的创建和销毁都会 消耗的较大的时间和空间

因为当执行一个 .exe 的程序(双击) 时, 操作系统 本身就会消耗这个程序的执行进程 分配系统资源 的过程。

而当 关闭这个程序运行 的时候, 就需要 销毁进程 , 就会产生 释放系统资源 的过程

虽然多进程编程能让开发者把 一个任务 分配给 多个进程同时执行 , 能够加快效率。

但一旦场景需要 , 我们就需要不断的 频繁创建销毁进程 , 由于比较 重量级的 , 这样的 开销是很大

鱼式疯言

  1. 栗子说明

试想一下这样的场景: 针对我们 服务器开发

客户端 每次发来的请求访问 , 都需要单独的 创建和销毁一次进程 ,由这个进程负责对 客户端提供服务 , 试想一下这样的开销的程度 !!!

  1. 进程的本质

用一句话概括就是 :

进程系统分配资源基本单位

那么对于上面问题, 我们该如何解决了 ? ? ?

二. 线程的初识

1. 线程的引入

上面我们说到对于一个 可执行程序 .exe 文件 来说, 当我们执行程序(双击) , 系统就会创建进程,给这个程序分配 各种系统资源 (CPU, 内存,硬盘, 网络带宽…) .

同时 创建进程的过程 中,也会创建一系列的 线程 , 让这些线程在 CPU上调度执行

所以线程的作用, 就是让程序在内存中利用 CPU核心调度执行

2. 线程的优势

回忆我们学习进程的问题,最大的不足就是进程很“重”, 每次创建/ 销毁的开销很大。

而线程的引入就直接解决了 进程开销大 的问题

因为线程创建是没有进程的创建时需要 分配系统资源 过程的。

线程是微量的进程, 当一个进程分配好一个系统资源后,线程就可以在进程分配好的资源下共用同一份系统资源

3. 举个栗子

<1>. 假如现在有个滑稽 在吃100只鸡 (一个房间, 一张桌子,和一个滑稽)

在这里插入图片描述

<2>. 为了提高吃鸡效率,我们引入了多进程方案

创建两个房间, 两张桌子,分别分出各50只鸡
在这里插入图片描述

这样的让两个滑稽同时吃50只,效率就增加了不少, 但是我们同时也需要开销创建房间,桌子… 的过程。 这样的过程就比较“重”

<3>. 引入多线程

让两个滑稽同时在同一个房间,同一张桌子上吃, 这样不仅提高了效率, 还省去了 多创建一个房间和桌子的过程

在这里插入图片描述

<4>. 如果多创建多个线程呢

创建了4个滑稽,每个滑稽平均吃25只,这样的话,速度又进一步提高

在这里插入图片描述

<5>. 但是如果创建 很多个线程

在这里插入图片描述

这时就会出现问题 ,会出现相互竞争的情况,有可能还会导致整个进程都崩溃。 这个具体下一节小编会细细道来

鱼式疯言

总结三句话

进程 是系统 资源分配基本单位

相当于 创建大工厂 相似。

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

相当于 征用工人工作 相似。

三. 进程与线程的关系

在这里插入图片描述

在上一篇文章中,我们谈到 进程是用一个 PCB这样的结构体描述并用链表结构组织的。

其实这句话,是针对只含有 含有一个线程的进程 来说。

本质上是

  • 一个进程中包含一组 PCB这样复杂的 PCB结构体 , 并用 链式结构 来组织的

  • 一个线程是 一个 PCB 结构体来描述,并用 链式结构 来组织的。

  • 所以 进程包含线程 , 并且 一个进程 是可以包含 多个线程 的。

并且当 一个进程 创建好, 系统资源分配完成 , 同时就会 一个 或 多个线程

但是一个进程中是 不能没有线程的 ,因为线程是 系统调度执行 的基本单位。

  • 并且这个线程是 共用同一份系统资源

  • 所以也就是为什么说, 线程是 微量的进程,不需要再分配资源, 就 不需要 额外的去开销

  • 但是每一个线程中的 优先级上下文记账信息这些单独的属性都是 独立不同的

这点小伙伴们一定要区分开哦

鱼式疯言

一句话概括:

进程 包含线程,每个进程至少有一个线程 ,虽然线程共用同一份资源, 但每个线程的 属性相互独立

四. 线程的缺陷

如果我们不断的创建线程的数目,就会出现下面问题。
在这里插入图片描述

像上面,如果我们线程创建过多, 桌子只有一张, 资源也只有那么多, 那么线程和线程之间就会 发生竞争,就会出现抢占资源的情况。

这样的执行效率就不会进一步的提升,反而还有可能减慢。

原因就是我们因为微观上 并发执行 的效果就 无法进一步提高 , 系统资源也只有那么多,CPU的核心也只有那么多 , 不能充分利用好线程, 执行一个任务转而接着执行另外一个任务。

可以理解为 通道 只有那么大,能运行 并发执行的线程 已经到达 上限了。

那么唯一的解决方案, 增加CPU的核心, 从提高并行执行 的效率, 让 不同线程同时执行不同的任务 ,从而有效的提高速度

关于CPU核心知识

CPU核心数知识

那么我们就可以理解为把 管道变宽 , 让能通过的线程变多, 自然就 速度加快,效率提高

鱼式疯言

有着 大量的线程就会出现竞争 ,如果 竞争激烈 的话, 一个线程的崩溃,就会 抛出异常

如果异常处理不当的话,就会导致整个进程都出现崩溃,进而就会带走 其他线程,造成 整个程序的崩溃

补充知识

但是每个进程之间是不影响的,当 进程进程 之间是 相互独立 的,一个进程的崩溃是不会影响其他进程的执行的。

总结

  • 进程的初识 :认识到进程是系统管理的软件资源, 是系统资源的基本单位, 但很"重”量, 创建/ 销毁进程消耗大。

  • 线程的初识: 线程是微量的进程,创建和销毁不需要额外消耗空间和时间, 是系统执行的基本单位

  • 线程和进程的关系: 进程包含线程, 进程至少要含有一个线程, 每个线程都有自己独有的属性。

  • 线程的缺陷 : 线程创建过多,就会出现资源不足,造成竞争激烈,进程停止,程序崩溃的问题。

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正

希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

在这里插入图片描述

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

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

相关文章

SQL Server 创建用户并授权

创建用户前需要有一个数据库&#xff0c;创建数据库命令如下&#xff1a; CREATE DATABASE [数据库名称]; CREATE DATABASE database1; 一、创建登录用户 方式1&#xff1a;SQL命令 命令格式&#xff1a;CREATE LOGIN [用户名] WITH PASSWORD 密码; 例如&#xff0c;创建…

FlinkErr:org/apache/hadoop/hive/ql/parse/SemanticException

在flink项目中跑 上面这段代码出现如下这个异常&#xff0c; java.lang.NoClassDefFoundError: org/apache/thrift/TException 加上下面这个依赖后不报错 <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId…

Python绘制相关系数热力图

相关系数热力图是一种可视化工具&#xff0c;用于展示变量之间的相关性。它在数据分析和统计中非常有用&#xff0c;尤其是在探索数据集的内在关系时。本文将介绍如何使用Python绘制相关系数热力图。 一、准备——导入库 使用Pandas来处理数据&#xff0c;Matplotlib和Seabor…

redis笔记2

redis是用c语言写的,放不频繁更新的数据&#xff08;用户数据。课程数据&#xff09; Redis 中&#xff0c;"穿透"通常指的是缓存穿透&#xff08;Cache Penetration&#xff09;问题&#xff0c;这是指一种恶意或非法请求直接绕过缓存层&#xff0c;直接访问数据库或…

Qt | 绘制椭圆、弧、弦、扇形、圆角矩形

点击上方"蓝字"关注我们 01、简介 1、需要使用到的 QPainter 类中的函数 2、绘制椭圆的方法有 绘制给定矩形的内接椭圆和根据中心点与椭圆 x 方向和 y 方向的半径绘制,原理见下图 3、绘制弧、弦、扇形的原理: 1)、弧是椭圆上的一段曲线,因此其绘制方法就是首先…

STM32之八:IIC通信协议

目录 1. IIC协议简介 1.1 主从模式 1.2 2根通信线 2. IIC协议时序 2.1 起始条件和终止条件 2.2 发送一个字节 2.3 接收一个字节 2.4 应答信号 1. IIC协议简介 IIC协议是一个半双工、同步、一主多从、多主多从的串行通用数据总线。该通信模式需要2根线&#xff1a;SCL、…

ubuntu22.04安装SecureCRT8.7.3,完成顺利使用

材料准备 scrt-sfx安装包 &#xff0c; securecrt_linux_crack.pl 补丁脚本&#xff0c;和两个依赖库 其中securecrt_linux_crack.pl是找的专门适合 8.7.3版本的&#xff0c;网上很多版本的crack.pl只能打补丁以前的老版本。 而更老版本的SecureCRT对ubuntu22支持更不好&#…

【低照度图像增强系列(8)】URetinex-Net算法详解与代码实现(2022|CVPR)

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标检…

hmallox勒索病毒科普:了解其威胁与防御策略

hmallox勒索病毒科普&#xff1a;了解其威胁与防御策略 一、引言 在数字化时代&#xff0c;网络安全威胁日益严峻&#xff0c;勒索病毒作为其中的一类恶意软件&#xff0c;给个人和企业带来了巨大损失。hmallox勒索病毒作为Mallox勒索软件家族的新变种&#xff0c;以其高度的…

求职学习笔记day1

自己一直算是一个内耗拖延的人&#xff0c;内耗着考了研&#xff0c;内耗着拖着不找工作&#xff0c;一直拖到了毕业。研究生没考上&#xff0c;工作没有&#xff0c;也羡慕着别人成功的生活&#xff0c;最后毕业的也不太开心。 一、最近总结 游戏 高考结束以来和大学期间作息…

数据结构之初始二叉树(2)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 二叉树的前置知识&#xff08;概念、性质、、遍历&#xff09; 通过上篇文章的学习&#xff0c;我们…

TCP/IP中的复用、分解和封装

TCP/IP&#xff08;传输控制协议/互联网协议&#xff09;模型中&#xff0c;复用&#xff08;Multiplexing&#xff09;、分解&#xff08;Demultiplexing&#xff09;和封装&#xff08;Encapsulation&#xff09;是关键概念&#xff0c;它们帮助管理和传输数据在网络上的有效…

【Linux】centos7安装PHP7.4报错:libzip版本过低

问题描述 configure: error: Package requirements (libzip > 0.11 libzip ! 1.3.1 libzip ! 1.7.0) were not met: checking for libzip > 0.11 libzip ! 1.3.1 libzip ! 1.7.0... no configure: error: Package requirements (libzip > 0.11 libzip ! 1.3.1 libzi…

Java中线程启动:start()与run()方法的区别

Java中线程启动&#xff1a;start&#xff08;&#xff09;与run&#xff08;&#xff09;方法的区别 1. start()方法2. run()方法3、总结4、示例对比 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 线程是并发执行的基本单位&#xff0c;而…

中科亿海微亮相慕尼黑上海电子展

7月8-10日&#xff0c;备受瞩目的全球电子行业盛会“慕尼黑上海电子展”以空前规模启幕&#xff0c;汇聚了超过1600家参展企业&#xff0c;涵盖了从终端产品制造商到元器件供应商、组装/系统供应商、EMS、ODM/OEM、材料供应商及生产设备供应商的完整产业链。中科亿海微电子科技…

《昇思25天学习打卡营第22天|基于MindSpore的GPT2文本摘要》

#学习打卡第22天# 1. 数据集 1.1 数据下载 使用nlpcc2017摘要数据&#xff0c;内容为新闻正文及其摘要&#xff0c;总计50000个样本。 from mindnlp.utils import http_get from mindspore.dataset import TextFileDataset# download dataset url https://download.mindspor…

活用 localStorage

我维护的这款工具 https://editor.yunwow.cn/ 已经帮我写了 7 篇文章了&#xff0c; 用起来很顺手&#xff0c;因此我打算再给它升级下让它更方便&#xff0c;我决定要给它加个本地缓存功能。我给它提的要求是&#xff1a; 1. 至少能缓存 5 篇文章 2. 能有选择的加载模板 3…

MySQL-对数据库和表的DDL命令

文章目录 一、什么是DDL操作二、数据库编码集和数据库校验集三、使用步骤对数据库的增删查改1.创建数据库2.进入数据库3.显示数据库4.修改数据库mysqldump 5.删除数据库 对表的增删查改1.添加/创建表2.插入表内容3.查看表查看所有表查看表结构查看表内容 4.修改表修改表的名字修…

融云:换头像=换人设?社交应用中隐秘而重要的「用户信息管理」

当代年轻人失眠三大原因&#xff0c;最近新上的《喜人奇妙夜》帮你找到了—— 基金绿了、吵架输了、前任头像换了。 当你半夜翻看前任的社交账号&#xff0c;一场盛大的失眠就开始了&#xff0c;就算古希腊掌柜睡眠的神躺你旁边也不好使。即便 Ta 没有更新内容&#xff0c;昵…

Redis 中String类型操作命令(命令演示,时间复杂度,返回值,注意事项)

String 类型 文章目录 String 类型set 命令get 命令mset 命令mget 命令get 和 mget 的区别incr 命令incrby 命令decr 命令decrby 命令incrbyfloat 命令append 命令getrange 命令setrange 命令 字符串类型是 Redis 中最基础的数据类型&#xff0c;在讲解命令之前&#xff0c;我们…